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:
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",