ascension

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

commit 428ca05b1384014a91fa66c3779c788afa9a3310
parent 85a136529851a709c9034b7b5cee56f50ddabe44
Author: rexxnor <rexxnor+gnunet@brief.li>
Date:   Wed,  8 May 2019 15:05:15 +0200

Merge remote-tracking branch 'gnunet/master'

Diffstat:
Mascension/ascension.py | 87+++++++++++++++++++++++++++++++++++++++----------------------------------------
1 file changed, 43 insertions(+), 44 deletions(-)

diff --git a/ascension/ascension.py b/ascension/ascension.py @@ -97,7 +97,6 @@ class Ascender(): self.tld = self.domain.split(".")[::-1][0] self.zone = None self.zonegenerator = None - self.nscache = dict() self.flags = flags self.minimum = int(minimum) self.subzonedict = dict() @@ -267,8 +266,10 @@ class Ascender(): label) taskqueue.task_done() + # End of worker + - # Check if there is zone has already been migrated + # Check if a delegated zone is available in GNS as per NS record nsrecords = self.zone.iterate_rdatas(dns.rdatatype.NS) # This is broken if your NS is for ns.foo.YOURZONE as you add @@ -282,35 +283,31 @@ class Ascender(): # foo.bar A IN 1.2.3.4 # => bar PKEY GNS $NEWKEY + mapping: bar => $NEWKEY # => foo[.bar] A GNS 1.2.3.4 - gnspkey = list(filter(lambda record: str(record[2]).startswith('gns--pkey--'), nsrecords)) - if gnspkey: - label = str(gnspkey[0][0]) - ttl = gnspkey[0][1] - pkey = str(gnspkey[0][2]) - # TODO Check this check - if not self.transferns in ['127.0.0.1', '::1', 'localhost']: - logging.warning("zone exists in GNS, adding it to local store") - self.add_pkey_record_to_zone(pkey[11:], self.domain, - label, ttl) - return - - # Unify all records under same label into datastructure + gnspkey = list(filter(lambda record: for rec in record[2]: if str(rec).startswith('gns--pkey--'): return true; return false, nsrecords)) + for nsrecord in nsrecords: + name = str(nsrecord[0]) + ttl = nsrecord[1] + values = nsrecord[2] + gnspkeys = list(filter(lambda record: str(record).startswith('gns--pkey--'), values)) + if len(gnspkeys) > 1: + logging.critical("Detected ambiguous PKEY records for label %s (not generating PKEY record)", name) + continue + gnspkey = gnspkeys[0] + # FIXME: check that this is actucally a well-formed PKEY string! (Crockford base32, sufficient length) + self.add_pkey_record_to_zone(pkey[11:], self.domain, name, ttl) + # FIXME: drop all NS records under this name later! => new map, if entry present during NS processing, skip! + + # Unify all records under same label into a record set customrdataset = dict() - for remaining in self.zone.iterate_rdatasets(): + for name, rdset in self.zone.iterate_rdatasets(): # build lookup table for later GNS2DNS records - domain = "%s.%s" % (str(remaining[0]), self.domain) - elementlist = [] - for element in remaining[1]: - if dns.rdatatype.to_text(element.rdtype) in ['A', 'AAAA']: - elementlist.append(str(element)) - self.nscache[str(domain)] = elementlist - rdataset = remaining[1] - if customrdataset.get(str(remaining[0])) is None: + name = str(name) # Name could be str or DNS.name.Name + if customrdataset.get(name)) is None: work = list() - work.append(rdataset) - customrdataset[str(remaining[0])] = work + work.append(rdset) + customrdataset[name] = work else: - customrdataset[str(remaining[0])].append(rdataset) + customrdataset[name].append(rdset) for label, value in customrdataset.items(): if value is None: @@ -387,6 +384,15 @@ class Ascender(): logging.info("successfully added record with command %s", ' '.join(ret.args)) + def resolve_glue(self, + authorityname: str) -> list: + rdsets = self.zone[dnsresolver].rdatasets + value = [] + for rdataset in rdsets: + if rdataset.rdtype in [dns.rdatatype.A, dns.rdatatype.AAAA]: + value.append("%s@%s" % (zonename, str(rdataset))) + return value + def transform_to_gns_format(self, record: dns.rdata.Rdata, rdtype: dns.rdata.Rdata, @@ -424,25 +430,18 @@ class Ascender(): else: value = "%s.%s" % (value, zonename) elif rdtype == 'NS': - nameserver = str(record) + nameserver = str(record) if value[-1] == ".": - value = value[:-1] - else: - value = "%s.%s" % (value, zonename) - if zonename[-1] == ".": - zonename = zonename[:-1] - if nameserver[-1] == ".": - dnsresolver = nameserver[:-1] - dnsresolver = self.nscache.get(dnsresolver, dnsresolver) - else: - dnsresolver = "%s.%s" % (nameserver, zonename) - dnsresolver = self.nscache.get(dnsresolver, dnsresolver) - if isinstance(dnsresolver, list): - value = [] - for nsip in dnsresolver: - value.append("%s@%s" % (zonename, nsip)) + # FQDN provided + if value.endswith("." + zonename): + # in bailiwick + value = resolve_glue (self, nameserver) + else: + # out of bailiwick + value = '%s.%s@%s' % (str(label), zonename, dnsresolver) else: - value = '%s.%s@%s' % (str(label), zonename, dnsresolver) + # Name is relative to zone, must be in bailiwick + value = resolve_glue (self, nameserver) logging.info("transformed %s record to GNS2DNS format", rdtype) rdtype = 'GNS2DNS'