snippets/python/recursive-axfr/recursive-axfr.py

52 lines
1.2 KiB
Python

import dns.resolver
import dns.zone
import dns.query
import dns.rdatatype
import dns.reversename
import dns.name
import sys
ZONES = ['0l.de', 'steffenvogel.de', 'dn42.org', 'vogel.cc', 'noteblok.net', 'chaos.family', '0l.dn42']
master_name = 'ipa-0.edgy.vms.0l.de'
master_answer = dns.resolver.resolve(master_name, 'A')
NS = master_answer[0].address
def get_names(zone, rdtypes=['A', 'AAAA', 'CNAME', 'NS']):
names = set()
zone = dns.name.from_text(zone)
try:
x = dns.query.xfr(NS, zone)
z = dns.zone.from_xfr(x)
for rdtype in rdtypes:
rdtype = dns.rdatatype.from_text(rdtype)
for name, ttl, rdata in z.iterate_rdatas(rdtype):
fqdn = name.derelativize(zone).to_text(True)
if rdtype == dns.rdatatype.NS and len(name) > 0:
names |= get_names(fqdn)
elif not name.is_wild():
names.add(fqdn)
except dns.xfr.TransferError as e:
print(f'{e}: {zone}', file=sys.stderr)
return names
def main():
names = set()
for zone in ZONES:
names |= get_names(zone)
print('\n'.join(sorted(names)))
if __name__ == '__main__':
main()