ascension

Migrate DNS zones to the GNU Name System
Log | Files | Refs | README | LICENSE

commit e495d920dec5452e52d3cb48a137330c7ec7bf58
parent eed345abba8770410f09edcd4a01f68fffe15246
Author: rexxnor <rexxnor+gnunet@brief.li>
Date:   Fri, 28 Sep 2018 10:54:16 +0200

added zone merging of full and incremental zones

Diffstat:
Mgnsmigrator/gnsmigrator.py | 45+++++++++++++++++++++++++++++----------------
Msetup.py | 2+-
2 files changed, 30 insertions(+), 17 deletions(-)

diff --git a/gnsmigrator/gnsmigrator.py b/gnsmigrator/gnsmigrator.py @@ -198,6 +198,19 @@ class GNSMigrator(): """ return domain.split('.')[0] + @staticmethod + def merge_zones(domain, fullzone, incrementalzone): + """ + Merges full zone with incremental zone + """ + # The library sucks so I do it with string operations + fullset = set(fullzone.to_text().decode().split('\n')) + incrementalset = set(incrementalzone.to_text().decode().split('\n')) + merged = '\n'.join(fullset.union(incrementalset)) + mergedzone = dns.zone.from_text(merged.encode(), origin=domain) + return mergedzone + + @classmethod def refresh_zone(cls, domain, zonetuple, dnsresolver): """ @@ -212,23 +225,23 @@ class GNSMigrator(): zone, xfrinfo = zonetuple zonename = cls.get_lowest_domain_part(domain) cls.add_records_to_gns(zonename, zone, domain, dnsresolver) + newzone = dns.zone.Zone(domain) # Ugly way to get serial - serial = int(str(zone.get_rdataset('@', dns.rdatatype.SOA)).split(' ')[5]) - newzone = dns.zone.from_xfr(dns.query.xfr(xfrinfo[0], - xfrinfo[1], - rdtype=dns.rdatatype.IXFR, - serial=serial)) - - # If the zone serials match, refresh the TTL in the daemon, else insert new TTL - newserial = int(str(newzone.get_rdataset('@', dns.rdatatype.SOA)).split(' ')[5]) - if serial == newserial: - cls.zones[domain] = (zone, (xfrinfo[0], - xfrinfo[1], - newzone.get_rdataset('@', dns.rdatatype.SOA).ttl)) - cls.zones[domain] = (newzone, (xfrinfo[0], - xfrinfo[1], - newzone.get_rdataset('@', dns.rdatatype.SOA).ttl)) + oldserial = int(str(zone.get_rdataset('@', dns.rdatatype.SOA)).split(' ')[5]) + try: + newzone = dns.zone.from_xfr(dns.query.xfr(xfrinfo[0], + xfrinfo[1], + rdtype=dns.rdatatype.IXFR, + serial=oldserial)) + except dns.zone.NoNS: + print('the zone for domain %s was not updated' % domain) + + # Merge old and new zone + updatedzone = cls.merge_zones(domain, zone, newzone) + cls.zones[domain] = (updatedzone, (xfrinfo[0], + xfrinfo[1], + zone.get_rdataset('@', dns.rdatatype.SOA).ttl)) def main(): @@ -236,7 +249,7 @@ def main(): Initializes object and handles arguments """ # argument parsing from docstring definition - args = docopt.docopt(__doc__, version='GNS Migrator 0.1.0') + args = docopt.docopt(__doc__, version='GNS Migrator 0.1.1') # Checks if GNUnet services are running try: diff --git a/setup.py b/setup.py @@ -10,7 +10,7 @@ with open("README.md", "r") as fh: setuptools.setup( name="gnsmigrator", - version="0.1.0", + version="0.1.1", author="Patrick Gerber", author_email="patrick.gerber@students.bfh.ch", description="Tool to migrate DNS Zones to the GNU Name System",