head	1.1;
branch	1.1.1;
access;
symbols
	netbsd-11-0-RC4:1.1.1.1
	netbsd-11-0-RC3:1.1.1.1
	netbsd-11-0-RC2:1.1.1.1
	netbsd-11-0-RC1:1.1.1.1
	nsd-4-14-0:1.1.1.1
	perseant-exfatfs-base-20250801:1.1.1.1
	netbsd-11:1.1.1.1.0.30
	netbsd-11-base:1.1.1.1
	netbsd-10-1-RELEASE:1.1.1.1
	perseant-exfatfs-base-20240630:1.1.1.1
	perseant-exfatfs:1.1.1.1.0.28
	perseant-exfatfs-base:1.1.1.1
	netbsd-8-3-RELEASE:1.1.1.1
	netbsd-9-4-RELEASE:1.1.1.1
	netbsd-10-0-RELEASE:1.1.1.1
	netbsd-10-0-RC6:1.1.1.1
	netbsd-10-0-RC5:1.1.1.1
	nsd-4-8-0:1.1.1.1
	netbsd-10-0-RC4:1.1.1.1
	netbsd-10-0-RC3:1.1.1.1
	netbsd-10-0-RC2:1.1.1.1
	netbsd-10-0-RC1:1.1.1.1
	netbsd-10:1.1.1.1.0.26
	netbsd-10-base:1.1.1.1
	nsd-4-6-0:1.1.1.1
	netbsd-9-3-RELEASE:1.1.1.1
	cjep_sun2x-base1:1.1.1.1
	cjep_sun2x:1.1.1.1.0.24
	cjep_sun2x-base:1.1.1.1
	cjep_staticlib_x-base1:1.1.1.1
	netbsd-9-2-RELEASE:1.1.1.1
	cjep_staticlib_x:1.1.1.1.0.22
	cjep_staticlib_x-base:1.1.1.1
	nsd-4-3-5:1.1.1.1
	netbsd-9-1-RELEASE:1.1.1.1
	phil-wifi-20200421:1.1.1.1
	phil-wifi-20200411:1.1.1.1
	is-mlppp:1.1.1.1.0.20
	is-mlppp-base:1.1.1.1
	phil-wifi-20200406:1.1.1.1
	netbsd-8-2-RELEASE:1.1.1.1
	netbsd-9-0-RELEASE:1.1.1.1
	netbsd-9-0-RC2:1.1.1.1
	nsd-4-2-4:1.1.1.1
	netbsd-9-0-RC1:1.1.1.1
	phil-wifi-20191119:1.1.1.1
	netbsd-9:1.1.1.1.0.18
	netbsd-9-base:1.1.1.1
	phil-wifi-20190609:1.1.1.1
	netbsd-8-1-RELEASE:1.1.1.1
	nsd-4-1-27:1.1.1.1
	netbsd-8-1-RC1:1.1.1.1
	nsd-4-1-26:1.1.1.1
	pgoyette-compat-merge-20190127:1.1.1.1
	pgoyette-compat-20190127:1.1.1.1
	pgoyette-compat-20190118:1.1.1.1
	pgoyette-compat-1226:1.1.1.1
	pgoyette-compat-1126:1.1.1.1
	pgoyette-compat-1020:1.1.1.1
	pgoyette-compat-0930:1.1.1.1
	pgoyette-compat-0906:1.1.1.1
	nsd-4-1-24:1.1.1.1
	pgoyette-compat-0728:1.1.1.1
	netbsd-8-0-RELEASE:1.1.1.1
	phil-wifi:1.1.1.1.0.16
	phil-wifi-base:1.1.1.1
	pgoyette-compat-0625:1.1.1.1
	netbsd-8-0-RC2:1.1.1.1
	pgoyette-compat-0521:1.1.1.1
	pgoyette-compat-0502:1.1.1.1
	pgoyette-compat-0422:1.1.1.1
	netbsd-8-0-RC1:1.1.1.1
	pgoyette-compat-0415:1.1.1.1
	pgoyette-compat-0407:1.1.1.1
	pgoyette-compat-0330:1.1.1.1
	pgoyette-compat-0322:1.1.1.1
	pgoyette-compat-0315:1.1.1.1
	pgoyette-compat:1.1.1.1.0.14
	pgoyette-compat-base:1.1.1.1
	nsd-4-1-19:1.1.1.1
	matt-nb8-mediatek:1.1.1.1.0.12
	matt-nb8-mediatek-base:1.1.1.1
	perseant-stdc-iso10646:1.1.1.1.0.10
	perseant-stdc-iso10646-base:1.1.1.1
	netbsd-8:1.1.1.1.0.8
	netbsd-8-base:1.1.1.1
	prg-localcount2-base3:1.1.1.1
	prg-localcount2-base2:1.1.1.1
	prg-localcount2-base1:1.1.1.1
	prg-localcount2:1.1.1.1.0.6
	prg-localcount2-base:1.1.1.1
	pgoyette-localcount-20170426:1.1.1.1
	bouyer-socketcan-base1:1.1.1.1
	pgoyette-localcount:1.1.1.1.0.4
	pgoyette-localcount-20170320:1.1.1.1
	bouyer-socketcan:1.1.1.1.0.2
	bouyer-socketcan-base:1.1.1.1
	nsd-4-1-14:1.1.1.1
	NLNETLABS:1.1.1;
