今天试了下使用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)