## page was renamed from DNS/実装/python/dnslib/ゾーンサーバー/zone.py DNS/実装/python/dnslib/ゾーンサーバー/zone.pyについて、ここに記述してください。 zone.txtにあるゾーンファイルを読み込んで、ちょっとした検査をする。 -- ToshinoriMaeno <> classを使って、ゾーンサーバで利用可能な形に書き換え中。 {{{#!python #!/usr/bin/env python from sets import Set import dnslib from dnslib import QTYPE, SOA, NS, A, AAAA, MX, CNAME from dnslib import DNSRecord, DNSHeader, RR, RCODE #---------------- read zone ----------------------- zone = {} #Dict; key is a domain name #value: Dict for rtype # value: RRSet cuts = Set([]) # delegation point; Set # ---- open zone data ------- zonetxt = open('zone.txt').read() #print(zonetxt) z = '' # zone name for rr in RR.fromZone(zonetxt): name = str(rr.rname) if not(name in zone) : #new name zone[name] = {} # make empty node elif rr.rtype == QTYPE.CNAME : print 'CNAME error', zone[name], rr if QTYPE.CNAME in zone[name]: # CNAME exists print 'CNAME error', zone[name], rr if not(rr.rtype in zone[name]): # new rtype -> rrset zone[name][rr.rtype] = Set([]) # empty query type zone[name][rr.rtype].add(rr) if rr.rtype == QTYPE.SOA : if z == '': z = name print 'SOA == ', z, zone[name] else : print 'SOA duplicate ', z, name if len(z)==0 : print 'No zone found' exit print '----------------' zsuffix = '.'+ z #----- remove out of zone name ------ for name in zone: if not (name== z or name.endswith(zsuffix)) : delete(zone[name]) print 'Out of zone record', print name, (zone[name]) rrs = zone[z] # zone apex node if QTYPE.SOA in rrs: soa_record = rrs[QTYPE.SOA].copy().pop() ns_record = rrs[QTYPE.NS] print '---- zone apex record ----' print 'zone name ', z print zone[z] print '-----' print 'SOA = ',soa_record print 'NS = ', ns_record # delegation list for name in zone: if name == z : continue if QTYPE.NS in zone[name]: cuts.add(name) print 'cut found: ', name print 'cuts =', cuts print '-------- Zone processed ---------' }}}