locks; strict;
comment	@# @;


1.1
date	2017.01.07.19.42.02;	author christos;	state Exp;
branches
	1.1.1.1;
next	;
commitid	6nrLM8GsvcVnx4Bz;

1.1.1.1
date	2017.01.07.19.42.02;	author christos;	state Exp;
branches
	1.1.1.1.4.1;
next	;
commitid	6nrLM8GsvcVnx4Bz;

1.1.1.1.4.1
date	2017.01.07.19.42.02;	author pgoyette;	state dead;
branches;
next	1.1.1.1.4.2;
commitid	jjw7cAwgyKq7RfKz;

1.1.1.1.4.2
date	2017.03.20.06.56.05;	author pgoyette;	state Exp;
branches;
next	;
commitid	jjw7cAwgyKq7RfKz;


desc
@@


1.1
log
@Initial revision
@
text
@#!/usr/bin/env python
# Contributed 2006 by Stephane Bortzmeyer.
# Changed 20070102 by Wouter to handle primary zones and file names.

# Converts a nsd 2 "nsd.zones" file to a nsd 3 "nsd.conf" file.

# Change at will
nsd_zones_name = "./nsd.zones"
key_dir = "/local/nsd/etc/keys" # Directory holding the TSIG keys

import re
import os.path

primary_line_re = re.compile("^zone\s+([a-z0-9\.-]+)\s+([a-z0-9/\.-]+)\s*$", re.IGNORECASE)
secondary_line_re = re.compile("^zone\s+([a-z0-9\.-]+)\s+([a-z0-9/\.-]+)\s+masters\s+([0-9a-f:\. ]*)\s*$", re.IGNORECASE)
notify_line_re = re.compile("^zone\s+([a-z0-9\.-]+)\s+([a-z0-9/\.-]+)\s+notify\s+([0-9a-f:\. ]*)\s*$", re.IGNORECASE)
comment_re = re.compile("^\s*;")
empty_re = re.compile("^\s*$")
                        
nsd_zones = open(nsd_zones_name)
keys = {}
for line in nsd_zones.xreadlines():
    if comment_re.search(line) or empty_re.search(line):
	pass
    elif secondary_line_re.search(line):
    	match = secondary_line_re.search(line)
        zone = match.group(1)
        zonefile = match.group(2)
        master_group = match.group(3)
        masters = re.split("\s+", master_group)
        print """zone:
        name: "%s"
        zonefile: "%s"
        # This is to allow "nsdc update" to work.
        allow-notify: 127.0.0.1 NOKEY
        # This is a slave zone. Masters are listed below.""" % (zone, zonefile)
        for master in masters:
            if re.search("^\s*$", master):
                continue
            key_filename = "%s/%s.tsiginfo" % (key_dir, master)
            if os.path.exists(key_filename):
                key_content = open(key_filename)
                peer_ip = key_content.readline()
                peer_ip = peer_ip[:-1]
                key_name = key_content.readline()
                key_name = key_name[:-1]
                algorithm = key_content.readline()
                algorithm = int(algorithm[:-1])
                if algorithm == 157:
                    algorithm_name = "hmac-md5"
                else:
                    raise Exception("Unsupported TSIG algorithm %i" % algorithm)
                secret = key_content.readline()
                secret = secret[:-1]
                key_content.close()
                key = key_name
                keys[key_name] = {
                    'algorithm': algorithm_name,
                    'secret': secret}
            else:
                key = "NOKEY"
            print """        allow-notify: %s %s
        request-xfr: %s %s""" % (master, key, master, key)
        print ""
    elif primary_line_re.search(line):
	match = primary_line_re.search(line)
	zone = match.group(1)
	zonefile = match.group(2)
	print """zone:
	name: "%s"
	zonefile: "%s"
	""" % (zone, zonefile)
    elif notify_line_re.search(line):
    	match = notify_line_re.search(line)
        zone = match.group(1)
        zonefile = match.group(2)
        notify_group = match.group(3)
        notifies = re.split("\s+", notify_group)
        print """zone:
        name: "%s"
        zonefile: "%s"
        # This is a master zone. Slaves are listed below.""" % (zone, zonefile)
        for notify in notifies:
            if re.search("^\s*$", notify):
                continue
            key = "NOKEY"
            print """        notify: %s %s""" % (notify, key)
        print ""
    else:
	raise Exception("Invalid line \"%s\"" % line)
