2020-10-16 21:02:47 +00:00
|
|
|
from bundlewrap.exceptions import NoSuchGroup
|
|
|
|
|
2020-10-13 17:06:22 +00:00
|
|
|
defaults = {
|
|
|
|
'apt': {
|
|
|
|
'packages': {
|
|
|
|
'pdns-server': {},
|
|
|
|
'pdns-tools': {},
|
|
|
|
'pdns-backend-bind': {},
|
|
|
|
'pdns-backend-pgsql': {},
|
|
|
|
},
|
|
|
|
},
|
2020-10-16 15:44:31 +00:00
|
|
|
'powerdns': {
|
|
|
|
'api_key': repo.vault.password_for('{} powerdns api'.format(node.name)),
|
|
|
|
},
|
2020-10-13 17:06:22 +00:00
|
|
|
'postgresql': {
|
|
|
|
'users': {
|
|
|
|
'powerdns': {
|
|
|
|
'password': repo.vault.password_for('{} postgresql powerdns'.format(node.name)),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
'databases': {
|
|
|
|
'powerdns': {
|
|
|
|
'owner': 'powerdns',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
2020-10-16 21:02:47 +00:00
|
|
|
|
|
|
|
|
2020-10-25 09:53:55 +00:00
|
|
|
@metadata_reactor
|
|
|
|
def get_ips_of_secondary_nameservers(metadata):
|
|
|
|
if metadata.get('powerdns/is_secondary', False):
|
|
|
|
return {}
|
|
|
|
|
|
|
|
ips = set()
|
|
|
|
for rnode in repo.nodes_in_group('dns'):
|
|
|
|
if rnode.metadata.get('powerdns/is_secondary', False):
|
|
|
|
ips.update({
|
|
|
|
str(ip) for ip in repo.libs.tools.resolve_identifier(repo, rnode.name)
|
|
|
|
})
|
|
|
|
|
|
|
|
return {
|
|
|
|
'powerdns': {
|
|
|
|
'my_secondary_servers': ips,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2020-10-16 21:02:47 +00:00
|
|
|
@metadata_reactor
|
2020-10-17 10:56:17 +00:00
|
|
|
def get_ips_of_primary_nameservers(metadata):
|
|
|
|
if not metadata.get('powerdns/is_secondary', False):
|
2020-10-16 21:02:47 +00:00
|
|
|
return {}
|
|
|
|
|
2020-10-17 10:56:17 +00:00
|
|
|
ips = set()
|
|
|
|
for rnode in repo.nodes_in_group('dns'):
|
|
|
|
if not rnode.metadata.get('powerdns/is_secondary', False):
|
|
|
|
ips.update({
|
|
|
|
str(ip) for ip in repo.libs.tools.resolve_identifier(repo, rnode.name)
|
|
|
|
})
|
2020-10-16 21:02:47 +00:00
|
|
|
|
|
|
|
return {
|
|
|
|
'powerdns': {
|
2020-10-25 09:53:55 +00:00
|
|
|
'my_primary_servers': ips,
|
2020-10-16 21:02:47 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@metadata_reactor
|
2020-10-17 10:57:35 +00:00
|
|
|
def generate_dns_entries_for_nodes(metadata):
|
|
|
|
results = set()
|
2020-10-16 21:02:47 +00:00
|
|
|
|
|
|
|
for rnode in repo.nodes:
|
2020-10-17 10:57:35 +00:00
|
|
|
node_name_split = rnode.name.split('.')
|
|
|
|
node_name_split.reverse()
|
|
|
|
dns_name = '.'.join(node_name_split)
|
|
|
|
ip4 = None
|
|
|
|
ip6 = None
|
2020-10-16 21:02:47 +00:00
|
|
|
|
2020-10-17 10:57:35 +00:00
|
|
|
# We only need this for GCE, because machines over there don't
|
|
|
|
# have a public ipv4 address.
|
|
|
|
if rnode.metadata.get('external_ipv4', None):
|
|
|
|
ip4 = rnode.metadata.get('external_ipv4')
|
|
|
|
|
|
|
|
for iface, config in sorted(rnode.metadata.get('interfaces', {}).items()):
|
|
|
|
if not ip4 and 'ipv4' in config:
|
|
|
|
ip4 = sorted(config['ipv4'])[0]
|
|
|
|
|
|
|
|
if not ip6 and 'ipv6' in config:
|
|
|
|
ip6 = sorted(config['ipv6'])[0]
|
|
|
|
|
|
|
|
if ip4:
|
|
|
|
results.add('{} IN A {}'.format(dns_name, ip4))
|
2020-10-16 21:02:47 +00:00
|
|
|
|
2020-10-17 10:57:35 +00:00
|
|
|
if ip6:
|
|
|
|
results.add('{} IN AAAA {}'.format(dns_name, ip6))
|
|
|
|
|
|
|
|
return {
|
|
|
|
'powerdns': {
|
|
|
|
'bind-zones': {
|
|
|
|
'kunbox.net': {
|
|
|
|
'records': results,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|