#!/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="")