On 11/01/2010 11:56 AM, Russell Jackson wrote:
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.

Crap. Mixed tab/space indention. Fixed.

I noticed someone brought up AAAA records in the other subthread. I believe pythondns handles those so it wouldn't be difficult to add support for them.

--
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

Reply via email to