1#!/usr/bin/python 2# vim:fileencoding=utf-8 3# 4# AXFR client with IDN (Internationalized Domain Names) support 5# 6 7import ldns 8import encodings.idna 9 10def utf2name(name): 11 return '.'.join([encodings.idna.ToASCII(a) for a in name.split('.')]) 12def name2utf(name): 13 return '.'.join([encodings.idna.ToUnicode(a) for a in name.split('.')]) 14 15 16resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf") 17 18#addr = ldns.ldns_get_rr_list_addr_by_name(resolver, "zone.nic.cz", ldns.LDNS_RR_CLASS_IN, ldns.LDNS_RD); 19addr = resolver.get_addr_by_name("zone.nic.cz", ldns.LDNS_RR_CLASS_IN, ldns.LDNS_RD); 20if (not addr): 21 raise Exception("Can't retrieve server address") 22 23print "Addr_by_name:",str(addr).replace("\n","; ") 24 25#remove all nameservers 26while resolver.pop_nameserver(): 27 pass 28 29#insert server addr 30for rr in addr.rrs(): 31 resolver.push_nameserver_rr(rr) 32 33#AXFR transfer 34status = resolver.axfr_start(utf2name(u"háčkyčárky.cz"), ldns.LDNS_RR_CLASS_IN) 35if status != ldns.LDNS_STATUS_OK: 36 raise Exception("Can't start AXFR. Error: %s" % ldns.ldns_get_errorstr_by_id(status)) 37 38#Print results 39while True: 40 rr = resolver.axfr_next() 41 if not rr: 42 break 43 44 rdf = rr.owner() 45 if (rdf.get_type() == ldns.LDNS_RDF_TYPE_DNAME): 46 print "RDF owner: type=",rdf.get_type_str(),"data=",name2utf(str(rdf)) 47 else: 48 print "RDF owner: type=",rdf.get_type_str(),"data=",str(rdf) 49 print " RR type=", rr.get_type_str()," ttl=",rr.ttl() 50 for rdf in rr.rdfs(): 51 if (rdf.get_type() == ldns.LDNS_RDF_TYPE_DNAME): 52 print " RDF: type=",rdf.get_type_str(),"data=",name2utf(str(rdf)) 53 else: 54 print " RDF: type=",rdf.get_type_str(),"data=",str(rdf) 55 56 print 57