[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [ascension] 01/04: fixed creation zone for non-bailiwick re
From: |
gnunet |
Subject: |
[GNUnet-SVN] [ascension] 01/04: fixed creation zone for non-bailiwick records. bugfixes |
Date: |
Wed, 30 Jan 2019 18:52:31 +0100 |
This is an automated email from the git hooks/post-receive script.
rexxnor pushed a commit to branch master
in repository ascension.
commit c05fb19bbcaa05b3d83fa78ea3fbf4a1f0a8c8bd
Author: rexxnor <address@hidden>
AuthorDate: Wed Jan 30 14:01:10 2019 +0100
fixed creation zone for non-bailiwick records. bugfixes
---
README | 16 ++++---
ascension/ascension.py | 121 +++++++++++++++++++++++++++++++------------------
setup.py | 4 +-
3 files changed, 89 insertions(+), 52 deletions(-)
diff --git a/README b/README
index 88bb2af..ae28c5a 100644
--- a/README
+++ b/README
@@ -38,17 +38,19 @@ Taken from the docstring of the ascension.py file:
Ascension
Usage:
- ascension.py <domain> [-d]
- ascension.py <domain> -p <port> [-d]
- ascension.py <domain> -ns <transferns> [-d]
- ascension.py <domain> -ns <transferns> -p <port> [-d]
- ascension.py -h | --help
- ascension.py -v | --version
+ ascension <domain> [-d] [-p]
+ ascension <domain> <port> [-d] [-p]
+ ascension <domain> -ns <transferns> [-d] [-p]
+ ascension <domain> -ns <transferns> <port> [-d] [-p]
+ ascension -p | --public
+ ascension -h | --help
+ ascension -v | --version
Options:
- <port> Port for zone transfer
<domain> Domain to migrate
+ <port> Port for zone transfer
<transferns> DNS Server that does the zone transfer
+ -p --public Make records public on the DHT
-d --debug Enable debugging
-h --help Show this screen.
-v --version Show version.
diff --git a/ascension/ascension.py b/ascension/ascension.py
index 9fbd3e3..4008d28 100644
--- a/ascension/ascension.py
+++ b/ascension/ascension.py
@@ -20,17 +20,19 @@
# Author rexxnor
"""
Usage:
- ascension <domain> [-d]
- ascension <domain> -p <port> [-d]
- ascension <domain> -ns <transferns> [-d]
- ascension <domain> -ns <transferns> -p <port> [-d]
+ ascension <domain> [-d] [-p]
+ ascension <domain> <port> [-d] [-p]
+ ascension <domain> -ns <transferns> [-d] [-p]
+ ascension <domain> -ns <transferns> <port> [-d] [-p]
+ ascension -p | --public
ascension -h | --help
ascension -v | --version
Options:
- <port> Port for zone transfer
<domain> Domain to migrate
+ <port> Port for zone transfer
<transferns> DNS Server that does the zone transfer
+ -p --public Make records public on the DHT
-d --debug Enable debugging
-h --help Show this screen.
-v --version Show version.
@@ -70,13 +72,15 @@ class Ascender():
@classmethod
def __init__(cls, domain, transferns, port):
cls.domain = domain
- if cls.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()
@classmethod
def initial_zone_transfer(cls, serial=None):
@@ -115,15 +119,17 @@ class Ascender():
:param resolver: Nameserver to query in DNS, defaults to None
:returns: Serial of the zones SOA record
"""
+ # Makes domains better resolvable
+ domain = domain + "."
# SOA is different if taken directly from SOA record
# compared to AXFR/IXFR - changed to respect this
try:
soa_answer = dns.resolver.query(domain, 'SOA')
except dns.resolver.NoAnswer:
- logging.critical("the domain '%s' does not exist")
+ logging.critical("the domain '%s' does not exist", domain)
sys.exit(1)
except dns.resolver.NXDOMAIN:
- logging.critical("the domain '%s' is invalid")
+ logging.critical("the domain '%s' is invalid", domain)
sys.exit(1)
master_answer = dns.resolver.query(soa_answer[0].mname, 'A')
try:
@@ -187,6 +193,7 @@ class Ascender():
# Defining FIFO Queue
taskqueue = queue.Queue(maxsize=5)
+
# Defining worker
def worker():
while True:
@@ -205,21 +212,20 @@ class Ascender():
subzones = label.split('.')
- # ignore SRV records here
- if len(subzones) == 2 and subzones[0][0] == "_":
- pass
- elif len(subzones) > 1:
- ttl = cls.soa[1]
- cls.create_zone_hierarchy(subzones, ttl)
- label = subzones[0]
- subdomains = ".".join(subzones[1:])
- domain = "%s.%s" % (subdomains, cls.domain)
+ # TODO Add the not-in-bailiwick case
+ # elif len(subzones) > 1:
+ # ttl = cls.soa[1]
+ # cls.create_zone_hierarchy(subzones, ttl)
+ # label = subzones[0]
+ # subdomains = ".".join(subzones[1:])
+ # domain = "%s.%s" % (subdomains, cls.domain)
for rdataset in listofrdatasets:
for record in rdataset:
rdtype = dns.rdatatype.to_text(record.rdtype)
if rdtype not in SUPPORTED_RECORD_TYPES:
continue
+
try:
ttl = rdataset.ttl
except AttributeError:
@@ -242,16 +248,23 @@ class Ascender():
if value is None:
continue
- # build recordline
- recordline.append("-R")
-
- # TODO possible regression here; maybe use a separate
- # list to pass those arguments to prevent quoting
- # issues in the future.
- recordline.append('%d %s %s %s' %
- (int(ttl), rdtype, flags, value))
-
- # add recordline to gns
+ if type(value) is list:
+ for element in value:
+ # build recordline
+ recordline.append("-R")
+ recordline.append('%d %s %s %s' %
+ (int(ttl), rdtype, flags,
element))
+ else:
+ # build recordline
+ recordline.append("-R")
+
+ # TODO possible regression here; maybe use a
separate
+ # list to pass those arguments to prevent quoting
+ # issues in the future.
+ recordline.append('%d %s %s %s' %
+ (int(ttl), rdtype, flags, value))
+
+ # add recordline to gns and filter out empty lines
if len(recordline) > 1:
cls.add_recordline_to_gns(recordline,
domain if domain else cls.domain,
@@ -263,9 +276,17 @@ class Ascender():
thread = threading.Thread(target=worker)
thread.start()
+ # Unify all records under same label into datastructure
customrdataset = dict()
try:
for remaining in cls.zone.iterate_rdatasets():
+ # build lookup table for later GNS2DNS records
+ domain = "%s.%s" % (str(remaining[0]), cls.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
rdataset = remaining[1]
if customrdataset.get(str(remaining[0])) is None:
work = list()
@@ -291,7 +312,7 @@ class Ascender():
# Add soa record to GNS once completed (updates the previous one)
soa = cls.get_zone_soa(cls.zone)
- cls.add_soa_record_to_gns(soa, cls.domain)
+ cls.add_soa_record_to_gns(soa)
logging.info("All records have been added!")
@staticmethod
@@ -315,8 +336,8 @@ class Ascender():
logging.info("successfully added record with name %s",
' '.join(ret.args))
- @staticmethod
- def transform_to_gns_format(record, rdtype, zonename, label):
+ @classmethod
+ def transform_to_gns_format(cls, record, rdtype, zonename, label):
"""
Transforms value of record to GNS compatible format
:param record: record to transform
@@ -333,6 +354,9 @@ class Ascender():
authns = authns[:-1]
if owner[-1] == '.':
owner = owner[:-1]
+ # hacky and might cause bugs
+ authns += cls.tld
+ owner += cls.tld
value = "rname=%s.%s mname=%s.%s %d,%d,%d,%d,%d" % (
authns, zonename, owner, zonename,
int(serial), int(refresh), int(retry),
@@ -356,9 +380,17 @@ class Ascender():
zonename = zonename[:-1]
if nameserver[-1] == ".":
dnsresolver = nameserver[:-1]
+ dnsresolver = cls.nscache.get(dnsresolver, dnsresolver)
else:
dnsresolver = "%s.%s" % (nameserver, zonename)
- value = 'address@hidden' % (str(label), zonename, dnsresolver)
+ dnsresolver = cls.nscache.get(dnsresolver, dnsresolver)
+ if isinstance(dnsresolver, list):
+ value = []
+ for nsip in dnsresolver:
+ value.append("address@hidden" % (str(label), zonename,
nsip))
+ else:
+ value = 'address@hidden' % (str(label), zonename, dnsresolver)
+
logging.info("transformed %s record to GNS2DNS format", rdtype)
rdtype = 'GNS2DNS'
elif rdtype == 'MX':
@@ -485,28 +517,30 @@ class Ascender():
soa = soarecord
return soa
- @staticmethod
- def add_soa_record_to_gns(record, zonename):
+ @classmethod
+ def add_soa_record_to_gns(cls, record):
"""
Adds a SOA record to GNS
:param record: The record to add
- :param zonename: The zone to which to add the record
"""
- _, ttl, rdata = record
+ label, ttl, rdata = record
zonetuple = str(rdata).split(' ')
- domain = zonename
- zonename = str(".".join(zonename.split('.')[:-1]))
authns, owner, serial, refresh, retry, expiry, irefresh = zonetuple
if authns[-1] == '.':
authns = authns[:-1]
+ else:
+ authns = "%s.%s" % (authns, cls.domain)
if owner[-1] == '.':
owner = owner[:-1]
+ else:
+ owner = "%s.%s" % (owner, cls.domain)
+
ret = sp.run([GNUNET_NAMESTORE_COMMAND,
- '-z', domain,
- '-a', '-n', '@',
+ '-z', cls.domain,
+ '-a', '-n', str(label),
'-t', 'SOA',
- '-V', "rname=%s.%s mname=%s.%s %d,%d,%d,%d,%d"
- % (authns, zonename, owner, zonename,
+ '-V', "rname=%s mname=%s %d,%d,%d,%d,%d"
+ % (authns, owner,
int(serial), int(refresh), int(retry),
int(expiry), int(irefresh)
),
@@ -610,13 +644,14 @@ def main():
Initializes object and handles arguments
"""
# argument parsing from docstring definition
- args = docopt.docopt(__doc__, version='Ascension 0.3.0')
+ args = docopt.docopt(__doc__, version='Ascension 0.5.0')
# argument parsing
debug = args['--debug']
domain = args.get('<domain>', None)
transferns = args['<transferns>'] if args['<transferns>'] else None
port = args['<port>'] if args['<port>'] else 53
+ flags = "p" if args.get('--public') else "n"
# Change logging severity to debug
if debug:
@@ -638,7 +673,7 @@ def main():
ascender.initial_zone_transfer(serial)
ascender.mirror_zone()
ascender.bootstrap_zone()
- ascender.add_records_to_gns()
+ ascender.add_records_to_gns(flags=flags)
logging.info("Finished migrating of the zone %s", ascender.domain)
refresh = int(ascender.get_zone_refresh_time())
retry = int(ascender.get_zone_retry_time())
diff --git a/setup.py b/setup.py
index 6d33e49..f4731cf 100644
--- a/setup.py
+++ b/setup.py
@@ -23,12 +23,12 @@ Author rexxnor
import setuptools
-with open("README.md", "r") as fh:
+with open("README", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="ascension",
- version="0.4.0",
+ version="0.5.0",
author="rexxnor",
author_email="address@hidden",
description="Tool to migrate DNS Zones to the GNU Name System",
--
To stop receiving notification emails like this one, please contact
address@hidden