|
|
00bb8e6 |
#!/usr/bin/env python
|
|
|
00bb8e6 |
# Contributed 2006 by Stephane Bortzmeyer.
|
|
|
00bb8e6 |
# Changed 20070102 by Wouter to handle primary zones and file names.
|
|
|
00bb8e6 |
|
|
|
00bb8e6 |
# Converts a nsd 2 "nsd.zones" file to a nsd 3 "nsd.conf" file.
|
|
|
00bb8e6 |
|
|
|
00bb8e6 |
# Change at will
|
|
|
00bb8e6 |
nsd_zones_name = "/etc/nsd.zones"
|
|
|
00bb8e6 |
key_dir = "/etc/nsd/keys" # Directory holding the TSIG keys
|
|
|
00bb8e6 |
|
|
|
00bb8e6 |
import re
|
|
|
00bb8e6 |
import os.path
|
|
|
00bb8e6 |
|
|
|
00bb8e6 |
primary_line_re = re.compile("^zone\s+([a-z0-9\.-]+)\s+([a-z0-9/\.-]+)\s*$", re.IGNORECASE)
|
|
|
00bb8e6 |
secondary_line_re = re.compile("^zone\s+([a-z0-9\.-]+)\s+([a-z0-9/\.-]+)\s+masters\s+([0-9a-f:\. ]*)\s*$", re.IGNORECASE)
|
|
|
00bb8e6 |
notify_line_re = re.compile("^zone\s+([a-z0-9\.-]+)\s+([a-z0-9/\.-]+)\s+notify\s+([0-9a-f:\. ]*)\s*$", re.IGNORECASE)
|
|
|
00bb8e6 |
comment_re = re.compile("^\s*;")
|
|
|
00bb8e6 |
empty_re = re.compile("^\s*$")
|
|
|
00bb8e6 |
|
|
|
00bb8e6 |
nsd_zones = open(nsd_zones_name)
|
|
|
00bb8e6 |
keys = {}
|
|
|
00bb8e6 |
for line in nsd_zones.xreadlines():
|
|
|
00bb8e6 |
if comment_re.search(line) or empty_re.search(line):
|
|
|
00bb8e6 |
pass
|
|
|
00bb8e6 |
elif secondary_line_re.search(line):
|
|
|
00bb8e6 |
match = secondary_line_re.search(line)
|
|
|
00bb8e6 |
zone = match.group(1)
|
|
|
00bb8e6 |
zonefile = match.group(2)
|
|
|
00bb8e6 |
master_group = match.group(3)
|
|
|
00bb8e6 |
masters = re.split("\s+", master_group)
|
|
|
00bb8e6 |
print """zone:
|
|
|
00bb8e6 |
name: "%s"
|
|
|
00bb8e6 |
zonefile: "%s"
|
|
|
00bb8e6 |
# This is to allow "nsdc update" to work.
|
|
|
00bb8e6 |
allow-notify: 127.0.0.1 NOKEY
|
|
|
00bb8e6 |
# This is a slave zone. Masters are listed below.""" % (zone, zonefile)
|
|
|
00bb8e6 |
for master in masters:
|
|
|
00bb8e6 |
if re.search("^\s*$", master):
|
|
|
00bb8e6 |
continue
|
|
|
00bb8e6 |
key_filename = "%s/%s.tsiginfo" % (key_dir, master)
|
|
|
00bb8e6 |
if os.path.exists(key_filename):
|
|
|
00bb8e6 |
key_content = open(key_filename)
|
|
|
00bb8e6 |
peer_ip = key_content.readline()
|
|
|
00bb8e6 |
peer_ip = peer_ip[:-1]
|
|
|
00bb8e6 |
key_name = key_content.readline()
|
|
|
00bb8e6 |
key_name = key_name[:-1]
|
|
|
00bb8e6 |
algorithm = key_content.readline()
|
|
|
00bb8e6 |
algorithm = int(algorithm[:-1])
|
|
|
00bb8e6 |
if algorithm == 157:
|
|
|
00bb8e6 |
algorithm_name = "hmac-md5"
|
|
|
00bb8e6 |
else:
|
|
|
00bb8e6 |
raise Exception("Unsupported TSIG algorithm %i" % algorithm)
|
|
|
00bb8e6 |
secret = key_content.readline()
|
|
|
00bb8e6 |
secret = secret[:-1]
|
|
|
00bb8e6 |
key_content.close()
|
|
|
00bb8e6 |
key = key_name
|
|
|
00bb8e6 |
keys[key_name] = {
|
|
|
00bb8e6 |
'algorithm': algorithm_name,
|
|
|
00bb8e6 |
'secret': secret}
|
|
|
00bb8e6 |
else:
|
|
|
00bb8e6 |
key = "NOKEY"
|
|
|
00bb8e6 |
print """ allow-notify: %s %s
|
|
|
00bb8e6 |
request-xfr: %s %s""" % (master, key, master, key)
|
|
|
00bb8e6 |
print ""
|
|
|
00bb8e6 |
elif primary_line_re.search(line):
|
|
|
00bb8e6 |
match = primary_line_re.search(line)
|
|
|
00bb8e6 |
zone = match.group(1)
|
|
|
00bb8e6 |
zonefile = match.group(2)
|
|
|
00bb8e6 |
print """zone:
|
|
|
00bb8e6 |
name: "%s"
|
|
|
00bb8e6 |
zonefile: "%s"
|
|
|
00bb8e6 |
""" % (zone, zonefile)
|
|
|
00bb8e6 |
elif notify_line_re.search(line):
|
|
|
00bb8e6 |
match = notify_line_re.search(line)
|
|
|
00bb8e6 |
zone = match.group(1)
|
|
|
00bb8e6 |
zonefile = match.group(2)
|
|
|
00bb8e6 |
notify_group = match.group(3)
|
|
|
00bb8e6 |
notifies = re.split("\s+", notify_group)
|
|
|
00bb8e6 |
print """zone:
|
|
|
00bb8e6 |
name: "%s"
|
|
|
00bb8e6 |
zonefile: "%s"
|
|
|
00bb8e6 |
# This is a master zone. Slaves are listed below.""" % (zone, zonefile)
|
|
|
00bb8e6 |
for notify in notifies:
|
|
|
00bb8e6 |
if re.search("^\s*$", notify):
|
|
|
00bb8e6 |
continue
|
|
|
00bb8e6 |
key = "NOKEY"
|
|
|
00bb8e6 |
print """ notify: %s %s""" % (notify, key)
|
|
|
00bb8e6 |
print ""
|
|
|
00bb8e6 |
else:
|
|
|
00bb8e6 |
raise Exception("Invalid line \"%s\"" % line)
|
|
|
00bb8e6 |
nsd_zones.close()
|
|
|
00bb8e6 |
for key in keys.keys():
|
|
|
00bb8e6 |
print """key:
|
|
|
00bb8e6 |
name: "%s"
|
|
|
00bb8e6 |
algorithm: %s
|
|
|
00bb8e6 |
secret: "%s" """ % (key, keys[key]['algorithm'], keys[key]['secret'])
|
|
|
00bb8e6 |
print ""
|
|
|
00bb8e6 |
|
|
|
00bb8e6 |
## Local Variables: ##
|
|
|
00bb8e6 |
## mode:python ##
|
|
|
00bb8e6 |
## End: ##
|