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 ---------'