summaryrefslogtreecommitdiffstats
path: root/skripti/zone_axfr.py
diff options
context:
space:
mode:
authorAnton Luka Šijanec <anton@sijanec.eu>2024-06-04 15:40:40 +0200
committerAnton Luka Šijanec <anton@sijanec.eu>2024-06-04 15:40:40 +0200
commit1d0e0e54f663920a0992f1af5bd7d0b37eee537a (patch)
tree240a15da83a020bbd8b0ba294db20f45308a52c0 /skripti/zone_axfr.py
parentMerge branch 'master' of ssh://ni.4a.si/var/lib/git/sijanec/r (diff)
downloadr-1d0e0e54f663920a0992f1af5bd7d0b37eee537a.tar
r-1d0e0e54f663920a0992f1af5bd7d0b37eee537a.tar.gz
r-1d0e0e54f663920a0992f1af5bd7d0b37eee537a.tar.bz2
r-1d0e0e54f663920a0992f1af5bd7d0b37eee537a.tar.lz
r-1d0e0e54f663920a0992f1af5bd7d0b37eee537a.tar.xz
r-1d0e0e54f663920a0992f1af5bd7d0b37eee537a.tar.zst
r-1d0e0e54f663920a0992f1af5bd7d0b37eee537a.zip
Diffstat (limited to 'skripti/zone_axfr.py')
-rwxr-xr-xskripti/zone_axfr.py86
1 files changed, 86 insertions, 0 deletions
diff --git a/skripti/zone_axfr.py b/skripti/zone_axfr.py
new file mode 100755
index 0000000..81460a6
--- /dev/null
+++ b/skripti/zone_axfr.py
@@ -0,0 +1,86 @@
+#!/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="")