working v4, v6 and nsserver

This commit is contained in:
Arnold Dechamps 2024-02-25 03:44:26 +01:00
parent 62e2138d5c
commit 554564ee3c
No known key found for this signature in database
GPG key ID: AE66543374E41C89
3 changed files with 57 additions and 35 deletions

View file

@ -2,24 +2,20 @@ from admin_extra_buttons.api import ExtraButtonsMixin, button
from admin_extra_buttons.utils import HttpResponseRedirectToReferrer from admin_extra_buttons.utils import HttpResponseRedirectToReferrer
from django.contrib import admin from django.contrib import admin
from .models import TLD from .models import TLD
from .models import zonecontent
import tldtester.sorter as sorter import tldtester.sorter as sorter
import threading
class tlds(admin.ModelAdmin): class tlds(ExtraButtonsMixin, admin.ModelAdmin):
list_display = ('tld', 'inet', 'dnssec', 'lastEdition') list_display = ('tld', 'nsamount', 'v4nsamount', 'v6nsamount', 'lastEdition')
class zone(ExtraButtonsMixin, admin.ModelAdmin):
list_display = ('name', 'rtype', 'rclass', 'ttl', 'data', 'lastEdition')
@button(change_form=True, html_attrs={'style': 'background-color:#88FF88;color:black'}) @button(change_form=True, html_attrs={'style': 'background-color:#88FF88;color:black'})
def refresh(self, request): def refresh(self, request):
self.message_user(request, 'refresh called') self.message_user(request, 'refresh called')
sorter.main() t1 = threading.Thread(target=sorter.main())
t1.start()
# Optional: returns HttpResponse # Optional: returns HttpResponse
return HttpResponseRedirectToReferrer(request) return HttpResponseRedirectToReferrer(request)
admin.site.register(TLD, tlds) admin.site.register(TLD, tlds)
admin.site.register(zonecontent, zone)

View file

@ -5,7 +5,6 @@ class TLD(models.Model):
""" """
Model for the TLDs validation Model for the TLDs validation
""" """
INET = ((0, "IPv4"), (1, "IPv6"), (2, "IPv4 + IPv6"),)
DNSSECALGOS = ( DNSSECALGOS = (
(0, "Delete DS"), (0, "Delete DS"),
(1, "RSA/MD5"), (1, "RSA/MD5"),
@ -29,9 +28,11 @@ class TLD(models.Model):
(300, "Unknown"), (300, "Unknown"),
) )
tld = models.CharField(max_length=30) tld = models.CharField(max_length=30, primary_key=True)
nsamount = models.IntegerField(default=0)
v4nsamount = models.IntegerField(default=0)
v6nsamount = models.IntegerField(default=0)
dnssec = models.IntegerField(default=300, choices=DNSSECALGOS) dnssec = models.IntegerField(default=300, choices=DNSSECALGOS)
inet = models.IntegerField(default=0, choices=INET)
lastEdition = models.DateTimeField(auto_now=True) lastEdition = models.DateTimeField(auto_now=True)
def __str__(self): def __str__(self):
@ -41,22 +42,5 @@ class TLD(models.Model):
indexes = [ indexes = [
models.Index(fields=["tld"]), models.Index(fields=["tld"]),
models.Index(fields=["dnssec"]), models.Index(fields=["dnssec"]),
models.Index(fields=["inet"]), models.Index(fields=["nsamount"]),
]
class zonecontent(models.Model):
rtype = models.CharField(max_length=10)
name = models.CharField(max_length=100)
rclass = models.CharField(max_length=10)
ttl = models.CharField(max_length=5)
data = models.CharField(max_length=1000)
lastEdition = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class Meta:
indexes = [
models.Index(fields=["name"]),
] ]

View file

@ -3,8 +3,7 @@ This file is dumping the IANA root zone and sorting it in the database
Link to IANA website : https://www.internic.net/domain/root.zone Link to IANA website : https://www.internic.net/domain/root.zone
""" """
import urllib.request import urllib.request
import json from tldtester.models import TLD
# from tldtester.models import zonecontent, TLD
import dns.resolver import dns.resolver
@ -23,11 +22,54 @@ def downloader():
return raw return raw
def dbwriter(recs):
"""
Writes the dictionnary values in the database
"""
if TLD.objects.filter(tld=recs["tld"]).exists():
db = TLD.objects.get(tld=recs["tld"])
else:
db = TLD()
db.tld = recs["tld"]
db.nsamount = recs["nsserveramount"]
db.v4nsamount = recs["v4resolvers"]
db.v6nsamount = recs["v6resolvers"]
db.save()
def grabber(data):
"""
This function takes the TLD's and makes querrys to the DNS. It looks up how many authoritative DNS's there are and
analyses the v4, v6 and DNSSEC. Returns a list of dictionaries with all the vallues to write in the database
"""
for tld in data:
nsservers = []
Arecords = 0
AAAArecords = 0
ns = dns.resolver.resolve(tld, 'NS')
for server in ns:
nsservers.append(server.to_text())
for Arecord in nsservers:
try:
dns.resolver.resolve(Arecord, 'A')
Arecords += 1
except Exception as e:
print(e)
for AAAArecord in nsservers:
try:
dns.resolver.resolve(AAAArecord, 'AAAA')
AAAArecords += 1
except Exception as e:
print(e)
results = {"tld": tld, "nsserveramount": int(len((nsservers))), "v4resolvers": Arecords,
"v6resolvers": AAAArecords}
dbwriter(results)
def main(): def main():
try: try:
data = sorter(downloader()) grabber(downloader())
dbwriter(data)
print(data)
except Exception as e: except Exception as e:
print(e) print(e)