使用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 &gt; 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)
此条目发表在python分类目录。将固定链接加入收藏夹。