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