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