使用dnspython解析zone文件生成反解记录

今天试了下使用dnspython来解析zone文件,然后把IP->Domain信息输出来。按照PTR格式输出到zone文件里面。

<br />#!/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)