[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [ascension] branch master updated: fixed bugs due to refact
From: |
gnunet |
Subject: |
[GNUnet-SVN] [ascension] branch master updated: fixed bugs due to refactoring, changed classmethods to regular ones |
Date: |
Wed, 01 May 2019 16:48:43 +0200 |
This is an automated email from the git hooks/post-receive script.
rexxnor pushed a commit to branch master
in repository ascension.
The following commit(s) were added to refs/heads/master by this push:
new d63e299 fixed bugs due to refactoring, changed classmethods to
regular ones
d63e299 is described below
commit d63e299e150ad557300a404e604fc922bf1ebb7f
Author: rexxnor <address@hidden>
AuthorDate: Wed May 1 16:45:55 2019 +0200
fixed bugs due to refactoring, changed classmethods to regular ones
---
ascension/ascension.py | 248 ++++++++++++++++++-------------------------------
1 file changed, 92 insertions(+), 156 deletions(-)
diff --git a/ascension/ascension.py b/ascension/ascension.py
index 5c9e0b4..3f035db 100644
--- a/ascension/ascension.py
+++ b/ascension/ascension.py
@@ -82,43 +82,33 @@ class Ascender():
"""
Class that provides migration for any given domain
"""
- @classmethod
- def __init__(cls, domain, transferns, port, flags, minimum):
- cls.domain = domain
+ def __init__(self, domain, transferns, port, flags, minimum):
+ self.domain = domain
if domain[-1] == '.':
- cls.domain = cls.domain[:-1]
- cls.port = int(port)
- cls.transferns = transferns
- cls.soa = None
- cls.tld = cls.domain.split(".")[::-1][0]
- cls.zone = None
- cls.zonegenerator = None
- cls.nscache = dict()
- cls.flags = flags
- cls.minimum = int(minimum)
- cls.subzonedict = dict()
-
- @classmethod
- def initial_zone_transfer(cls, serial=None):
- """
- Initialize the zone transfer generator
- :param serial: The serial to base the transfer on
- """
-
- @classmethod
- def bootstrap_zone(cls):
+ self.domain = self.domain[:-1]
+ self.port = int(port)
+ self.transferns = transferns
+ self.soa = None
+ 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()
+
+ def bootstrap_zone(self):
"""
Creates the zone in gnunet
"""
try:
ret = sp.run([GNUNET_ZONE_CREATION_COMMAND,
- '-C', cls.domain])
+ '-C', self.domain])
logging.info("executed command: %s", " ".join(ret.args))
except sp.CalledProcessError:
- logging.info("Zone %s already exists!", cls.domain)
+ logging.info("Zone %s already exists!", self.domain)
- @classmethod
- def get_dns_zone_serial(cls, domain, resolver=None):
+ def get_dns_zone_serial(self, domain, resolver=None):
"""
Gets the current serial for a given zone
:param domain: Domain to query for in DNS
@@ -131,7 +121,7 @@ class Ascender():
# compared to AXFR/IXFR - changed to respect this
try:
soa_answer = dns.resolver.query(domain, 'SOA')
- master_answer = myresolver.query(soa_answer[0].mname, 'A')
+ master_answer = dns.resolver.query(soa_answer[0].mname, 'A')
except dns.resolver.NoAnswer:
logging.warning("The domain '%s' is not publicly resolvable.",
domain)
@@ -141,11 +131,11 @@ class Ascender():
try:
if resolver:
zone = dns.zone.from_xfr(dns.query.xfr(
- resolver, domain, port=cls.port))
+ resolver, domain, port=self.port))
else:
zone = dns.zone.from_xfr(dns.query.xfr(
master_answer[0].address, domain,
- port=cls.port))
+ port=self.port))
except dns.resolver.NoAnswer:
logging.error("Nameserver for '%s' did not answer.", domain)
except dns.exception.FormError:
@@ -156,17 +146,15 @@ class Ascender():
return None
for soa_record in zone.iterate_rdatas(rdtype=dns.rdatatype.SOA):
- if not cls.transferns:
+ if not self.transferns:
mname = soa_record[2].mname
- if cls.domain not in mname:
- cls.transferns = str(soa_record[2].mname) + "." + domain
+ if self.domain not in mname:
+ self.transferns = str(soa_record[2].mname) + "." + domain
else:
- cls.transferns = str(soa_record[2].mname)
+ self.transferns = str(soa_record[2].mname)
return soa_record[2].serial
-
- @classmethod
- def add_records_to_gns(cls):
+ def add_records_to_gns(self):
"""
Extracts records from zone and adds them to GNS
:raises AttributeError: When getting incomplete data
@@ -192,18 +180,17 @@ class Ascender():
# execute thing to run on item
label, listofrdatasets = labelrecords
subzones = label.split('.')
- domain = cls.domain
+ domain = self.domain
if len(subzones) > 1:
- ttl = cls.get_zone_refresh_time()
label = subzones[0]
subdomains = ".".join(subzones[1:])
subzone = "%s.%s" % (subdomains, domain)
fqdn = "%s.%s.%s" % (label, subdomains, domain)
- if fqdn in cls.subzonedict.keys():
+ if fqdn in self.subzonedict.keys():
label = "@"
domain = fqdn
- elif subzone in cls.subzonedict.keys():
+ elif subzone in self.subzonedict.keys():
domain = subzone
for rdataset in listofrdatasets:
@@ -213,12 +200,12 @@ class Ascender():
continue
try:
- if rdataset.ttl <= cls.minimum:
- ttl = cls.minimum
+ if rdataset.ttl <= self.minimum:
+ ttl = self.minimum
else:
ttl = rdataset.ttl
except AttributeError:
- ttl = cls.minimum
+ ttl = self.minimum
value = str(record)
@@ -228,7 +215,7 @@ class Ascender():
# modify value to fit gns syntax
rdtype, value, label = \
- cls.transform_to_gns_format(record,
+ self.transform_to_gns_format(record,
rdtype,
domain,
label)
@@ -243,7 +230,7 @@ class Ascender():
recordline.append('%d %s %s %s' %
(int(ttl),
rdtype,
- cls.flags,
+ self.flags,
element))
else:
# build recordline
@@ -255,19 +242,19 @@ class Ascender():
recordline.append('%d %s %s %s' %
(int(ttl),
rdtype,
- cls.flags,
+ self.flags,
value))
# add recordline to gns and filter out empty lines
if len(recordline) > 1:
- cls.add_recordline_to_gns(recordline,
+ self.add_recordline_to_gns(recordline,
domain,
label)
taskqueue.task_done()
# Check if there is zone has already been migrated
- nsrecords = cls.zone.iterate_rdatas(dns.rdatatype.NS)
+ nsrecords = self.zone.iterate_rdatas(dns.rdatatype.NS)
# This is broken if your NS is for ns.foo.YOURZONE as you add
# the PKEY to YOURZONE instead of to the foo.YOURZONE subzone.
@@ -275,7 +262,7 @@ class Ascender():
# bob NS IN ns.bob
# carol NS IN ns.alice
# => carol GNS2DNS GNS address@hidden
- # dave.foo NS IN gns--pkey--$KEY.bob
+ # dave.foo NS IN gns--pkey--$KEY.bob
# => dave.foo PKEY GNS $KEY
# foo.bar A IN 1.2.3.4
# => bar PKEY GNS $NEWKEY + mapping: bar => $NEWKEY
@@ -286,22 +273,22 @@ class Ascender():
ttl = gnspkey[0][1]
pkey = str(gnspkey[0][2])
# TODO Check this check
- if not cls.transferns in ['127.0.0.1', '::1', 'localhost']:
+ if not self.transferns in ['127.0.0.1', '::1', 'localhost']:
logging.warning("zone exists in GNS, adding it to local store")
- cls.add_pkey_record_to_zone(pkey[11:], cls.domain,
+ self.add_pkey_record_to_zone(pkey[11:], self.domain,
label, ttl)
return
# Unify all records under same label into datastructure
customrdataset = dict()
- for remaining in cls.zone.iterate_rdatasets():
+ for remaining in self.zone.iterate_rdatasets():
# build lookup table for later GNS2DNS records
- domain = "%s.%s" % (str(remaining[0]), cls.domain)
+ 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))
- cls.nscache[str(domain)] = elementlist
+ self.nscache[str(domain)] = elementlist
rdataset = remaining[1]
if customrdataset.get(str(remaining[0])) is None:
work = list()
@@ -317,21 +304,23 @@ class Ascender():
subzones = label.split('.')
label = subzones[0]
subdomain = ".".join(subzones[1:])
- zonename = "%s.%s" % (subdomain, cls.domain)
+ zonename = "%s.%s" % (subdomain, self.domain)
- refresh = cls.get_zone_refresh_time()
- if refresh <= cls.minimum:
- ttl = cls.minimum
- else:
- ttl = refresh
+ try:
+ if value.ttl <= self.minimum:
+ ttl = self.minimum
+ else:
+ ttl = rdataset.ttl
+ except AttributeError:
+ ttl = self.minimum
if len(subzones) > 1:
- if cls.subzonedict.get(zonename):
+ if self.subzonedict.get(zonename):
continue
else:
- cls.subzonedict[zonename] = (False, ttl)
+ self.subzonedict[zonename] = (False, ttl)
- cls.create_zone_hierarchy()
+ self.create_zone_hierarchy()
# Create one thread
thread = threading.Thread(target=worker)
@@ -353,7 +342,8 @@ class Ascender():
logging.critical("thread join timed out, still running")
# Add soa record to GNS once completed (updates the previous one)
- cls.add_soa_record_to_gns(cls.soa)
+ self.add_soa_record_to_gns(self.soa)
+
logging.info("All records have been added!")
@staticmethod
@@ -380,8 +370,7 @@ class Ascender():
logging.info("successfully added record with command %s",
' '.join(ret.args))
- @classmethod
- def transform_to_gns_format(cls, record, rdtype, zonename, label):
+ def transform_to_gns_format(self, record, rdtype, zonename, label):
"""
Transforms value of record to GNS compatible format
:param record: record to transform
@@ -401,8 +390,8 @@ class Ascender():
if owner[-1] == '.':
owner = owner[:-1]
# hacky and might cause bugs
- authns += cls.tld
- owner += cls.tld
+ authns += self.tld
+ owner += self.tld
value = "rname=%s.%s mname=%s.%s %d,%d,%d,%d,%d" % (
authns, zonename, owner, zonename,
int(serial), int(refresh), int(retry),
@@ -423,10 +412,10 @@ class Ascender():
zonename = zonename[:-1]
if nameserver[-1] == ".":
dnsresolver = nameserver[:-1]
- dnsresolver = cls.nscache.get(dnsresolver, dnsresolver)
+ dnsresolver = self.nscache.get(dnsresolver, dnsresolver)
else:
dnsresolver = "%s.%s" % (nameserver, zonename)
- dnsresolver = cls.nscache.get(dnsresolver, dnsresolver)
+ dnsresolver = self.nscache.get(dnsresolver, dnsresolver)
if isinstance(dnsresolver, list):
value = []
for nsip in dnsresolver:
@@ -480,8 +469,7 @@ class Ascender():
logging.info("Did not transform record of type: %s", rdtype)
return (rdtype, value, label)
- @classmethod
- def get_gns_zone_serial(cls):
+ def get_gns_zone_serial(self):
"""
Fetches the zones serial from GNS
:returns: serial of the SOA record in GNS
@@ -489,7 +477,7 @@ class Ascender():
try:
serial = sp.check_output([GNUNET_GNS_COMMAND,
'-t', 'SOA',
- '-u', '@.%s' % cls.domain,])
+ '-u', '@.%s' % self.domain,])
serial = serial.decode()
except sp.CalledProcessError:
serial = ""
@@ -501,58 +489,13 @@ class Ascender():
soa_serial = None
return soa_serial
- @classmethod
- def get_zone_soa_expiry(cls):
+ def get_zone_soa_expiry(self):
"""
Extracts the current serial from the class SOA
:returns: refresh time of the current SOA record
"""
ttlpattern = re.compile(r'.+\s\d+\s(\d+)\s\d+\s\d+\s\d+', re.M)
- return re.findall(ttlpattern, str(cls.soa[2]))
-
- @classmethod
- def get_zone_refresh_time(cls):
- """
- @deprecated (use from DNS)
- Extracts the current refresh time of the zone from GNS
- :returns: refresh time of the current SOA record
- """
- try:
- serial = sp.check_output([GNUNET_GNS_COMMAND,
- '-t', 'SOA',
- '-u', '@.%s' % cls.domain])
- serial = serial.decode()
- except sp.CalledProcessError:
- serial = ""
- refresh = None
- soapattern = re.compile(r'.+\s\d+,(\d+),\d+,\d+,\d+', re.M)
- if re.findall(soapattern, serial):
- refresh = re.findall(soapattern, serial)[0]
- else:
- refresh = None
- return int(refresh)
-
- @classmethod
- def get_zone_retry_time(cls):
- """
- @deprecated (use from DNS)
- Extracts the current retry time of the zone from GNS
- :returns: retry time of the current SOA record
- """
- try:
- serial = sp.check_output([GNUNET_GNS_COMMAND,
- '-t', 'SOA',
- '-u', '@.%s' % cls.domain])
- serial = serial.decode()
- except sp.CalledProcessError:
- serial = ""
- retry = 300
- soapattern = re.compile(r'.+\s\d+,\d+,(\d+),\d+,\d+', re.M)
- if re.findall(soapattern, serial):
- retry = re.findall(soapattern, serial)[0]
- else:
- retry = 300
- return retry
+ return re.findall(ttlpattern, str(self.soa[2]))
@staticmethod
def get_zone_soa(zone):
@@ -567,8 +510,7 @@ class Ascender():
soa = soarecord
return soa
- @classmethod
- def add_soa_record_to_gns(cls, record):
+ def add_soa_record_to_gns(self, record):
"""
Adds a SOA record to GNS
:param record: The record to add
@@ -579,11 +521,11 @@ class Ascender():
if authns[-1] == '.':
authns = authns[:-1]
else:
- authns = "%s.%s" % (authns, cls.domain)
+ authns = "%s.%s" % (authns, self.domain)
if owner[-1] == '.':
owner = owner[:-1]
else:
- owner = "%s.%s" % (owner, cls.domain)
+ owner = "%s.%s" % (owner, self.domain)
value = "rname=%s mname=%s %s,%s,%s,%s,%s" % (authns,
owner,
@@ -592,9 +534,9 @@ class Ascender():
retry,
expiry,
irefresh)
- recordval = '%s %s %s %s' % (ttl, "SOA", cls.flags, str(value))
+ recordval = '%s %s %s %s' % (ttl, "SOA", self.flags, str(value))
recordline = ['-R', recordval]
- cls.add_recordline_to_gns(recordline, cls.domain, str(label))
+ self.add_recordline_to_gns(recordline, self.domain, str(label))
@staticmethod
def create_zone_and_get_pkey(zonestring):
@@ -658,25 +600,24 @@ class Ascender():
label, domain)
#logging.warning("PKEY record %s already exists in %s", label, domain)
- @classmethod
- def create_zone_hierarchy(cls):
+ def create_zone_hierarchy(self):
"""
Creates the zone hierarchy in GNS for label
:param label: the split record to create zones for
"""
- domain = cls.domain
+ domain = self.domain
- zonelist = cls.subzonedict.items()
+ zonelist = self.subzonedict.items()
sortedlist = sorted(zonelist, key=lambda s: len(str(s).split('.')))
for zone, pkeyttltuple in sortedlist:
pkey, ttl = pkeyttltuple
if not pkey:
domain = ".".join(zone.split('.')[1::])
label = zone.split('.')[0]
- pkey = cls.create_zone_and_get_pkey(zone)
+ pkey = self.create_zone_and_get_pkey(zone)
logging.info("adding zone %s with %s pkey into %s", zone,
pkey, domain)
- cls.add_pkey_record_to_zone(pkey, domain, label,
pkeyttltuple[1])
- cls.subzonedict[zone] = (pkey, ttl)
+ self.add_pkey_record_to_zone(pkey, domain, label,
pkeyttltuple[1])
+ self.subzonedict[zone] = (pkey, ttl)
def main():
"""
@@ -724,32 +665,38 @@ def main():
ascender.zonegenerator = dns.query.xfr(ascender.transferns,
ascender.domain,
port=ascender.port)
- dns_zone_serial = int(ascender.get_dns_zone_serial(ascender.domain,
ascender.transferns))
- if int(gns_zone_serial) == dns_zone_serial:
+ dns_zone_serial = ascender.get_dns_zone_serial(ascender.domain,
ascender.transferns)
+ if not dns_zone_serial:
+ logging.error("Could not get DNS zone serial")
+ if standalone:
+ return 1
+ time.sleep(retry)
+ continue
+ if not gns_zone_serial:
+ logging.info("GNS zone does not exist yet, performing full
transfer.")
+ ascender.bootstrap_zone()
+ elif int(gns_zone_serial) == int(dns_zone_serial):
logging.info("GNS zone is up to date.")
if standalone:
return 0
time.sleep(refresh)
continue
- if int(gns_zone_serial) > dns_zone_serial:
+ elif int(gns_zone_serial) > int(dns_zone_serial):
logging.critical("SOA serial in GNS is bigger than SOA serial in
DNS?")
logging.critical("GNS zone: %s, DNS zone: %s", gns_zone_serial,
dns_zone_serial)
if standalone:
return 1
time.sleep(retry)
continue
- if not gns_zone_serial:
- logging.info("GNS zone does not exist yet, performing full
transfer.")
- ascender.bootstrap_zone()
- else
+ else:
logging.info("GNS zone is out of date, performing incremental
transfer.")
+
try:
ascender.zone = dns.zone.from_xfr(ascender.zonegenerator,
check_origin=False)
ascender.soa = ascender.get_zone_soa(ascender.zone)
- # FIXME: use DNS SOA (ascender.soa), from above, if fail retry
time, if success refresh time
- refresh = int(ascender.get_zone_refresh_time())
- retry = int(ascender.get_zone_retry_time())
+ refresh = str(ascender.soa[2]).split(" ")[4]
+ retry = str(ascender.soa[2]).split(" ")[5]
except dns.zone.BadZone:
logging.critical("Malformed DNS Zone '%s'", ascender.domain)
if standalone:
@@ -757,19 +704,8 @@ def main():
time.sleep(retry)
continue
- # FIXME: return value (or exception) to observe success/failure of
operation!
ascender.add_records_to_gns()
logging.info("Finished migration of the zone %s", ascender.domain)
- if standalone:
- # FIXME: return non-zero on errors!
- return 0
- if not refresh: # FIXME: if not successful with add_records_to_gns!
- logging.info("Unable to refresh zone, retrying in %ds", retry)
- time.sleep(retry)
- else:
- logging.info("Refreshing zone in %ds", refresh)
- print("Refreshing zone in %ds" % refresh)
- time.sleep(refresh)
if __name__ == '__main__':
main()
--
To stop receiving notification emails like this one, please contact
address@hidden
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] [ascension] branch master updated: fixed bugs due to refactoring, changed classmethods to regular ones,
gnunet <=