nsd_zones.close()
for key in keys.keys():
    print """key:
        name: "%s"
        algorithm: %s
        secret: "%s" """ % (key, keys[key]['algorithm'], keys[key]['secret'])
    print ""
    
## Local Variables: ##
## mode:python ##
## End: ##
@


1.1.1.1
log
@Import nsd
@
text
@@


1.1.1.1.4.1
log
@file nsd.zones2nsd.conf was added on branch pgoyette-localcount on 2017-03-20 06:56:05 +0000
@
text
@d1 101
@


1.1.1.1.4.2
log
@Sync with HEAD
@
text
@a0 101
#!/usr/bin/env python
# Contributed 2006 by Stephane Bortzmeyer.
# Changed 20070102 by Wouter to handle primary zones and file names.

# Converts a nsd 2 "nsd.zones" file to a nsd 3 "nsd.conf" file.

# Change at will
nsd_zones_name = "./nsd.zones"
key_dir = "/local/nsd/etc/keys" # Directory holding the TSIG keys

import re
import os.path

primary_line_re = re.compile("^zone\s+([a-z0-9\.-]+)\s+([a-z0-9/\.-]+)\s*$", re.IGNORECASE)
secondary_line_re = re.compile("^zone\s+([a-z0-9\.-]+)\s+([a-z0-9/\.-]+)\s+masters\s+([0-9a-f:\. ]*)\s*$", re.IGNORECASE)
notify_line_re = re.compile("^zone\s+([a-z0-9\.-]+)\s+([a-z0-9/\.-]+)\s+notify\s+([0-9a-f:\. ]*)\s*$", re.IGNORECASE)
comment_re = re.compile("^\s*;")
empty_re = re.compile("^\s*$")
                        
nsd_zones = open(nsd_zones_name)
keys = {}
for line in nsd_zones.xreadlines():
    if comment_re.search(line) or empty_re.search(line):
	pass
    elif secondary_line_re.search(line):
    	match = secondary_line_re.search(line)
        zone = match.group(1)
        zonefile = match.group(2)
        master_group = match.group(3)
        masters = re.split("\s+", master_group)
        print """zone:
        name: "%s"
        zonefile: "%s"
        # This is to allow "nsdc update" to work.
        allow-notify: 127.0.0.1 NOKEY
        # This is a slave zone. Masters are listed below.""" % (zone, zonefile)
        for master in masters:
            if re.search("^\s*$", master):
                continue
            key_filename = "%s/%s.tsiginfo" % (key_dir, master)
            if os.path.exists(key_filename):
                key_content = open(key_filename)
                peer_ip = key_content.readline()
                peer_ip = peer_ip[:-1]
                key_name = key_content.readline()
                key_name = key_name[:-1]
                algorithm = key_content.readline()
                algorithm = int(algorithm[:-1])
                if algorithm == 157:
                    algorithm_name = "hmac-md5"
                else:
                    raise Exception("Unsupported TSIG algorithm %i" % algorithm)
                secret = key_content.readline()
                secret = secret[:-1]
                key_content.close()
                key = key_name
                keys[key_name] = {
                    'algorithm': algorithm_name,
                    'secret': secret}
            else:
                key = "NOKEY"
            print """        allow-notify: %s %s
        request-xfr: %s %s""" % (master, key, master, key)
        print ""
    elif primary_line_re.search(line):
	match = primary_line_re.search(line)
	zone = match.group(1)
	zonefile = match.group(2)
	print """zone:
	name: "%s"
	zonefile: "%s"
	""" % (zone, zonefile)
    elif notify_line_re.search(line):
    	match = notify_line_re.search(line)
        zone = match.group(1)
        zonefile = match.group(2)
        notify_group = match.group(3)
        notifies = re.split("\s+", notify_group)
        print """zone:
        name: "%s"
        zonefile: "%s"
        # This is a master zone. Slaves are listed below.""" % (zone, zonefile)
        for notify in notifies:
            if re.search("^\s*$", notify):
                continue
            key = "NOKEY"
            print """        notify: %s %s""" % (notify, key)
        print ""
    else:
	raise Exception("Invalid line \"%s\"" % line)
nsd_zones.close()
for key in keys.keys():
    print """key:
        name: "%s"
        algorithm: %s
        secret: "%s" """ % (key, keys[key]['algorithm'], keys[key]['secret'])
    print ""
    
## Local Variables: ##
## mode:python ##
## End: ##
@


