DNS/実装/python/dnslib/ゾーンサーバー/zone.pyについて、ここに記述してください。
zone.txtにあるゾーンファイルを読み込んで、ちょっとした検査をする。 -- ToshinoriMaeno 2016-08-10 05:50:26
classを使って、ゾーンサーバで利用可能な形に書き換え中。
1 #!/usr/bin/env python
2 from sets import Set
3
4 import dnslib
5 from dnslib import QTYPE, SOA, NS, A, AAAA, MX, CNAME
6 from dnslib import DNSRecord, DNSHeader, RR, RCODE
7
8 #---------------- read zone -----------------------
9 zone = {} #Dict; key is a domain name
10 #value: Dict for rtype
11 # value: RRSet
12 cuts = Set([]) # delegation point; Set
13
14 # ---- open zone data -------
15 zonetxt = open('zone.txt').read()
16 #print(zonetxt)
17
18 z = '' # zone name
19 for rr in RR.fromZone(zonetxt):
20 name = str(rr.rname)
21 if not(name in zone) : #new name
22 zone[name] = {} # make empty node
23 elif rr.rtype == QTYPE.CNAME :
24 print 'CNAME error', zone[name], rr
25
26 if QTYPE.CNAME in zone[name]: # CNAME exists
27 print 'CNAME error', zone[name], rr
28 if not(rr.rtype in zone[name]): # new rtype -> rrset
29 zone[name][rr.rtype] = Set([]) # empty query type
30 zone[name][rr.rtype].add(rr)
31
32 if rr.rtype == QTYPE.SOA :
33 if z == '':
34 z = name
35 print 'SOA == ', z, zone[name]
36 else :
37 print 'SOA duplicate ', z, name
38
39 if len(z)==0 :
40 print 'No zone found'
41 exit
42
43 print '----------------'
44
45 zsuffix = '.'+ z
46 #----- remove out of zone name ------
47 for name in zone:
48 if not (name== z or name.endswith(zsuffix)) :
49 delete(zone[name])
50 print 'Out of zone record',
51 print name, (zone[name])
52
53 rrs = zone[z] # zone apex node
54 if QTYPE.SOA in rrs:
55 soa_record = rrs[QTYPE.SOA].copy().pop()
56 ns_record = rrs[QTYPE.NS]
57
58 print '---- zone apex record ----'
59 print 'zone name ', z
60 print zone[z]
61 print '-----'
62 print 'SOA = ',soa_record
63 print 'NS = ', ns_record
64
65 # delegation list
66 for name in zone:
67 if name == z : continue
68 if QTYPE.NS in zone[name]:
69 cuts.add(name)
70 print 'cut found: ', name
71 print 'cuts =', cuts
72
73 print '-------- Zone processed ---------'