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