On 10/29/2010 04:13 PM, CT wrote:
Looking to write a script to create the PTR records.. Not much on the Web..
DOM style manipulation using dnspython. It can fully parse a RFC style zone file including following $INCLUDE statements.
I've been planning on just having it do nsupdate calls rather than outputing text and allowing it to read in an arbitrary number of zones either from stdin or via a zone transfer.
Python script attached. -- Russell A Jackson <r...@csub.edu> Network Analyst California State University, Bakersfield
#!/usr/bin/env python import sys import time import dns.zone import dns.name import dns.rdataclass import dns.rdatatype from dns.node import Node from dns.rdataset import from_rdata as rdataset_from_rdata from dns.rdataset import from_rdata_list as rdataset_from_rdata_list from dns.rdtypes.ANY.PTR import PTR from dns.rdtypes.ANY.SOA import SOA from dns.rdtypes.ANY.NS import NS from dns.zone import Zone from dns.zone import from_file as zone_from_file # # Terrible hack. Multiple A records for the same address will result in # ambiguity. List the ones we don't want PTRs for here. # IGNORE = ( dns.name.from_text('ignore.domain'), ) NAME_SERVERS = ( dns.name.from_text('ns0.domain'), ) TTL = 1 * 60 * 60 # 1h SOA_REFRESH = 24 * 60 * 60 # 24h SOA_RETRY = 2 * 60 * 60 # 2h SOA_EXPIRE = 24 * 60 * 60 # 24h SOA_MINIMUM = 24 * 60 * 60 # 24h SOA_RESPONSIBLE = 'noc.domain' def usage(): print """usage: %s <input_origin> <input_filename> <output_origin>""" % sys.argv[0] sys.exit(1) def main(argv): try: input_origin = argv[1] input_filename = argv[2] output_origin = argv[3] except IndexError: usage() fwd_zone = zone_from_file(input_filename, input_origin, relativize=False) rev_zone = Zone(dns.name.from_text(output_origin)) node = Node() soa = SOA( dns.rdataclass.IN, dns.rdatatype.SOA, dns.name.from_text(SOA_RESPONSIBLE), int(time.time()), SOA_EXPIRE, SOA_MINIMUM, SOA_REFRESH, SOA_RETRY, ) node.rdatasets.append(rdataset_from_rdata(TTL, soa)) ns_rdata = [] for nameserver in NAME_SERVERS: ns_rdata.append( NS( dns.rdataclass.IN, dns.rdatatype.NS, nameserver, ) ) node.rdatasets.append(rdataset_from_rdata_list(TTL, ns_rdata)) rev_zone[rev_zone.origin] = node for name, rdataset in fwd_zone.iterate_rdatasets('A'): # PTRs can't point to wildcard records if '*' in name or name in IGNORE: continue ip = rdataset.items[0].address ptr = PTR(dns.rdataclass.IN, dns.rdatatype.PTR, name) ptr_name_parts = ip.split('.') ptr_name_parts.reverse() ptr_name_parts.extend(('in-addr', 'arpa')) ptr_name = dns.name.from_text('.'.join(ptr_name_parts)) node = Node() node.rdatasets.append(rdataset_from_rdata(TTL, ptr)) try: rev_zone[ptr_name] = node except KeyError: continue rev_zone.to_file(sys.stdout) if __name__ == '__main__': main(sys.argv)
_______________________________________________ bind-users mailing list bind-users@lists.isc.org https://lists.isc.org/mailman/listinfo/bind-users