summaryrefslogblamecommitdiffstats
path: root/skripti/zone/axfr.py
blob: fe508f1a7c9c87dbabe474108c358bced7c19bf2 (plain) (tree)




















































































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