[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [ascension] branch master updated (50a2f4a -> 43c0633)
From: |
gnunet |
Subject: |
[GNUnet-SVN] [ascension] branch master updated (50a2f4a -> 43c0633) |
Date: |
Wed, 30 Jan 2019 18:52:30 +0100 |
This is an automated email from the git hooks/post-receive script.
rexxnor pushed a change to branch master
in repository ascension.
from 50a2f4a updated docstrings
new c05fb19 fixed creation zone for non-bailiwick records. bugfixes
new 459db26 minor cleanup
new 009bac3 flags adjustment and soa record is now public by default
new 43c0633 removed daemonization
The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
README | 16 +++---
ascension/ascension.py | 150 +++++++++++++++++++++++++++++++------------------
setup.py | 4 +-
3 files changed, 105 insertions(+), 65 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..dc7d871 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.
@@ -48,8 +50,6 @@ import dns.query
import dns.resolver
import dns.zone
import docopt
-import daemon
-from daemonize import Daemonize
# GLOBALS
GNUNET_ZONE_CREATION_COMMAND = 'gnunet-identity'
@@ -68,15 +68,18 @@ class Ascender():
Class that provides migration for any given domain
"""
@classmethod
- def __init__(cls, domain, transferns, port):
+ def __init__(cls, domain, transferns, port, flags):
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()
+ cls.flags = flags
@classmethod
def initial_zone_transfer(cls, serial=None):
@@ -115,15 +118,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:
@@ -177,16 +182,16 @@ class Ascender():
logging.warning("zone: %s, current: %s", zoneserial, currentserial)
@classmethod
- def add_records_to_gns(cls, flags="n"):
+ def add_records_to_gns(cls):
"""
Extracts records from zone and adds them to GNS
- :param flags: Flag to set in GNS, defaults to n (no flags)
:raises AttributeError: When getting incomplete data
"""
logging.info("Starting to add records into GNS...")
# Defining FIFO Queue
taskqueue = queue.Queue(maxsize=5)
+
# Defining worker
def worker():
while True:
@@ -203,23 +208,21 @@ class Ascender():
# execute thing to run on item
label, listofrdatasets = labelrecords
- 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
+ # subzones = label.split('.')
+ # 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 +245,29 @@ 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 isinstance(value, list):
+ for element in value:
+ # build recordline
+ recordline.append("-R")
+ recordline.append('%d %s %s %s' %
+ (int(ttl),
+ rdtype,
+ cls.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,
+ cls.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 +279,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 +315,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 +339,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 +357,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),
@@ -346,8 +373,8 @@ class Ascender():
if nameserver[0:2] == 'uz5':
logging.info("zone has a dnscurve record")
# TODO extract public key from NS record (dnscurve)
- #encoded_pkey = nameserver[2:].split('.')[0]
- #pkey =
+ # encoded_pkey = nameserver[2:].split('.')[0]
+ # pkey =
if value[-1] == ".":
value = value[:-1]
else:
@@ -356,9 +383,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,32 +520,36 @@ 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)
),
- '-e', '%ds' % ttl])
+ '-e', '%ds' % ttl,
+ # maybe don't make it public by default
+ '-p'])
logging.info("executed command: %s", " ".join(ret.args))
if ret.returncode != 0:
logging.warning("failed to add %s record %s", "SOA", "@")
@@ -610,13 +649,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:
@@ -630,7 +670,7 @@ def main():
sys.exit(1)
# Initialize class instance
- ascender = Ascender(domain, transferns, port)
+ ascender = Ascender(domain, transferns, port, flags)
# Event loop for actual daemon
while 1:
@@ -651,6 +691,4 @@ def main():
time.sleep(refresh)
if __name__ == '__main__':
- PIDFILE = daemon.pidfile.TimeoutPIDLockFile
- DAEMON = Daemonize(app="ascension", pid=PIDFILE, action=main)
- DAEMON.start()
+ main()
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
- [GNUnet-SVN] [ascension] branch master updated (50a2f4a -> 43c0633),
gnunet <=