All checks were successful
pda-new unit tests / Run-unit-tests (push) Successful in 8s
100 lines
2.7 KiB
Python
100 lines
2.7 KiB
Python
#!/usr/bin/python3
|
|
#
|
|
#
|
|
|
|
from django.db import models
|
|
from django.utils.timezone import now
|
|
from django.utils.translation import gettext as _
|
|
|
|
# Okay, going to illustrate my thinking here:
|
|
# A ##Context## is a set of servers that operate together as
|
|
# authoritative for a group of zones.
|
|
|
|
# (I was going to call it a Network, but then I found out
|
|
# about https://doc.powerdns.com/authoritative/views.html )
|
|
|
|
# All ##Servers## within a Context are presumed to be
|
|
# using the same database and be otherwise interchangeable,
|
|
# Although given the limitations of some backends they can
|
|
# be set to read-only.
|
|
|
|
class PDNSContext(models.Model):
|
|
name = models.CharField(verbose_name=_('Name'),
|
|
max_length=20,
|
|
unique=True,
|
|
primary_key=True,
|
|
)
|
|
|
|
description = models.TextField(verbose_name=_('Description'),
|
|
blank=True,
|
|
null=True,
|
|
)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
def total_servers(self):
|
|
return self.servers.all().count()
|
|
|
|
def online_servers(self):
|
|
return self.servers.filter(online=True).count()
|
|
|
|
def offline_servers(self):
|
|
return self.servers.filter(online=False).count()
|
|
|
|
def status(self):
|
|
return _('Context %(name)s: %(total)d total, %(online)d online, %(offline)d offline.') % {
|
|
'name': self.name,
|
|
'total': self.total_servers(),
|
|
'online': self.online_servers(),
|
|
'offline': self.offline_servers()}
|
|
|
|
|
|
class PDNSServer(models.Model):
|
|
name = models.CharField(verbose_name=_('Name'),
|
|
max_length=40,
|
|
unique=True,
|
|
primary_key=True,
|
|
)
|
|
|
|
server_uri = models.URLField(verbose_name=_('Server URL'),
|
|
help_text='Prefer IP addresses; use FQDN at your own risk.',
|
|
max_length=80,
|
|
blank=False,
|
|
null=False
|
|
)
|
|
|
|
context=models.ForeignKey(PDNSContext,
|
|
verbose_name=_('Context'),
|
|
on_delete=models.PROTECT,
|
|
related_name='servers'
|
|
)
|
|
|
|
online = models.BooleanField(verbose_name=_('Online status'),
|
|
editable=False,
|
|
default=False
|
|
)
|
|
|
|
last_checked = models.DateTimeField(verbose_name=_('Last checked'),
|
|
editable=False,
|
|
null=True
|
|
)
|
|
|
|
last_seen = models.DateTimeField(verbose_name=_('Last seen online'),
|
|
editable=False,
|
|
null=True
|
|
)
|
|
|
|
def __str__(self):
|
|
selfstr= _("%(name)s (%(context)s): %(url)s") % { 'name': self.name,
|
|
'context': self.context.name,
|
|
'url': self.server_uri}
|
|
return selfstr
|
|
|
|
def status(self):
|
|
status = _('Online') if self.online else _('Offline')
|
|
return _('%(status)s since %(time)s') % {
|
|
'status': status,
|
|
'time': self.last_checked
|
|
}
|