gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[ascension] 01/02: refactored argument parsing and updated man page acco


From: gnunet
Subject: [ascension] 01/02: refactored argument parsing and updated man page accordingly
Date: Tue, 05 May 2020 21:04:05 +0200

This is an automated email from the git hooks/post-receive script.

rexxnor pushed a commit to branch master
in repository ascension.

commit c7b20648a731b7a9ba07e3b42fa4e6fc410b333c
Author: rexxnor <address@hidden>
AuthorDate: Sun Apr 26 12:15:57 2020 +0200

    refactored argument parsing and updated man page accordingly
    
    - switched from docopt to argparse
    - improved docstring by removing docopt format
    - updated man page with more verbose instructions
---
 README                 |  43 +++++++--------
 ascension-0.5.0.tar.gz | Bin 9836 -> 0 bytes
 ascension-0.6.1.tar.gz | Bin 10617 -> 0 bytes
 ascension.1            |  74 ++++++++++++++-----------
 ascension/ascension.py | 146 ++++++++++++++++++++++++++-----------------------
 5 files changed, 138 insertions(+), 125 deletions(-)

diff --git a/README b/README
index ed6e926..bda0fbc 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-# Ascension
+#Ascension
 
 Tool to easily migrate existing DNS Zones into the GNU Name System using
 incremental zone transfers (AXFR/IXFR).
@@ -35,30 +35,25 @@ You can also just run the file ascension.py itself directly.
 
 Taken from the docstring of the ascension.py file:
 ```
-Ascension
+usage: ascension.py [-h] [-n NAMESERVER] [-P PORT] [-t] [-s] [-p] [-g] [-v] 
[-V] domain
+
+Easy tool to migrate DNS zones into GNS
 
-Usage:
-    ascension <domain> [-d] [-p] [-s] [--minimum-ttl=<ttl>] [--dry-run]
-    ascension <domain> <port> [-d] [-p] [-s] [--minimum-ttl=<ttl>] [--dry-run]
-    ascension <domain> -n <transferns> [-d] [-p] [-s] [--minimum-ttl=<ttl>] 
[--dry-run]
-    ascension <domain> -n <transferns> <port> [-d] [-p] [-s] 
[--minimum-ttl=<ttl>] [--dry-run]
-    ascension -p | --public
-    ascension -s | --debug
-    ascension -s | --standalone
-    ascension -h | --help
-    ascension -v | --version
+positional arguments:
+  domain                Domain to be migrated
 
-Options:
-    <domain>              Domain to migrate
-    <port>                Port for zone transfer
-    <transferns>          DNS Server that does the zone transfer
-    --minimum-ttl=<ttl>   Minimum TTL for records to migrate [default: 3600]
-    --dry-run             Only try if a zone transfer is allowed
-    -p --public           Make records public on the DHT
-    -s --standalone       Run ascension once
-    -d --debug            Enable debugging
-    -h --help         Show this screen.
-    -v --version      Show version.
+optional arguments:
+  -h, --help            show this help message and exit
+  -n NAMESERVER, --nameserver NAMESERVER
+                        Nameserver to use for migrating
+  -P PORT, --port PORT  Port to use for zone transfer with nameserver
+  -t, --ttl             Sets TTL of records lower than TTL to specified TTL
+  -s, --standalone      Run ascension once and not as daemon
+  -p, --public          Push records to the public DHT
+  -g, --dryrun          Tests if zone is transferrable without changing 
anything
+  -v, --verbose         Enable verbose debugging
+  -V, --version         show program's version number and exit
+Ascension
 ```
 
 Example use:
@@ -66,5 +61,5 @@ Example use:
 # Transfers the sy TLD from ns1.tld.sy.
 ascension sy -n ns1.tld.sy.
 # Transfers the nu TLD from zonedata.iis.se with debug options enabled
