From 554564ee3ca155a92f68aac24426a7e238c11184 Mon Sep 17 00:00:00 2001 From: altf4arnold Date: Sun, 25 Feb 2024 03:44:26 +0100 Subject: [PATCH] working v4, v6 and nsserver --- tldtester/admin.py | 14 +++++------- tldtester/models.py | 26 +++++------------------ tldtester/sorter.py | 52 ++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 57 insertions(+), 35 deletions(-) diff --git a/tldtester/admin.py b/tldtester/admin.py index 64214a5..dedc845 100644 --- a/tldtester/admin.py +++ b/tldtester/admin.py @@ -2,24 +2,20 @@ from admin_extra_buttons.api import ExtraButtonsMixin, button from admin_extra_buttons.utils import HttpResponseRedirectToReferrer from django.contrib import admin from .models import TLD -from .models import zonecontent import tldtester.sorter as sorter +import threading -class tlds(admin.ModelAdmin): - list_display = ('tld', 'inet', 'dnssec', 'lastEdition') - - -class zone(ExtraButtonsMixin, admin.ModelAdmin): - list_display = ('name', 'rtype', 'rclass', 'ttl', 'data', 'lastEdition') +class tlds(ExtraButtonsMixin, admin.ModelAdmin): + list_display = ('tld', 'nsamount', 'v4nsamount', 'v6nsamount', 'lastEdition') @button(change_form=True, html_attrs={'style': 'background-color:#88FF88;color:black'}) def refresh(self, request): self.message_user(request, 'refresh called') - sorter.main() + t1 = threading.Thread(target=sorter.main()) + t1.start() # Optional: returns HttpResponse return HttpResponseRedirectToReferrer(request) admin.site.register(TLD, tlds) -admin.site.register(zonecontent, zone) diff --git a/tldtester/models.py b/tldtester/models.py index fceaa9c..9f2a50e 100644 --- a/tldtester/models.py +++ b/tldtester/models.py @@ -5,7 +5,6 @@ class TLD(models.Model): """ Model for the TLDs validation """ - INET = ((0, "IPv4"), (1, "IPv6"), (2, "IPv4 + IPv6"),) DNSSECALGOS = ( (0, "Delete DS"), (1, "RSA/MD5"), @@ -29,9 +28,11 @@ class TLD(models.Model): (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) - inet = models.IntegerField(default=0, choices=INET) lastEdition = models.DateTimeField(auto_now=True) def __str__(self): @@ -41,22 +42,5 @@ class TLD(models.Model): indexes = [ models.Index(fields=["tld"]), models.Index(fields=["dnssec"]), - models.Index(fields=["inet"]), - ] - - -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"]), + models.Index(fields=["nsamount"]), ] diff --git a/tldtester/sorter.py b/tldtester/sorter.py index 9052a9b..7914e2d 100644 --- a/tldtester/sorter.py +++ b/tldtester/sorter.py @@ -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 """ import urllib.request -import json -# from tldtester.models import zonecontent, TLD +from tldtester.models import TLD import dns.resolver @@ -23,11 +22,54 @@ def downloader(): 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(): try: - data = sorter(downloader()) - dbwriter(data) - print(data) + grabber(downloader()) except Exception as e: print(e)