#!/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 }