from datetime import datetime from os import listdir from os.path import isfile, join from subprocess import check_output zone_path = join(repo.path, 'data', 'powerdns', 'files', 'bind-zones') ZONE_HEADER = """ ; _ ____ _ _ _____ _ _ _ _ ____ ; / \\ / ___| | | |_ _| | | | \\ | |/ ___| ; / _ \\| | | |_| | | | | | | | \\| | | _ ; / ___ \\ |___| _ | | | | |_| | |\\ | |_| | ; /_/ \\_\\____|_| |_| |_| \\___/|_| \\_|\\____| ; ; --> Diese Datei wird von BundleWrap verwaltet! <-- $TTL 60 @ IN SOA ns-1.kunbox.net. hostmaster.kunbox.net. ( {serial} 3600 3600 86400 300 ) @ IN NS bind01.gce.kunbox.net. IN NS b.ns14.net. IN NS c.ns14.net. IN NS d.ns14.net. """ directories = { '/etc/powerdns/pdns.d': { 'purge': True, 'needs': { 'pkg_apt:pdns-server', 'pkg_apt:pdns-backend-bind', 'pkg_apt:pdns-backend-pgsql', }, 'triggers': { 'svc_systemd:pdns:restart', }, }, '/var/lib/powerdns/zones': { 'purge': True, 'needs': { 'pkg_apt:pdns-backend-bind', }, } } files = { '/etc/powerdns/pdns.conf': { 'content_type': 'mako', 'context': { 'api_key': node.metadata['powerdns']['api_key'], }, 'needs': { 'pkg_apt:pdns-server', }, 'triggers': { 'svc_systemd:pdns:restart', }, }, } svc_systemd = { 'pdns': { 'needs': { 'directory:', 'file:', 'pkg_apt:pdns-server', 'pkg_apt:pdns-backend-bind', 'pkg_apt:pdns-backend-pgsql', }, }, } if node.metadata['powerdns'].get('features', {}).get('bind', False): primary_zones = set() for zone in listdir(zone_path): if not isfile(join(zone_path, zone)) or zone.startswith(".") or zone.startswith("_"): continue try: output = check_output(['git', 'log', '-1', '--pretty=%ci', join(zone_path, zone)]).decode('utf-8').strip() serial = datetime.strptime(output, '%Y-%m-%d %H:%M:%S %z').strftime('%y%m%d%H%M') except: serial = datetime.now().strftime('%y%m%d0000') primary_zones.add(zone) files["/var/lib/powerdns/zones/{}".format(zone)] = { 'content_type': 'mako', 'context': { 'header': ZONE_HEADER.format(serial=serial), 'metadata_records': node.metadata.get('powerdns', {}).get('bind-zones', {}).get(zone, {}).get('records', []), }, 'source': 'bind-zones/{}'.format(zone), 'triggers': { 'svc_systemd:pdns:reload', }, } files['/etc/powerdns/pdns.d/bind.conf'] = { 'needs': { 'pkg_apt:pdns-backend-bind', }, 'triggers': { 'svc_systemd:pdns:restart', }, } files['/etc/powerdns/named.conf'] = { 'content_type': 'mako', 'context': { 'zones': primary_zones, }, 'needs': { 'pkg_apt:pdns-backend-bind', }, 'triggers': { 'svc_systemd:pdns:reload', }, } if node.metadata['powerdns'].get('features', {}).get('pgsql', False): files['/etc/powerdns/pdns.d/pgsql.conf'] = { 'content_type': 'mako', 'context': { 'password': node.metadata['postgresql']['users']['powerdns']['password'], }, 'needs': { 'pkg_apt:pdns-backend-pgsql', }, 'triggers': { 'svc_systemd:pdns:restart', }, } files['/etc/powerdns/schema.pgsql.sql'] = {} actions = { 'powerdns_load_pgsql_schema': { 'command': 'PGPASSWORD={pw} psql -h 127.0.0.1 -d powerdns -U powerdns -w < /etc/powerdns/schema.pgsql.sql'.format(pw=node.metadata['postgresql']['users']['powerdns']['password']), 'unless': 'sudo -u postgres psql -d powerdns -c "\dt" | grep domains 2>&1 >/dev/null', 'needs': { 'bundle:postgresql', 'file:/etc/powerdns/schema.pgsql.sql', }, 'needed_by': { 'svc_systemd:pdns', }, } }