[tor-commits] [oonib/master] Implement checking of paths before starting oonib.

art at torproject.org art at torproject.org
Wed Mar 26 17:54:37 UTC 2014


commit aebeb92b87bd7b4f19f8b1d0923efd4003a8df9a
Author: Arturo Filastò <art at fuffa.org>
Date:   Mon Mar 24 12:34:59 2014 +0100

    Implement checking of paths before starting oonib.
    
    This is a fix related to #34
---
 bin/oonib                        |   28 ++++++++++++++-
 oonib/api.py                     |    2 +-
 oonib/bouncer/handlers.py        |    7 +++-
 oonib/config.py                  |   70 ++++++++++++++++++++++++--------------
 oonib/deck/api.py                |    2 +-
 oonib/deck/handlers.py           |    3 +-
 oonib/errors.py                  |   12 +++++++
 oonib/input/api.py               |    2 +-
 oonib/input/handlers.py          |    3 +-
 oonib/log.py                     |    2 +-
 oonib/oonibackend.py             |    2 +-
 oonib/options.py                 |    1 -
 oonib/policy/handlers.py         |    9 ++---
 oonib/report/handlers.py         |   12 ++++---
 oonib/runner.py                  |    3 +-
 oonib/testhelpers/dns_helpers.py |    2 +-
 oonib/testhelpers/ssl_helpers.py |    2 +-
 oonib/testhelpers/tcp_helpers.py |    5 +--
 18 files changed, 114 insertions(+), 53 deletions(-)

diff --git a/bin/oonib b/bin/oonib
index 554d3bb..7fb1c35 100755
--- a/bin/oonib
+++ b/bin/oonib
@@ -10,7 +10,33 @@ from twisted.application import app
 sys.path[:] = map(os.path.abspath, sys.path)
 sys.path.insert(0, os.path.abspath(os.getcwd()))
 
-from oonib import runner, config
+from oonib import errors as e
+from oonib.config import config
+
+try:
+    config.load()
+except e.ConfigFileNotSpecified:
+    print "Config file not specified!"
+    print "Use -c to specify one!"
+    config.usageOptions()
+    sys.exit(1)
+except e.ConfigFileDoesNotExist, path:
+    print "Config file \"%s\" does not exist!" % path
+    sys.exit(2)
+except e.InvalidReportDirectory, path:
+    print "Invalid report directory: %s!" % path
+    sys.exit(3)
+except e.InvalidArchiveDirectory, path:
+    print "Invalid archive directory: %s!" % path
+    sys.exit(4)
+except e.InvalidInputDirectory, path:
+    print "Invalid input directory: %s" % path
+    sys.exit(5)
+except e.InvalidDeckDirectory, path:
+    print "Invalid deck directory: %s" % path
+    sys.exit(6)
+
+from oonib import runner
 from oonib.oonibackend import application
 
 if config.main.chroot:
diff --git a/oonib/api.py b/oonib/api.py
index 8b7ad4e..2427837 100644
--- a/oonib/api.py
+++ b/oonib/api.py
@@ -6,7 +6,7 @@ from oonib.input.api import inputAPI
 from oonib.policy.api import policyAPI
 from oonib.bouncer.api import bouncerAPI
 
-from oonib import config
+from oonib.config import config
 
 ooniBouncer = None
 ooniBackendAPI = []
diff --git a/oonib/bouncer/handlers.py b/oonib/bouncer/handlers.py
index c6b249d..38ac1f5 100644
--- a/oonib/bouncer/handlers.py
+++ b/oonib/bouncer/handlers.py
@@ -3,7 +3,7 @@ import random
 import yaml
 from oonib import errors as e
 from oonib.handlers import OONIBHandler
-from oonib import config
+from oonib.config import config
 
 class Bouncer(object):
     def __init__(self):
@@ -138,6 +138,11 @@ class BouncerQueryHandler(OONIBHandler):
             requested_helpers = query['test-helpers']
         except KeyError:
             raise e.TestHelpersKeyMissing
+        
+        try:
+            assert isinstance(requested_helpers, list)
+        except AssertionError:
+            raise e.InvalidRequest
 
         response = self.bouncer.filterHelperAddresses(requested_helpers)
         self.write(response)
diff --git a/oonib/config.py b/oonib/config.py
index a1a5e79..4f818b0 100644
--- a/oonib/config.py
+++ b/oonib/config.py
@@ -1,37 +1,55 @@
 import yaml
+from oonib import errors as e
 from oonib import Storage
 from oonib import __version__
 
 from oonib.options import OONIBOptions
 import os
 
-def get_root_path():
-    this_directory = os.path.dirname(__file__)
-    root = os.path.join(this_directory, '..')
-    root = os.path.abspath(root)
-    return root
-
-def loadConfigFile():
+class Config(object):
+    main = None
+    helpers = None
+    reports = {}
+    backend_version = __version__
     opts = OONIBOptions()
