summaryrefslogtreecommitdiffstats
path: root/skripti/zone/axfr.py
diff options
context:
space:
mode:
Diffstat (limited to 'skripti/zone/axfr.py')
-rwxr-xr-xskripti/zone/axfr.py85
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="")