commit aebeb92b87bd7b4f19f8b1d0923efd4003a8df9a Author: Arturo Filastò art@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 - - -
tor-commits@lists.torproject.org