-    opts.parseOptions()
-    if 'config' in opts.keys():
-        with open(opts['config']) as f:
-            config_file_contents = '\n'.join(f.readlines())
-            configuration = yaml.safe_load(config_file_contents)
-            main = Storage(opts)
-            for k, v in configuration['main'].items():
-                main[k] = v
-            helpers = Storage()
-            for k, v in configuration['helpers'].items():
-                helpers[k] = Storage()
-                for k2, v2 in v.items():
-                    helpers[k][k2] = v2
-            return main, helpers
-    return None, None
-
-main = None
+
+    def __init__(self):
+        self.opts.parseOptions()
+
+    def load(self):
+        try:
+            config_file = self.opts['config']
+        except KeyError:
+            raise e.ConfigFileNotSpecified
+
+        try:
+            with open(self.opts['config']) as f:
+                configuration = yaml.safe_load(f)
+        except IOError:
+            raise e.ConfigFileDoesNotExist(self.opts['config'])
+
+        self.main = Storage()
+        for k, v in configuration['main'].items():
+            self.main[k] = v
+        self.helpers = Storage()
+        for name, helper in configuration['helpers'].items():
+            self.helpers[name] = Storage()
+            for k, v in helper.items():
+                self.helpers[name][k] = v
+        self.check_paths()
+    
+    def check_paths(self):
+        if not self.main.report_dir or not os.path.isdir(self.main.report_dir):
+            raise e.InvalidReportDirectory(self.main.report_dir)
+        if not self.main.archive_dir or not os.path.isdir(self.main.archive_dir):
+            raise e.InvalidArchiveDirectory(self.main.report_dir)
+
+        if self.main.input_dir and not os.path.isdir(self.main.input_dir):
+            raise e.InvalidInputDirectory(self.main.input_dir)
+        if self.main.deck_dir and not os.path.isdir(self.main.deck_dir):
+            raise e.InvalidDeckDirectory(self.main.deck_dir)
+
 backend_version = __version__
 reports = {}
 
-if not main:
-    main, helpers = loadConfigFile()
+config = Config()
diff --git a/oonib/deck/api.py b/oonib/deck/api.py
index ffccb0a..a2f1164 100644
--- a/oonib/deck/api.py
+++ b/oonib/deck/api.py
@@ -1,6 +1,6 @@
 from cyclone import web
 from oonib.deck import handlers
