#!/usr/bin/env python3

MAXIMUM = 10000

import json
import sys

# DNSpython
import dns.resolver
import dns.name

def climb(domain):
    if len(domain.labels) <= 2: # The root counts for one label
        return {"name": "STOP AT TLD OR ROOT"}
    try:
        answers = dns.resolver.resolve(domain, "NS")
        ns = {}
        for rdata in answers:
            ns[str(rdata.target)] = []
            try:
                try:
                    addresses = dns.resolver.resolve(rdata.target, "A")
                    for addr in addresses:
                        ns[str(rdata.target)].append(str(addr))
                except dns.resolver.NoAnswer:
                    pass
                except dns.exception.Timeout:
                    print("Timeout getting the IP address of %s" % rdata.target,
                          file=sys.stderr)
                try:
                    addresses = dns.resolver.resolve(rdata.target, "AAAA")
                    for addr in addresses:
                        ns[str(rdata.target)].append(str(addr))
                except dns.resolver.NoAnswer:
                    pass
                except dns.exception.Timeout:
                    print("Timeout getting the IP address of %s" % rdata.target,
                          file=sys.stderr)
            except dns.resolver.NXDOMAIN:
                # Lame delegation
                pass
        return {"name": str(domain), "nameservers": ns}
    except dns.resolver.NoAnswer:
        return climb(domain.parent())
    except dns.resolver.NXDOMAIN:
        print("Warning: instance %s does not exist" % domain, file=sys.stderr)
    except dns.exception.Timeout:
        print("Timeout getting the name servers of broken instance %s" % domain,
              file=sys.stderr)
        
FILENAME = "list.json"
f = open(FILENAME)
j = json.load(f)
result = {"instances": {}}
num = 0
for instance in j["instances"]:
    num += 1
    if num > MAXIMUM:
        break
    name = instance["name"]
    answers = climb(dns.name.from_text(name))
    result["instances"][name] = answers
f.close()
result["total"] = num
json.dump(result, sys.stdout)

