1 #!/usr/bin/env python 2 # Contributed 2006 by Stephane Bortzmeyer. 3 # Changed 20070102 by Wouter to handle primary zones and file names. 4 5 # Converts a nsd 2 "nsd.zones" file to a nsd 3 "nsd.conf" file. 6 7 # Change at will 8 nsd_zones_name = "./nsd.zones" 9 key_dir = "/local/nsd/etc/keys" # Directory holding the TSIG keys 10 11 import re 12 import os.path 13 14 primary_line_re = re.compile("^zone\s+([a-z0-9\.-]+)\s+([a-z0-9/\.-]+)\s*$", re.IGNORECASE) 15 secondary_line_re = re.compile("^zone\s+([a-z0-9\.-]+)\s+([a-z0-9/\.-]+)\s+masters\s+([0-9a-f:\. ]*)\s*$", re.IGNORECASE) 16 notify_line_re = re.compile("^zone\s+([a-z0-9\.-]+)\s+([a-z0-9/\.-]+)\s+notify\s+([0-9a-f:\. ]*)\s*$", re.IGNORECASE) 17 comment_re = re.compile("^\s*;") 18 empty_re = re.compile("^\s*$") 19 20 nsd_zones = open(nsd_zones_name) 21 keys = {} 22 for line in nsd_zones.xreadlines(): 23 if comment_re.search(line) or empty_re.search(line): 24 pass 25 elif secondary_line_re.search(line): 26 match = secondary_line_re.search(line) 27 zone = match.group(1) 28 zonefile = match.group(2) 29 master_group = match.group(3) 30 masters = re.split("\s+", master_group) 31 print """zone: 32 name: "%s" 33 zonefile: "%s" 34 # This is to allow "nsdc update" to work. 35 allow-notify: 127.0.0.1 NOKEY 36 # This is a slave zone. Masters are listed below.""" % (zone, zonefile) 37 for master in masters: 38 if re.search("^\s*$", master): 39 continue 40 key_filename = "%s/%s.tsiginfo" % (key_dir, master) 41 if os.path.exists(key_filename): 42 key_content = open(key_filename) 43 peer_ip = key_content.readline() 44 peer_ip = peer_ip[:-1] 45 key_name = key_content.readline() 46 key_name = key_name[:-1] 47 algorithm = key_content.readline() 48 algorithm = int(algorithm[:-1]) 49 if algorithm == 157: 50 algorithm_name = "hmac-md5" 51 else: 52 raise Exception("Unsupported TSIG algorithm %i" % algorithm) 53 secret = key_content.readline() 54 secret = secret[:-1] 55 key_content.close() 56 key = key_name 57 keys[key_name] = { 58 'algorithm': algorithm_name, 59 'secret': secret} 60 else: 61 key = "NOKEY" 62 print """ allow-notify: %s %s 63 request-xfr: %s %s""" % (master, key, master, key) 64 print "" 65 elif primary_line_re.search(line): 66 match = primary_line_re.search(line) 67 zone = match.group(1) 68 zonefile = match.group(2) 69 print """zone: 70 name: "%s" 71 zonefile: "%s" 72 """ % (zone, zonefile) 73 elif notify_line_re.search(line): 74 match = notify_line_re.search(line) 75 zone = match.group(1) 76 zonefile = match.group(2) 77 notify_group = match.group(3) 78 notifies = re.split("\s+", notify_group) 79 print """zone: 80 name: "%s" 81 zonefile: "%s" 82 # This is a master zone. Slaves are listed below.""" % (zone, zonefile) 83 for notify in notifies: 84 if re.search("^\s*$", notify): 85 continue 86 key = "NOKEY" 87 print """ notify: %s %s""" % (notify, key) 88 print "" 89 else: 90 raise Exception("Invalid line \"%s\"" % line) 91 nsd_zones.close() 92 for key in keys.keys(): 93 print """key: 94 name: "%s" 95 algorithm: %s 96 secret: "%s" """ % (key, keys[key]['algorithm'], keys[key]['secret']) 97 print "" 98 99 ## Local Variables: ## 100 ## mode:python ## 101 ## End: ## 102