#!/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(zone["_urejevalnik"].get_rdataset(dns.rdataclass.IN, dns.rdatatype.TXT)[0].strings).decode()) except KeyError: 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="") print("\t", end="") 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="")