-ascension nu -n zonedata.iis.se. -d
+ascension nu -n zonedata.iis.se. -v
 ```
diff --git a/ascension-0.5.0.tar.gz b/ascension-0.5.0.tar.gz
deleted file mode 100644
index b0468bc..0000000
Binary files a/ascension-0.5.0.tar.gz and /dev/null differ
diff --git a/ascension-0.6.1.tar.gz b/ascension-0.6.1.tar.gz
deleted file mode 100644
index f306bab..0000000
Binary files a/ascension-0.6.1.tar.gz and /dev/null differ
diff --git a/ascension.1 b/ascension.1
index c28f84b..e364695 100644
--- a/ascension.1
+++ b/ascension.1
@@ -21,56 +21,64 @@
 .\"
 .\" SPDX-License-Identifier: GPL3.0-or-later OR FDL1.3-or-later
 .\"
-.Dd May 9, 2019
+.Dd April 26, 2020
 .Dt ASCENSION 1
 .Os
 .Sh NAME
-.Nm ascension
+.Nm Ascension
 .Nd migrate existing DNS zones into the GNU Name System
 .Sh SYNOPSIS
-.Nm
-.Op Ar domain Fl d Fl p Fl s -minimum-ttl=<ttl> -dry-run
-.Nm
-.Op Ar domain port Fl d Fl p Fl s -minimum-ttl=<ttl> -dry-run
-.Nm
-.Op Ar domain Fl n Ar transferns Fl d Fl p Fl s Fl -minimum-ttl=<ttl> -dry-run
-.Nm
-.Op Ar domain Fl n Ar transferns Ar port Fl d Fl p Fl s -minimum-ttl=<ttl> 
-dry-run
+.Op -n NAMESERVER
+.Op -P PORT
+.Op -t TTL
+.Op -s
+.Op -p
+.Op -v
+.Op -g
+.Op -V
+domain
 .Sh DESCRIPTION
 .Nm
 is a tool to migrate existing DNS Zones into the GNU Name System (GNS) using 
incremental zone transfers (AXFR/IXFR).
-To achieve this it uses
+To achieve this it calls
 .Xr gnunet-identity 1 ,
 .Xr gnunet-namestore 1 ,
 .Xr gnunet-gns 1 .
-As
 .Nm
-relies on these 3 GNUnet services,
+relies on GNUnet and these 3 GNUnet services,
 .Xr gnunet-arm 1
 must be installed and running.
 .Bl -tag -width Ds
-.It Ar domain Fl d Fl p Fl s -minimum-ttl=<ttl> -dry-run
-Migrate the DOMAIN passed as domain.
-The debug, public and standalone options are optional.
-.It Ar domain port Fl d Fl p Fl s -minimum-ttl=<ttl> -dry-run
-Migrate the DOMAIN domain, using port for zone transfer.
-The debug, public and standalone options are optional.
-.It Ar domain Fl n Ar transferns Fl d Fl p Fl s -minimum-ttl=<ttl> -dry-run
-Migrate the DOMAIN domain from the DNS server transferns.
-The debug, public and standalone options are optional.
-.It Ar domain Fl n Ar transferns Ar port Fl d Fl p Fl s -minimum-ttl=<ttl> 
-dry-run
-Migrate the DOMAIN domain from the DNS server transferns using port for the 
zone transfer.
-The debug, public and standalone options are optional.
+.It Ar domain
+The domain that should be migrated to the GNU Name System (GNS)
+.It Fl n | \-nameserver Ar NAMESERVER
+Nameserver to contact for zone transfer. Defaults to name server listed in the 
SOA record
+.It Fl p | \-port Ar PORT
+Use the specified port when contacting the nameserver to transfer the zone
+.It Fl t | \-ttl Ar TTL
+When adding records to GNS a small ttl in DNS can cause issues as records need
+to be resigned often (every ttl seconds as recordsets in GNS are signed with an
+absolut expiration time) to remain valid. Therefore this ttl specifies the
+lowest ttl a record will have in GNS.
 .It Fl s | \-standalone
-Run Ascension once
-.It Fl d | \-debug
-Enable debugging
-.It Fl h | \-help
-Print short help on options
+Run Ascension to migrate a zone once. If not specified it will run as a daemon
+that updates the zone after the expiry specified in the zones SOA record has
+elapsed.
+.It Fl v | \-verbose
+Increase logging verbosity. Shows more log levels than default including INFO,
+DEBUG and WARNING.
 .It Fl p | \-public
-Make records public on the DHT
+Set the public flag for records and publish them on the DHT. When in possession
+of the public key of the zone in BASE32 format anyone can resolve a record
+within the zone provided they also know the label under which the recorset is
+stored.
+.It Fl g | \-dryrun
+Checks whether or not the domains nameserver supports zone transfer for the
+given domain. When a nameserver is specified it will be checked instead.
+.It Fl h | \-help
+Show the usage and argument syntax of Ascension.
 .It Fl v | \-version
-Print ascension version number
+Show the current version number
 .El
 .\" .Sh FILES
 .Sh EXAMPLES
@@ -78,7 +86,7 @@ To transfer the sy TLD from ns1.tld.sy:
 .Pp
 .Dl $ ascension sy -n ns1.tld.sy.
 .Pp
-To transfer the nu TLD from zonedata.iis.se with debug options enabled:
+To test if the given domains nameserver supports zone transfers for that zone:
 .Pp
 .Dl $ ascension nu -n zonedata.iis.se. -d
 .Sh SEE ALSO
diff --git a/ascension/ascension.py b/ascension/ascension.py
index bb65b13..e756bc6 100644
--- a/ascension/ascension.py
+++ b/ascension/ascension.py
@@ -1,49 +1,28 @@
 #!/usr/bin/env python3
-# This file is part of Ascension.
-# Copyright (C) 2019 GNUnet e.V.
-#
-# Ascension is free software: you can redistribute it and/or modify it
-# under the terms of the GNU Affero General Public License as published
-# by the Free Software Foundation, either version 3 of the License,
-# or (at your option) any later version.
-#
-# Ascension is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-# SPDX-License-Identifier: AGPL3.0-or-later
-#
-# Author rexxnor
 """
-Usage:
-    ascension <domain> [-d] [-p] [-s] [--minimum-ttl=<ttl>] [--dry-run]
-    ascension <domain> <port> [-d] [-p] [-s] [--minimum-ttl=<ttl>] [--dry-run]
-    ascension <domain> -n <transferns> [-d] [-p] [-s] [--minimum-ttl=<ttl>] 
[--dry-run]
-    ascension <domain> -n <transferns> <port> [-d] [-p] [-s] 
[--minimum-ttl=<ttl>] [--dry-run]
-    ascension -p | --public
-    ascension -d | --debug
-    ascension -s | --standalone
-    ascension -h | --help
-    ascension -v | --version
-
-Options:
-    <domain>              Domain to migrate
-    <port>                Port for zone transfer
-    <transferns>          DNS Server that does the zone transfer
-    --minimum-ttl=<ttl>   Minimum TTL for records to migrate [default: 3600]
-    --dry-run             Only try if a zone transfer is allowed
-    -p --public           Make records public on the DHT
-    -s --standalone       Run ascension once
-    -d --debug            Enable debugging
-    -h --help         Show this screen.
-    -v --version      Show version.
+This file is part of Ascension.
+Copyright (C) 2019-2020 GNUnet e.V.
+
+Ascension is free software: you can redistribute it and/or modify it
+under the terms of the GNU Affero General Public License as published
+by the Free Software Foundation, either version 3 of the License,
+or (at your option) any later version.
+
+Ascension is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+SPDX-License-Identifier: AGPL3.0-or-later
+
+Author rexxnor
 """
 
 # imports
+import argparse
 import logging
 import os
 import queue
@@ -56,13 +35,13 @@ import threading
 import dns.query
 import dns.resolver
 import dns.zone
-import docopt
 
 # GLOBALS for different environments
 GNUNET_ZONE_CREATION_COMMAND = 'gnunet-identity'
 GNUNET_NAMESTORE_COMMAND = 'gnunet-namestore'
 GNUNET_GNS_COMMAND = 'gnunet-gns'
 GNUNET_ARM_COMMAND = 'gnunet-arm'
+
 # This is the list of record types Ascension (and GNS) currently
 # explicitly supports.  Record types we encounter that are not
 # in this list and not in the OBSOLETE_RECORD_TYPES list will
@@ -70,6 +49,7 @@ GNUNET_ARM_COMMAND = 'gnunet-arm'
 SUPPORTED_RECORD_TYPES = [
     "A", "AAAA", "NS", "MX", "SRV", "TXT", "CNAME"
 ]
+
 # Record types that exist in DNS but that won't ever exist in GNS
 # as they are not needed anymore (so we should not create a warning
 # if we drop one of these).
@@ -122,7 +102,7 @@ class Ascender():
             keystring = ret.stdout.decode().strip()
             pkey, _, privkey = keystring.split(" ")
             self.subzonedict[self.domain] = (pkey, self.minimum, privkey)
-            logging.info("executed command: %s", " ".join(ret.args))
+            logging.info("Executed command: %s", " ".join(ret.args))
         except sp.CalledProcessError:
             ret = sp.run([GNUNET_ZONE_CREATION_COMMAND,
                           '-dqpe', self.domain],
@@ -194,7 +174,7 @@ class Ascender():
 
     def add_records_to_gns(self) -> None:
         """
-        Extracts records from zone and adds them to GNS
+        Extracts records from transferred zone and adds them to GNS
         :raises AttributeError: When getting incomplete data
         """
         logging.info("Starting to add records into GNS...")
@@ -332,7 +312,7 @@ class Ascender():
         taskqueue.put(None)
         thread.join(timeout=10)
         if thread.is_alive():
-            logging.critical("thread join timed out, still running")
+            logging.critical("Thread joining timed out, still running")
 
         # Add soa record to GNS once completed (updates the previous one)
         self.add_soa_record_to_gns(self.soa)
@@ -739,37 +719,33 @@ class Ascender():
             logging.info("adding zone %s with %s pkey into %s", zone, pkey, 
domain)
             self.add_pkey_record_to_zone(pkey, domain, label, ttl)
 
-def main():
+def main(args):
     """
     Initializes object and handles arguments
     """
-    # argument parsing from docstring definition
-    args = docopt.docopt(__doc__, version='Ascension 0.11.5')
-
-    # 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"
-    standalone = bool(args.get('--standalone'))
-    dryrun = bool(args.get('--dry-run'))
-    minimum = args['--minimum-ttl']
+    flags = "p" if args.public else "n"
 
     # Change logging severity to debug
-    if debug:
+    if args.verbose:
         logging.basicConfig(level=logging.DEBUG)
 
     # Initialize class instance
-    ascender = Ascender(domain, transferns, port, flags, minimum)
+    ascender = Ascender(args.domain,
+                        args.nameserver,
+                        args.port,
+                        flags,
+                        args.ttl)
 
     # Do dry run before GNUnet check
-    if dryrun:
+    if args.dryrun:
         dns_zone_serial = ascender.get_dns_zone_serial(ascender.domain,
                                                        ascender.transferns)
         if dns_zone_serial is None:
+            logging.critical('The specified domain is not transferrable \
+                             using the given option!')
             return 1
         else:
+            logging.critical('SUCCESS! The specified domain is transferrable!')
             return 0
 
     # Checks if GNUnet services are running
@@ -779,7 +755,7 @@ def main():
         logging.critical('GNUnet services are not running!')
         sys.exit(1)
 
-    # Set to defaults to use before we get a SOA for the first time
+    # Set defaults to use before we get a SOA for the first time
     retry = 300
     refresh = 300
 
@@ -804,7 +780,7 @@ def main():
 
         if not dns_zone_serial:
             logging.error("Could not get DNS zone serial")
-            if standalone:
+            if args.standalone:
                 return 1
             time.sleep(retry)
             continue
@@ -815,21 +791,21 @@ def main():
         elif gns_zone_serial == dns_zone_serial:
             logging.info("GNS zone is up to date.")
             print("GNS zone is up to date.")
-            if standalone:
+            if args.standalone:
                 return 0
             time.sleep(refresh)
             continue
         elif gns_zone_serial > 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:
+            if args.standalone:
                 return 1
             time.sleep(retry)
             continue
         else:
             logging.info("GNS zone is out of date, performing incremental 
transfer.")
             needsupdate = True
-            if standalone:
+            if args.standalone:
                 return 1
             print("GNS zone is out of date, performing incremental transfer.")
 
@@ -846,7 +822,7 @@ def main():
             retry = int(str(ascender.soa[2]).split(" ")[4])
         except dns.zone.BadZone:
             logging.critical("Malformed DNS Zone '%s'", ascender.domain)
-            if standalone:
+            if args.standalone:
                 return 2
             time.sleep(retry)
             continue
@@ -857,4 +833,38 @@ def main():
         logging.info("Finished migration of the zone %s", ascender.domain)
 
 if __name__ == '__main__':
-    main()
+    parser = argparse.ArgumentParser(
+        description='Easy tool to migrate DNS zones into GNS',
+    )
+    parser.add_argument('domain', metavar='domain',
+                        type=str,
+                        help='Domain to be migrated into GNS')
+    parser.add_argument('-n', '--nameserver',
+                        help='Nameserver to use for migrating',
+                        required=False)
+    parser.add_argument('-P', '--port',
+                        help='Port to use for zone transfer with nameserver',
+                        required=False,
+                        default=53)
+    parser.add_argument('-t', '--ttl',
+                        help='Sets the minimum ttl of records added to GNS',
+                        required=False, default=3600)
+    parser.add_argument('-s', '--standalone',
+                        help='Run ascension once and not as daemon',
+                        action='store_true',
+                        required=False, default=False)
+    parser.add_argument('-p', '--public',
+                        help='Push records to the public DHT',
+                        action='store_true',
+                        required=False, default=False)
+    parser.add_argument('-g', '--dryrun',
+                        help='Tests if zone is transferrable without changing 
anything',
+                        action='store_true',
+                        required=False, default=False)
+    parser.add_argument('-v', '--verbose',
+                        help='Enable verbose debugging',
+                        action='store_true',
+                        required=False, default=False)
+    parser.add_argument('-V', '--version', action='version', version='%(prog)s 
0.11.5')
+    args = parser.parse_args()
+    main(args)

-- 
To stop receiving notification emails like this one, please contact
address@hidden.



reply via email to

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