gnunet-svn
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]