passed on zonefile instead of active DNS-Polling

This commit is contained in:
Arnold Dechamps 2024-02-26 09:16:06 +01:00
parent 3ba7da8cca
commit 323db5f118
No known key found for this signature in database
GPG key ID: AE66543374E41C89
4 changed files with 48 additions and 44 deletions

View file

@ -3,7 +3,6 @@ build==1.0.3
click==8.1.7 click==8.1.7
Django==5.0.2 Django==5.0.2
django-admin-extra-buttons==1.5.7 django-admin-extra-buttons==1.5.7
dnspython==2.6.1
flake8==7.0.0 flake8==7.0.0
mccabe==0.7.0 mccabe==0.7.0
packaging==23.2 packaging==23.2

View file

@ -1,5 +1,5 @@
# #
# This file is autogenerated by pip-compile with Python 3.11 # This file is autogenerated by pip-compile with Python 3.10
# by the following command: # by the following command:
# #
# pip-compile --output-file=requirements.txt requirements.in # pip-compile --output-file=requirements.txt requirements.in
@ -20,8 +20,6 @@ django==5.0.2
# via -r requirements.in # via -r requirements.in
django-admin-extra-buttons==1.5.7 django-admin-extra-buttons==1.5.7
# via -r requirements.in # via -r requirements.in
dnspython==2.6.1
# via -r requirements.in
flake8==7.0.0 flake8==7.0.0
# via -r requirements.in # via -r requirements.in
mccabe==0.7.0 mccabe==0.7.0
@ -50,6 +48,13 @@ sqlparse==0.4.4
# via # via
# -r requirements.in # -r requirements.in
# django # django
tomli==2.0.1
# via
# build
# pip-tools
# pyproject-hooks
typing-extensions==4.10.0
# via asgiref
wheel==0.42.0 wheel==0.42.0
# via pip-tools # via pip-tools

View file

@ -33,6 +33,7 @@ class TLD(models.Model):
v4nsamount = models.IntegerField(default=0) v4nsamount = models.IntegerField(default=0)
v6nsamount = models.IntegerField(default=0) v6nsamount = models.IntegerField(default=0)
dnssec = models.IntegerField(default=300, choices=DNSSECALGOS) dnssec = models.IntegerField(default=300, choices=DNSSECALGOS)
amountofkeys = models.IntegerField(default=0)
lastEdition = models.DateTimeField(auto_now=True) lastEdition = models.DateTimeField(auto_now=True)
def __str__(self): def __str__(self):

View file

@ -4,7 +4,7 @@ Link to IANA website : https://www.internic.net/domain/root.zone
""" """
import urllib.request import urllib.request
from tldtester.models import TLD, RootZone from tldtester.models import TLD, RootZone
import dns.resolver from django.core.exceptions import MultipleObjectsReturned
def zonedownloader(): def zonedownloader():
@ -31,6 +31,8 @@ def tlddownloader():
raw = raw.decode("utf-8").splitlines() raw = raw.decode("utf-8").splitlines()
# File has a timestamp as first line. This will take it out so we only keep the TLD's # File has a timestamp as first line. This will take it out so we only keep the TLD's
raw.pop(0) raw.pop(0)
for i in range(len(raw)):
raw[i] = raw[i].lower()
else: else:
raw = None raw = None
return raw return raw
@ -46,6 +48,9 @@ def zonesorter(zonefile):
if len(record) >= 5: if len(record) >= 5:
name = record[0] name = record[0]
recordtype = record[3] recordtype = record[3]
if len(record) == 5:
value = record[4]
else:
for i in range(len(record) - 4): for i in range(len(record) - 4):
value = value + record[i + 4] + " " value = value + record[i + 4] + " "
towrite = {"name": name, "type": recordtype, "value": value} towrite = {"name": name, "type": recordtype, "value": value}
@ -76,6 +81,7 @@ def tlddbwriter(recs):
db.v4nsamount = recs["v4resolvers"] db.v4nsamount = recs["v4resolvers"]
db.v6nsamount = recs["v6resolvers"] db.v6nsamount = recs["v6resolvers"]
db.dnssec = recs["algo"] db.dnssec = recs["algo"]
db.amountofkeys = recs["amountofkeys"]
db.save() db.save()
@ -89,52 +95,45 @@ def grabber(data):
dnsseckeys = [] dnsseckeys = []
Arecords = 0 Arecords = 0
AAAArecords = 0 AAAArecords = 0
try: amountofkeys = 0
ns = dns.resolver.resolve(tld, 'NS') nses = RootZone.objects.all().filter(name=tld + ".", rectype="NS")
for server in ns: for ns in nses:
nsservers.append(server.to_text()) nsservers.append(ns.value)
except Exception as e:
print(e)
for Arecord in nsservers: for Arecord in nsservers:
try: try:
try: RootZone.objects.all().get(name=Arecord, rectype="A")
dns.resolver.resolve(Arecord, 'A')
except Exception as e:
# retry
print(e)
dns.resolver.resolve(Arecord, 'A')
Arecords += 1 Arecords += 1
except Exception as e: except MultipleObjectsReturned:
print(e) Arecords += 1
print("Multiple IPv4 for " + Arecord)
except:
print(Arecord + " Has no IPv4 record")
for AAAArecord in nsservers: for AAAArecord in nsservers:
try: try:
try: RootZone.objects.all().get(name=AAAArecord, rectype="AAAA")
dns.resolver.resolve(AAAArecord, 'AAAA')
except Exception as e:
# retry
print(e)
dns.resolver.resolve(AAAArecord, 'AAAA')
AAAArecords += 1 AAAArecords += 1
except Exception as e: except MultipleObjectsReturned:
print(e) AAAArecords += 1
try: print("Multiple IPv6 for" + AAAArecord)
try: except:
ds = dns.resolver.resolve(tld, 'DS') print(AAAArecord + " Has no IPv6 record")
except Exception as e:
# retry dsrec = RootZone.objects.all().filter(name=tld + ".", rectype="DS")
print(e) if len(dsrec) == 0:
ds = dns.resolver.resolve(tld, 'DS') # Means No DNSSEC
for dsrecord in ds:
algo = dsrecord.to_text()
line = algo.split()
dnsseckeys.append(int(line[1]))
algo = max(list(dict.fromkeys(dnsseckeys)))
except Exception as e:
algo = 400 algo = 400
print(e) else:
try:
for ds in dsrec:
dnsseckeys.append(int(ds.value.split()[1]))
amountofkeys += 1
algo = max(dnsseckeys)
except Exception as e:
print(tld + " DNSSEC " + e)
algo = 300
results = {"tld": tld, "nsserveramount": int(len((nsservers))), "v4resolvers": Arecords, results = {"tld": tld, "nsserveramount": int(len((nsservers))), "v4resolvers": Arecords,
"v6resolvers": AAAArecords, "algo": algo} "v6resolvers": AAAArecords, "algo": algo, "amountkeys": amountofkeys}
tlddbwriter(results) tlddbwriter(results)