今天试了下使用dnspython来解析zone文件,然后把IP->Domain信息输出来。按照PTR格式输出到zone文件里面。
#!/usr/bin/env python2.7
import dns.zone
import dns.ipv4
import os.path
import sys
import string
import re
zonedir='/home/work/dns/var/named/zone/'
tempdir='/home/work/dns/script/'
master_zones=("zone1.xxx.com","zone2.xxx.com")
ptr_zones=("10.rev","172.rev")
class PTR:
def __init__(self,zones):
self.new_serial=dict()
self.reverse_map=dict()
for zonefile in zones:
filename=zonedir+zonefile
zone = dns.zone.from_file(filename,os.path.basename(filename),relativize=False)
for (name, ttl, rdata) in zone.iterate_rdatas('SOA'):
serial=str(rdata).split()[2] if serial > 0:
self.new_serial[zonefile]=int(serial)+1
if len(sys.argv) ==2 :
self.new_serial[zonefile]=int(sys.argv[1])
else: print “read old ptr zone file:%s err” % zonefile sys.exit(2)
def load_master_zone(self,zones): for zonefile in zones: filename=zonedir+zonefile
zone = dns.zone.from_file(filename,os.path.basename(filename),relativize=False)
for (name, ttl, rdata) in zone.iterate_rdatas('A'):
match=re.search(r’*.’,str(name)) if match: print “ignore *.xxx domain” continue
l = self.reverse_map.get(rdata.address)
if l is None:
self.reverse_map[rdata.address] = []
self.reverse_map[rdata.address].append(name)
def dump_ptr_zone(self,zones): fd=dict() for zone in zones: file=tempdir+zone fd[zone]=open(file,“w”) headtxt=’’’$TTL 86400 @ IN SOA dns1.xxx.com. pm.xxx.com. ( %s; Serial 60 ; Refresh 80 ; Retry 604800 ; Expire 6400 ) ; Minimum @ NS din-1 @ NS din-2 din-1 A 172.x.x.x
din-2 A 172.x.x.x\n''' %self.new_serial[zone]
fd[zone].write(headtxt) keys = self.reverse_map.keys() ipreg=re.compile("(\d+).(\d+).(\d+).(\d+)")
keys.sort(lambda a1, a2: cmp(dns.ipv4.inet_aton(a1), dns.ipv4.inet_aton(a2)))
for ip in keys: match=ipreg.search(ip) if not match: continue ip1=match.group(1) ip2=match.group(2) ip3=match.group(3) ip4=match.group(4) ptrzone="%s.rev"%ip1 fd_out=fd.get(ptrzone) if fd_out is not None: v = self.reverse_map[ip] v.sort() domains = map(str, v) for domain in domains: line="%s.%s.%s\tPTR\t%s\n" %(ip4,ip3,ip2,domain) fd_out.write(line) for zone in zones: fd[zone].close() def del(self): pass
ptr=PTR(ptr_zones) ptr.load_master_zone(master_zones) ptr.dump_ptr_zone(ptr_zones)