-from oonib import config
+from oonib.config import config
 
 deckAPI = [
     (r"/deck", handlers.DeckListHandler),
diff --git a/oonib/deck/handlers.py b/oonib/deck/handlers.py
index c8aed69..44ff24f 100644
--- a/oonib/deck/handlers.py
+++ b/oonib/deck/handlers.py
@@ -6,7 +6,8 @@ import yaml
 
 from oonib import errors as e
 from oonib.handlers import OONIBHandler
-from oonib import config, log
+from oonib import log
+from oonib.config import config
 
 class DeckDescHandler(OONIBHandler):
     def get(self, deckID):
diff --git a/oonib/errors.py b/oonib/errors.py
index 8d6015e..6f768d0 100644
--- a/oonib/errors.py
+++ b/oonib/errors.py
@@ -73,3 +73,15 @@ class TestHelperNotFound(OONIBError):
     status_code = 404
     log_message = "test-helper-not-found"
 
+class ConfigFileNotSpecified(Exception): pass
+
+class ConfigFileDoesNotExist(Exception): pass
+
+class InvalidReportDirectory(Exception): pass
+
+class InvalidArchiveDirectory(Exception): pass
+
+class InvalidInputDirectory(Exception): pass
+
+class InvalidDeckDirectory(Exception): pass
+
diff --git a/oonib/input/api.py b/oonib/input/api.py
index 88d85a2..811da29 100644
--- a/oonib/input/api.py
+++ b/oonib/input/api.py
@@ -1,6 +1,6 @@
 from cyclone import web
 from oonib.input import handlers
-from oonib import config
+from oonib.config import config
 
 inputAPI = [
     (r"/input", handlers.InputListHandler),
diff --git a/oonib/input/handlers.py b/oonib/input/handlers.py
index d467854..fce7451 100644
--- a/oonib/input/handlers.py
+++ b/oonib/input/handlers.py
@@ -4,7 +4,8 @@ import os
 import yaml
 
 from oonib.handlers import OONIBHandler
-from oonib import config, log
+from oonib import log
+from oonib.config import config
 
 class InputDescHandler(OONIBHandler):
     def get(self, inputID):
diff --git a/oonib/log.py b/oonib/log.py
index b28b5bf..8229446 100644
--- a/oonib/log.py
+++ b/oonib/log.py
@@ -17,7 +17,7 @@ from twisted.python.failure import Failure
 from twisted.python.logfile import DailyLogFile
 
 from oonib import otime
-from oonib import config
+from oonib.config import config
 
 ## Get rid of the annoying "No route found for
 ## IPv6 destination warnings":
diff --git a/oonib/oonibackend.py b/oonib/oonibackend.py
index c5f96ee..a6654b8 100644
--- a/oonib/oonibackend.py
+++ b/oonib/oonibackend.py
@@ -20,7 +20,7 @@ from oonib.testhelpers import http_helpers, tcp_helpers
 
 from oonib import log
 
-from oonib import config
+from oonib.config import config
 
 if config.main.uid and config.main.gid:
     application = service.Application('oonibackend', uid=config.main.uid,
diff --git a/oonib/options.py b/oonib/options.py
index cce1590..7acdc23 100644
--- a/oonib/options.py
+++ b/oonib/options.py
@@ -7,7 +7,6 @@ if platformType == "win32":
 else:
     from twisted.scripts._twistd_unix import ServerOptions
 
-#class OONIBOptions(usage.Options):
 class OONIBOptions(usage.Options):
     synopsis = """%s [options] [path to test].py """
 
diff --git a/oonib/policy/handlers.py b/oonib/policy/handlers.py
index abce0b3..913aeb1 100644
--- a/oonib/policy/handlers.py
+++ b/oonib/policy/handlers.py
@@ -1,11 +1,12 @@
-from oonib import errors as e
-from oonib.handlers import OONIBHandler
-
-from oonib import config
 import json
 import os
 import yaml
 
+from oonib import errors as e
+from oonib.handlers import OONIBHandler
+
+from oonib.config import config
+
 class Policy(object):
     nettest = None
     input = None
diff --git a/oonib/report/handlers.py b/oonib/report/handlers.py
index 2ee73ac..dea5326 100644
--- a/oonib/report/handlers.py
+++ b/oonib/report/handlers.py
@@ -1,18 +1,20 @@
-import json
-import os
 import random
-import re
 import string
 import time
 import yaml
+import json
+import os
+import re
+
+from twisted.internet import fdesc, reactor
 
 from oonib import errors as e
 from oonib.handlers import OONIBHandler
 from oonib.policy.handlers import Policy
 
 from datetime import datetime
-from oonib import randomStr, otime, config, log
-from twisted.internet import fdesc, reactor
+from oonib import randomStr, otime, log
+from oonib.config import config
 
 class MissingField(Exception):
     pass
diff --git a/oonib/runner.py b/oonib/runner.py
index 1243ee8..57b0b9f 100644
--- a/oonib/runner.py
+++ b/oonib/runner.py
@@ -22,12 +22,11 @@ from txtorcon import launch_tor
 
 from oonib.report.api import reportAPI 
 from oonib.api import ooniBackend, ooniBouncer
+from oonib.config import config
 
 from oonib import oonibackend
-from oonib import config
 from oonib import log
 
-
 from txtorcon import __version__ as txtorcon_version
 if txtorcon_version < '0.9.0':
     """
diff --git a/oonib/testhelpers/dns_helpers.py b/oonib/testhelpers/dns_helpers.py
index 8959215..9b2e5e3 100644
--- a/oonib/testhelpers/dns_helpers.py
+++ b/oonib/testhelpers/dns_helpers.py
@@ -3,7 +3,7 @@ from twisted.internet import reactor
 from twisted.names import dns
 from twisted.names import client, server
 
-from oonib import config
+from oonib.config import config
 
 class DNSTestHelper(server.DNSServerFactory):
     def __init__(self, authorities = None,
diff --git a/oonib/testhelpers/ssl_helpers.py b/oonib/testhelpers/ssl_helpers.py
index 5c74996..d511ddd 100644
--- a/oonib/testhelpers/ssl_helpers.py
+++ b/oonib/testhelpers/ssl_helpers.py
@@ -1,5 +1,5 @@
 from twisted.internet import ssl
-from oonib import config
+from oonib.config import config
 
 class SSLContext(ssl.DefaultOpenSSLContextFactory):
     def __init__(self, *args, **kw):
diff --git a/oonib/testhelpers/tcp_helpers.py b/oonib/testhelpers/tcp_helpers.py
index ab3c835..91c334b 100644
--- a/oonib/testhelpers/tcp_helpers.py
+++ b/oonib/testhelpers/tcp_helpers.py
@@ -2,7 +2,7 @@
 from twisted.internet.protocol import Protocol, Factory, ServerFactory
 from twisted.internet.error import ConnectionDone
 
-from oonib import config
+from oonib.config import config
 from oonib import log
 from oonib.daphn3 import Daphn3Protocol
 from oonib.daphn3 import read_pcap, read_yaml
@@ -67,6 +67,3 @@ class Daphn3Server(ServerFactory):
         p.role = "server"
         p.factory = self
         return p
-
-
-





More information about the tor-commits mailing list