]> Frank Brehm's Git Trees - pixelpark/admin-tools.git/commitdiff
New methods get_soa_by_dns() and get_new_serial() for class PdnsApiZone
authorFrank Brehm <frank.brehm@pixelpark.com>
Mon, 15 Jan 2018 17:26:50 +0000 (18:26 +0100)
committerFrank Brehm <frank.brehm@pixelpark.com>
Mon, 15 Jan 2018 17:26:50 +0000 (18:26 +0100)
pp_lib/pdns_zone.py

index bbc59456930bf827a1818689f3b1ad0a39d4292a..59d15cac172d71c795cdaeee9204f20ffe73c220 100644 (file)
@@ -13,8 +13,11 @@ import sys
 import os
 import logging
 import copy
+import datetime
 
 # Third party modules
+import dns.resolver
+from dns.resolver import Resolver, NoAnswer
 
 # Own modules
 from .common import pp, to_bytes, to_utf8, to_bool
@@ -24,7 +27,7 @@ from .errors import PpError
 from .obj import PpBaseObjectError, PpBaseObject
 from .pdns_record import PdnsApiRrset, PdnsSoaData
 
-__version__ = '0.4.5'
+__version__ = '0.5.1'
 
 LOG = logging.getLogger(__name__)
 
@@ -408,6 +411,70 @@ class PdnsApiZone(PpBaseObject):
 
         return soa
 
+    # -------------------------------------------------------------------------
+    def get_soa_by_dns(self, *nameservers):
+
+        soa = None
+
+        resolver = Resolver()
+
+        if nameservers:
+            resolver.nameservers = []
+            for ns in nameservers:
+                LOG.debug("Adding nameserver to use: {!r}.".format(ns))
+                resolver.nameservers.append(ns)
+
+        try:
+            answers = resolver.query(self.name, 'SOA', raise_on_no_answer=False)
+        except NoAnswer as e:
+            LOG.error("Got no answer from nameservers: {}".format(e))
+            return None
+
+        for rdata in answers:
+            soa = PdnsSoaData(
+                primary=rdata.mname, email=rdata.rname, serial=rdata.serial, refresh=rdata.refresh,
+                retry=rdata.retry, expire=rdata.expire, ttl=rdata.minimum,
+                appname=self.appname, verbose=self.verbose, base_dir=self.base_dir)
+            return soa
+
+        return None
+
+    # -------------------------------------------------------------------------
+    def get_new_serial(self, *compare_serials):
+
+        i = 0
+        today = datetime.date.today()
+        new_serial = today.year * 1000000 + today.month * 10000 + today.day * 100 + i
+        one_day = datetime.timedelta(1)
+
+        compare = []
+        compare.append(self.serial)
+        compare.append(self.notified_serial)
+        if compare_serials:
+            for serial in compare_serials:
+                compare.append(serial)
+        if self.verbose > 3:
+            LOG.debug("Compare serials: {}".format(pp(compare)))
+
+        found = False
+        while not found:
+            if self.verbose > 3:
+                LOG.debug("Trying new serial {} ...".format(new_serial))
+            found = True
+            for serial in compare:
+                if serial >= new_serial:
+                    found = False
+                    break
+            if found:
+                return new_serial
+            i += 1
+            if i > 99:
+                today += one_day
+                i = 0
+            new_serial = today.year * 1000000 + today.month * 10000 + today.day * 100 + i
+
+        return new_serial
+
     # -------------------------------------------------------------------------
     def get_zone_nameservers(self, for_zone=None):