[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [ascension] 08/45: added GNS2DNS support and rudimentary Un
From: |
gnunet |
Subject: |
[GNUnet-SVN] [ascension] 08/45: added GNS2DNS support and rudimentary Unittests (incomplete) |
Date: |
Fri, 25 Jan 2019 10:02:08 +0100 |
This is an automated email from the git hooks/post-receive script.
rexxnor pushed a commit to branch master
in repository ascension.
commit 47afd11be26d8b939bd37327e8230e9bb8a4481a
Author: rexxnor <address@hidden>
AuthorDate: Wed Sep 26 15:55:41 2018 +0200
added GNS2DNS support and rudimentary Unittests (incomplete)
---
gnsmigrator/gnsmigrator.py | 112 ++++++++++++++++++++++--------
gnsmigrator/gnsmigrator_unit_tests.py | 64 -----------------
gnsmigrator/test/test_unit_gnsmigrator.py | 69 ++++++++++++++++++
setup.py | 5 +-
4 files changed, 154 insertions(+), 96 deletions(-)
diff --git a/gnsmigrator/gnsmigrator.py b/gnsmigrator/gnsmigrator.py
index 0ef44b6..804891a 100644
--- a/gnsmigrator/gnsmigrator.py
+++ b/gnsmigrator/gnsmigrator.py
@@ -2,12 +2,15 @@
"""GNS Migrator
Usage:
- gnsmigrator.py <file>
+ gnsmigrator.py (-c <csv> | -f <txtfile>)
+ gnsmigrator.py (-c <csv> | -f <txtfile>) -r <resolver>
gnsmigrator.py -h | --help
- gnsmigrator.py --version
+ gnsmigrator.py -v | --version
Options:
- <file> CSV File containing domains to transfer
+ <csv> CSV File containing domains to transfer
+ <txtfile> Text File containing domains to transfer
+ <resolver> DNS Server that resolves missing domains
-h --help Show this screen.
-v --version Show version.
"""
@@ -24,6 +27,7 @@ import docopt
GNUNET_ZONE_CREATION_COMMAND = 'gnunet-identity'
GNUNET_NAMESTORE_COMMAND = 'gnunet-namestore'
GNUNET_GNS_COMMAND = 'gnunet-gns'
+GNUNET_ARM_COMMAND = 'gnunet-arm'
class GNSMigrator():
"""
@@ -75,6 +79,8 @@ class GNSMigrator():
stdout=subprocess.PIPE)
pkey_zone = subprocess.check_output(['cut', '-d', ' ', '-f3'],
stdin=pkey_line.stdout).decode().strip()
+ pkey_lookup.stdout.close()
+ pkey_line.stdout.close()
# Create identity in GNUnet
if not pkey_zone:
subprocess.run([GNUNET_ZONE_CREATION_COMMAND,
@@ -87,6 +93,8 @@ class GNSMigrator():
stdout=subprocess.PIPE)
pkey_zone = subprocess.check_output(['cut', '-d', ' ', '-f3'],
stdin=pkey_line.stdout).decode().strip()
+ pkey_lookup.stdout.close()
+ pkey_line.stdout.close()
# If it is TLD, don't add PKEY to higher zone as they do not
exist
if counter > 0:
@@ -105,43 +113,70 @@ class GNSMigrator():
counter += 1
@staticmethod
- def add_records_to_gns(zonename, zone, domain):
+ def add_records_to_gns(zonename, zone, domain, dnsresolver):
"""
Checks if records are present
:param zonename: zonename of zone to add records to
:param zone: the transfered zone
:param domain: full domain of zone
"""
- # can optimize with for record in zone.iterate_rdatas.filter()
+ # can optimize with for record in zone.iterate_rdatas.filter() to
remove @ records
for record in zone.iterate_rdatas():
dnsname, ttl, rtype = record
rtype_str = dns.rdatatype.to_text(rtype.rdtype)
dnsname_str = str(dnsname)
value = str(rtype)
+ # special case for MX records
if rtype_str == 'MX':
valuelist = value.split(' ')
value = '%s,%s' % (valuelist[0], valuelist[1])
- #if rtype_str != 'SOA':
if dnsname_str != '@':
- ret = subprocess.run([GNUNET_GNS_COMMAND,
- '-t', rtype_str,
- '-u', '%s.%s' % (dnsname_str, zonename)],
- stdout=subprocess.PIPE)
- if 'Got'.encode() not in ret.stdout:
- subprocess.run([GNUNET_NAMESTORE_COMMAND,
- '-z', zonename,
- '-a', '-n', dnsname_str,
- '-t', rtype_str,
- '-V', value,
- '-e', '%ds' % ttl])
- if rtype_str in ['A', 'AAAA']:
- # This is EXPERIMENTAL LEgacy HOstname implementation
+ # Special case for the GNS2DNS case
+ if rtype_str == 'NS':
+
+ # if no resolver is specified, choose the FQDN nameserver
from zone
+ if not dnsresolver:
+ dnsresolver = value[:-1]
+
+ pkey_lookup =
subprocess.Popen([GNUNET_ZONE_CREATION_COMMAND, '-d'],
+ stdout=subprocess.PIPE)
+ pkey_line = subprocess.Popen(['grep', dnsname_str],
+ stdin=pkey_lookup.stdout,
+ stdout=subprocess.PIPE)
+ pkey_zone = subprocess.check_output(['cut', '-d', ' ',
'-f3'],
+
stdin=pkey_line.stdout).decode().strip()
+ if not pkey_zone:
+ ret = subprocess.run([GNUNET_GNS_COMMAND,
+ '-t', 'GNS2DNS',
+ '-u', '%s.%s' % (dnsname_str,
zonename)],
+ stdout=subprocess.PIPE)
+ if 'Got'.encode() not in ret.stdout:
+ subprocess.run([GNUNET_NAMESTORE_COMMAND,
+ '-z', zonename,
+ '-a', '-n', dnsname_str,
+ '-t', 'GNS2DNS',
+ '-V', 'address@hidden' %
(dnsname_str, domain, dnsresolver),
+ '-e', '%ds' % ttl])
+ else:
+ ret = subprocess.run([GNUNET_GNS_COMMAND,
+ '-t', rtype_str,
+ '-u', '%s.%s' % (dnsname_str,
zonename)],
+ stdout=subprocess.PIPE)
+ if 'Got'.encode() not in ret.stdout:
subprocess.run([GNUNET_NAMESTORE_COMMAND,
'-z', zonename,
'-a', '-n', dnsname_str,
- '-t', 'LEHO',
- '-V', '%s.%s' % (dnsname_str, domain),
+ '-t', rtype_str,
+ '-V', value,
'-e', '%ds' % ttl])
+ if rtype_str in ['A', 'AAAA']:
+ # This is EXPERIMENTAL LEgacy HOstname
implementation
+ subprocess.run([GNUNET_NAMESTORE_COMMAND,
+ '-z', zonename,
+ '-a', '-n', dnsname_str,
+ '-t', 'LEHO',
+ '-V', '%s.%s' % (dnsname_str,
domain),
+ '-e', '%ds' % ttl])
@staticmethod
@@ -156,13 +191,34 @@ def main():
"""
Initializes object and handles arguments
"""
+ # argument parsing from docstring definition
args = docopt.docopt(__doc__, version='GNS Migrator 0.0.1')
- csvfile = args['<file>']
+
+ # Checks if GNUnet services are running
+ try:
+ subprocess.check_output([GNUNET_ARM_COMMAND, '-I'], timeout=1)
+ except subprocess.TimeoutExpired:
+ print('GNUnet Services are not running!')
+ print('Exiting...')
+ return 1
+
+ dnsresolver = args['<resolver>']
+
domainlist = []
- with open(csvfile, 'r') as openedcsv:
- linereader = csv.reader(openedcsv, delimiter=' ', quotechar='|')
- for domain in linereader:
- domainlist += domain
+
+ if args.get('<csv>', None):
+ csvfile = args['<csv>']
+ with open(csvfile, 'r') as openedcsv:
+ linereader = csv.reader(openedcsv, delimiter=' ', quotechar='|')
+ for domain in linereader:
+ domainlist += domain
+
+ if args.get('<txtfile>', None):
+ txtfile = args['<txtfile>']
+ with open(txtfile, 'r') as openedtxt:
+ for line in openedtxt:
+ domainlist.append(line.rstrip())
+
gnsmigrator = GNSMigrator(domainlist)
gnsmigrator.bootstrap_zones()
@@ -171,11 +227,9 @@ def main():
for domain, zonetuple in gnsmigrator.zones.items():
zone, xfrinfo = zonetuple
zonename = gnsmigrator.get_lowest_domain_part(domain)
- gnsmigrator.add_records_to_gns(zonename, zone, domain)
+ gnsmigrator.add_records_to_gns(zonename, zone, domain, dnsresolver)
# retain the information needed for a second zone transfer
#print(xfrinfo)
-
if __name__ == '__main__':
- # TODO ensure gnunet is runnning
main()
diff --git a/gnsmigrator/gnsmigrator_unit_tests.py
b/gnsmigrator/gnsmigrator_unit_tests.py
deleted file mode 100644
index 12a56e7..0000000
--- a/gnsmigrator/gnsmigrator_unit_tests.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env python3
-"""
-Tests of gnsmigrator
-"""
-
-import subprocess
-import unittest
-from unittest import TestCase
-import dns.exception
-import dns.resolver
-import gnsmigrator
-
-
-class TestGNSMigrator(TestCase):
- """
- Short Unit Tests for WebArchiver
- """
-
- def setUp(self):
- """
- Prepare data for tests
- """
- self.gnsmigrator = gnsmigrator.GNSMigrator(["example.fantasy"])
- self.gnsmigrator2 = gnsmigrator.GNSMigrator(["example.com"])
- self.gnsmigrator3 = gnsmigrator.GNSMigrator(["bfh.ch"])
-
- def test_constructor(self):
- """
- Tests constructor
- """
- self.assertEqual("example.fantasy", self.gnsmigrator.domainlist)
-
- def test_get_lowest_domain_part(self):
- """
- Tests constructor
- """
- self.assertEqual("example", self.gnsmigrator.get_lowest_domain_part(
- self.gnsmigrator.domainlist[0]))
-
- def test_bootstrap_zones(self):
- """
- Tests bootstrapping of zones
- """
- self.gnsmigrator.bootstrap_zones()
- self.assertIn('example', subprocess.check_output(['gnunet-identity',
'-d']))
- self.assertIn('fantasy', subprocess.check_output(['gnunet-identity',
'-d']))
-
- def test_initial_zone_transfer(self):
- """
- Tests different ways of zone transfer not working
- """
- self.assertRaises(dns.resolver.NoAnswer,
self.gnsmigrator.initial_zone_transfer())
- self.assertRaises(dns.resolver.NoAnswer,
self.gnsmigrator2.initial_zone_transfer())
- self.assertRaises(dns.exception.FormError,
self.gnsmigrator3.initial_zone_transfer())
-
-def main():
- """
- Main method
- """
- unittest.main()
-
-
-if __name__ == "__main__":
- main()
diff --git a/gnsmigrator/test/test_unit_gnsmigrator.py
b/gnsmigrator/test/test_unit_gnsmigrator.py
new file mode 100644
index 0000000..b04f456
--- /dev/null
+++ b/gnsmigrator/test/test_unit_gnsmigrator.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python3
+"""
+Unittests of gnsmigrator
+"""
+
+import subprocess
+import unittest
+import mock
+from unittest import TestCase
+from gnsmigrator import gnsmigrator
+
+
+class TestGNSMigrator(TestCase):
+ """
+ Short Unit Tests for WebArchiver
+ """
+ @classmethod
+ def setUpClass(cls):
+ """
+ Prepare data for tests
+ """
+ cls.gnsmigrator = gnsmigrator.GNSMigrator(["pretty.fantasy"])
+
+ def test_constructor(self):
+ """
+ Tests constructor
+ """
+ self.assertEqual(["pretty.fantasy"], self.gnsmigrator.domainlist)
+
+ def test_get_lowest_domain_part(self):
+ """
+ Tests constructor
+ """
+ self.assertEqual("pretty", self.gnsmigrator.get_lowest_domain_part(
+ self.gnsmigrator.domainlist[0]))
+
+ def test_bootstrap_zones(self):
+ """
+ Tests bootstrapping of zones with mocked subprocess commands
+ """
+ self.gnsmigrator.bootstrap_zones()
+ # using mocked subprocesses to prevent inconsistent status
+ mocked_ident = mock.create_autospec(subprocess.check_output,
return_value='fantasy PKEY')
+ self.assertIn('fantasy', mocked_ident(['gnunet-identity', '-d']))
+ mocked_lookup = mock.create_autospec(subprocess.check_output,
return_value='Got:')
+ self.assertIn('Got', mocked_lookup(['gnunet-gns', '-t', 'PKEY', '-u',
'pretty.fantasy']))
+ mocked_failed_lookup = mock.create_autospec(subprocess.check_output,
return_value=3)
+ self.assertIs(3, mocked_failed_lookup(['gnunet-gns', '-t', 'PKEY',
'-u', 'pretty.pretty.fantasy']))
+
+ def test_initial_zone_transfer(self):
+ """
+ Tests different ways of zone transfer not working
+ """
+ self.gnsmigrator.initial_zone_transfer()
+
+ # Needs to be done via mock stuff or expect weird stuff
+ #self.assertRaises(dns.resolver.NoAnswer,
self.gnsmigrator.initial_zone_transfer())
+ #self.assertRaises(dns.resolver.NoAnswer,
self.gnsmigrator2.initial_zone_transfer())
+
+ @classmethod
+ def tearDownClass(cls):
+ """
+ Removes all zones and cleans up testing environment
+ """
+ subprocess.run(['gnunet-identity', '-D', 'pretty'])
+ subprocess.run(['gnunet-identity', '-D', 'fantasy'])
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/setup.py b/setup.py
index 743885b..274c6b8 100644
--- a/setup.py
+++ b/setup.py
@@ -15,15 +15,14 @@ setuptools.setup(
author_email="address@hidden",
description="Tool to migrate DNS Zones to the GNU Name System",
long_description=long_description,
- long_description_content_type="text/markdown",
url="https://gitlab.ti.bfh.ch/gerbp6/gnsmigrator",
- packages=setuptools.find_packages(),
+ packages=['gnsmigrator'],
classifiers=[
"Programming Language :: Python :: 3",
],
entry_points={
'console_scripts': [
- 'gnsmigrator=gnsmigrator:main',
+ 'gnsmigrator=gnsmigrator.gnsmigrator:main',
],
},
)
--
To stop receiving notification emails like this one, please contact
address@hidden
- [GNUnet-SVN] [ascension] 15/45: created baseclass and separated small from big zones, (continued)
- [GNUnet-SVN] [ascension] 15/45: created baseclass and separated small from big zones, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 27/45: unstable version, port specification possible, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 28/45: refactored code, added debug mode, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 26/45: added definitive support for IXFR, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 44/45: updated README, cleanup, PEP8, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 43/45: updated dependencies, setup.py, removed TODOs, improved error handling, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 12/45: bumped version to 0.1.0, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 03/45: removed GNU from heading in README, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 02/45: Added LICENSE, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 30/45: updated gnsmigrator and removed c rebuilds, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 08/45: added GNS2DNS support and rudimentary Unittests (incomplete),
gnunet <=
- [GNUnet-SVN] [ascension] 45/45: renamed files, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 36/45: some experimental fixes, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 34/45: updated gnsmigrator for multiline, added multiline tests, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 35/45: unify all records under label, added SUPPORTED_RECORDS global, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 40/45: improvements, better case separation, more logging, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 39/45: added daemonization, bumped version, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 31/45: added testing for gnunet -K option and more, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 29/45: added warnings to logging if records failed to be added, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 37/45: updated README, gnunet, 2019/01/25
- [GNUnet-SVN] [ascension] 41/45: added logic for subzones with zone cut, gnunet, 2019/01/25