Compare commits

..

No commits in common. "6e9610d797797b73b60c2f90ea6c45b639bd35cf" and "10eaaa7e128add2146c3994300d47e293a1855c4" have entirely different histories.

4 changed files with 19 additions and 9 deletions

View file

@ -1,4 +1,5 @@
from ipaddress import ip_interface from ipaddress import ip_interface
hdict, hlist = repo.libs.hashable.hdict, repo.libs.hashable.hlist
defaults = { defaults = {
@ -75,9 +76,9 @@ def collect_records(metadata):
for type, values in records.items(): for type, values in records.items():
for value in values: for value in values:
zones\ zones\
.setdefault(zone, [])\ .setdefault(zone, set())\
.append( .add(
{'name': name, 'type': type, 'value': value} hdict({'name': name, 'type': type, 'value': value})
) )
return { return {
@ -104,10 +105,10 @@ def ns_records(metadata):
return { return {
'bind': { 'bind': {
'zones': { 'zones': {
zone: [ zone: {
{'name': '@', 'type': 'NS', 'value': f"{nameserver}."} hdict({'name': '@', 'type': 'NS', 'value': f"{nameserver}."})
for nameserver in nameservers for nameserver in nameservers
] for zone in metadata.get('bind/zones').keys() } for zone in metadata.get('bind/zones').keys()
}, },
}, },
} }

View file

@ -90,10 +90,10 @@ def systemd_networkd_netdevs(metadata):
'Endpoint': config['endpoint'], 'Endpoint': config['endpoint'],
'PublicKey': config['pubkey'], 'PublicKey': config['pubkey'],
'PresharedKey': config['psk'], 'PresharedKey': config['psk'],
'AllowedIPs': ', '.join(sorted([ 'AllowedIPs': ', '.join([
str(ip_interface(repo.get_node(peer).metadata.get(f'wireguard/my_ip')).ip), str(ip_interface(repo.get_node(peer).metadata.get(f'wireguard/my_ip')).ip),
*config.get('route', []), *config.get('route', []),
])), # FIXME ]), # FIXME
'PersistentKeepalive': 30, 'PersistentKeepalive': 30,
} }
}) })

9
libs/hashable.py Normal file
View file

@ -0,0 +1,9 @@
import json
class hdict(dict):
def __hash__(self):
return hash(json.dumps(self, sorted=True))
class hlist(list):
def __hash__(self):
return hash(json.dumps(self, sorted=True))

View file

@ -9,7 +9,7 @@ template = '''
[${segment.split('#')[0]}] [${segment.split('#')[0]}]
% for option, value in sorted(options.items()): % for option, value in sorted(options.items()):
% if isinstance(value, dict): % if isinstance(value, dict):
% for k, v in sorted(value.items()): % for k, v in value.items():
${option}=${k}=${v} ${option}=${k}=${v}
% endfor % endfor
% elif isinstance(value, (list, set, tuple)): % elif isinstance(value, (list, set, tuple)):