from django.db import models from django.urls import reverse from whoisdb.models import MntdObject, WhoisObject, Contact, InetNum import ipaddress # generally allow domains for .dn to be created # allow owners of a subnet to create reverse dns record? class Nameserver(MntdObject): handleSuffix = "NS" # dns name # ip address, if glue # ipv4/ipv6 address? handle = None name = models.CharField(max_length=256) glueIPv4 = models.GenericIPAddressField(protocol='IPv4', blank=True, null=True) glueIPv6 = models.GenericIPAddressField(protocol='IPv6', blank=True, null=True) admin_c = models.ManyToManyField(Contact) def getPK(self): return self.pk def get_absolute_url(self): return reverse("domains:nameserver-show", args=(self.pk,)) def __str__(self): return self.name def getNoDeleteReasons(self): # nameservers can always be deleted return [] class Domain(MntdObject): handle = None handleSuffix = "DOM" name = models.CharField(max_length=67, unique=True, db_index=True) nameservers = models.ManyToManyField(Nameserver, blank=True) admin_c = models.ManyToManyField(Contact) def getPK(self): return self.name def get_absolute_url(self): return reverse("domains:domain-show", args=(self.name,)) def __str__(self): return self.name def getNoDeleteReasons(self): reasons = [] nameservers = Nameserver.objects.filter(name__endswith="." + self.name) for ns in nameservers: # FIXME: check if the nameserver has a glue record.... and also if it is maintained by us reasons.append("Nameserver %s depends on this domain" % ns.name) return reasons class ReverseZone(WhoisObject): handle = None parentNet = models.ForeignKey(InetNum) address = models.GenericIPAddressField(db_index=True) netmask = models.PositiveIntegerField() nameservers = models.ManyToManyField(Nameserver) def getPK(self): return self.pk def prefix(self): """ Helper function, mainly used in templates """ return "%s/%s" % (self.address, self.netmask) def getNetwork(self): return ipaddress.ip_network(self.prefix()) def get_absolute_url(self): return reverse("domains:reversezone-show", args=(self.pk,)) def __str__(self): return "%s @ %s" % (self.prefix(), self.parentNet) def getNoDeleteReasons(self): return [] def canEdit(self, user): if self.parentNet: return self.parentNet.canEdit(user) else: return False