diff options
Diffstat (limited to 'skripti/zone/axfr.py')
-rwxr-xr-x | skripti/zone/axfr.py | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/skripti/zone/axfr.py b/skripti/zone/axfr.py new file mode 100755 index 0000000..fe508f1 --- /dev/null +++ b/skripti/zone/axfr.py @@ -0,0 +1,85 @@ +#!/usr/bin/python3 +import dns.zone +import dns.resolver +import json +import sys +domena = sys.argv[1] +strežniki = [dns.resolver.resolve(domena, "SOA")[0].mname] +for i in dns.resolver.resolve(domena, "NS"): + strežniki.append(i.target) +naslovi = [] +for strežnik in strežniki: + for i in dns.resolver.resolve(strežnik, "AAAA"): + naslovi.append(i.address) + for i in dns.resolver.resolve(strežnik, "A"): + naslovi.append(i.address) +for naslov in naslovi: # opcijsko dodaj tule kakšen try catch + zone = None + zone = dns.zone.from_xfr(dns.query.xfr(naslov, domena)) + if zone != None: + break +config = None +try: + config = json.loads(b''.join(dns.resolver.resolve("_urejevalnik." + domena, "TXT")[0].strings).decode()) +except dns.resolver.NXDOMAIN: + pass +except json.decoder.JSONDecodeError: + pass +if config == None: + berime = """; Dobrodošli v preprost urejevalnik DNS zapisov. +; Komentarji se shranijo v DNS strežnik in so javni. Morajo biti na samostojnih vrsticah. +; Te komentarje z navodili lahko izbrišete -- ne bodo se ponovno pojavili. +; Nove zapise naložite na strežnik z ukazom zone/update.py zonefile.db +; Zapise prenesete iz strežnika z ukazom zone/axfr.py domena > zonefile.db +; Prva vrstica je konfiguracijski zapis v JSON obliki. Naslednje podatke lahko spremenite: +; "t": privzeti TTL, ki se uporabi, če zapis v datoteki nima TTLja +; "+": koliko naj prištejem serijski številki pred nalaganjem na strežnik + +""" + config = {"v": 0, "d": domena, "c": {"@ SOA": berime}, "t": 1, "+": 100, "i": {}} +configout = config.copy() +del configout["c"] +del configout["i"] +print(f"{json.dumps(configout)}") +for r in zone.iterate_rdatas(): + if r[0].to_unicode() == "_urejevalnik" or r[2].rdtype in [dns.rdatatype.RRSIG, dns.rdatatype.NSEC, dns.rdatatype.NSEC3, dns.rdatatype.DNSKEY]: + continue + commentkey = r[0].to_unicode() + " " + r[2].rdtype.name + if commentkey in config["c"].keys(): + print(config["c"][commentkey], end="") + del config["c"][commentkey] + konec = "\t" + if r[0].to_unicode() in config["i"].keys(): + konec = config["i"][r[0].to_unicode()] + print(r[0].to_unicode(), end=konec) + if r[1] != config["t"]: + print(r[1], end="\t") + if r[2].rdclass != dns.rdataclass.IN: + print(r[2].rdataclass.name, end="\t") + print(r[2].rdtype.name, end="\t") + if r[2].rdtype == dns.rdatatype.TXT: + prvič = True + for string in r[2].strings: + if prvič: + prvič = False + else: + print(" ", end="") + bajti = b'' + for char in string: + if char < ord(b' '): + bajti += b'\\' + ("%03d" % ord(char)).encode() + else: + bajti += bytes([char]) + niz = "" + for znak in bajti.replace(b'\\', b'\\\\').replace(b'"', b'\\"').decode('utf-8', errors='surrogateescape'): + if '\udc80' <= znak <= '\udcff': + niz += '\\'+("%03d" % (ord(znak)-0xdc00)) + else: + niz += znak + + print('"' + niz + '"', end="") + else: + print(r[2].to_text(), end="") + print() +for i in config["c"].items(): + print(i[1], end="") |