commit 6254642808851599890c7219c1025a096b486b5c Author: aagbsn aagbsn@extc.org Date: Wed Jan 16 22:36:58 2013 +0000
Refactor NetTestLoader and add checkOptions, and add Tor support --- ooni/director.py | 25 ++++++++++++++++----- ooni/nettest.py | 62 +++++++++++++++++++++++++++--------------------------- ooni/oonicli.py | 28 ++++++++++++++---------- 3 files changed, 66 insertions(+), 49 deletions(-)
diff --git a/ooni/director.py b/ooni/director.py index 9a20491..2dc4e36 100644 --- a/ooni/director.py +++ b/ooni/director.py @@ -78,6 +78,22 @@ class Director(object):
self.failures = []
+ self.torControlProtocol = None + + def start(self): + if config.privacy.includepcap: + log.msg("Starting") + if not config.reports.pcap: + config.generatePcapFilename() + self.startSniffing() + + if config.advanced.start_tor: + log.msg("Starting Tor...") + d = self.startTor() + else: + d = defer.succeed(None) + return d + @property def measurementSuccessRatio(self): if self.totalMeasurements == 0: @@ -154,7 +170,7 @@ class Director(object): def netTestDone(self, result, net_test): self.activeNetTests.remove(net_test)
- def startNetTest(self, net_test_loader, options): + def startNetTest(self, _, net_test_loader): """ Create the Report for the NetTest and start the report NetTest.
@@ -162,14 +178,11 @@ class Director(object): net_test_loader: an instance of :class:ooni.nettest.NetTestLoader
- options: - is a dict containing the options to be passed to the chosen net - test. + _: #XXX very dirty hack """ report = Report(self.reporters, self.reportEntryManager)
- net_test = NetTest(net_test_loader, options, report) - net_test.setUpNetTestCases() + net_test = NetTest(net_test_loader, report) net_test.director = self
self.measurementManager.schedule(net_test.generateMeasurements()) diff --git a/ooni/nettest.py b/ooni/nettest.py index 4aa013c..464d91a 100644 --- a/ooni/nettest.py +++ b/ooni/nettest.py @@ -20,7 +20,8 @@ class NoTestCasesFound(Exception): class NetTestLoader(object): method_prefix = 'test'
- def __init__(self, net_test_file): + def __init__(self, net_test_file, net_test_args): + self.netTestArgs = net_test_args self.testCases = self.loadNetTest(net_test_file)
@property @@ -145,9 +146,33 @@ class NetTestLoader(object): test_class, _ = test_cases[0] self.testVersion = test_class.version self.testName = os.path.basename(net_test_file).strip('.py') - return test_cases
+ def checkOptions(self): + """ + Call processTest and processOptions methods of each NetTestCase + """ + test_classes = set([]) + for test_class, test_method in self.testCases: + test_classes.add(test_class) + + for klass in test_classes: + options = self.usageOptions() + options.parseOptions(self.netTestArgs) + if options: + klass.localOptions = options + + test_instance = klass() + if test_instance.requiresRoot: + checkForRoot() + test_instance._checkRequiredOptions() + test_instance._checkValidOptions() + + inputs = test_instance.getInputProcessor() + if not inputs: + inputs = [None] + klass.inputs = inputs + def _loadNetTestFromFileObject(self, net_test_string): """ Load NetTest from a string @@ -231,15 +256,12 @@ class NetTestState(object): class NetTest(object): director = None
- def __init__(self, net_test_loader, options, report): + def __init__(self, net_test_loader, report): """ - net_test_file: - is a file object containing the test to be run. - - options: - is a dict containing the options to be passed to the net test. + net_test_loader: + an instance of :class:ooni.nettest.NetTestLoader containing + the test to be run. """ - self.options = options self.report = report self.testCases = net_test_loader.testCases
@@ -322,28 +344,6 @@ class NetTest(object):
self.state.allTasksScheduled()
- def setUpNetTestCases(self): - """ - Call processTest and processOptions methods of each NetTestCase - """ - test_classes = set([]) - for test_class, test_method in self.testCases: - test_classes.add(test_class) - - for klass in test_classes: - klass.localOptions = self.options - - test_instance = klass() - if test_instance.requiresRoot: - checkForRoot() - test_instance._checkRequiredOptions() - test_instance._checkValidOptions() - - inputs = test_instance.getInputProcessor() - if not inputs: - inputs = [None] - klass.inputs = inputs - class NetTestCase(object): """ This is the base of the OONI nettest universe. When you write a nettest diff --git a/ooni/oonicli.py b/ooni/oonicli.py index e307d35..78389f4 100644 --- a/ooni/oonicli.py +++ b/ooni/oonicli.py @@ -174,12 +174,18 @@ def runWithDirector():
net_test_args = global_options.pop('subargs') net_test_file = global_options['test'] + net_test_loader = NetTestLoader(net_test_file, net_test_args)
- net_test_loader = NetTestLoader(net_test_file) - options = net_test_loader.usageOptions() - options.parseOptions(net_test_args) - - net_test_options = dict(options) + try: + net_test_loader.checkOptions() + except MissingRequiredOption, option_name: + log.err('Missing required option: "%s"' % option_name) + print net_test_loader.usageOptions().getUsage() + sys.exit(2) + except usage.UsageError, e: + log.err(e) + print net_test_loader.usageOptions().getUsage() + sys.exit(2)
# reporters = [YAMLReporter, OONIBReporter]
@@ -198,13 +204,11 @@ def runWithDirector(): sys.exit(1)
director = Director(reporters) - try: - d = director.startNetTest(net_test_loader, net_test_options) - d.addBoth(shutdown) - reactor.run() - except MissingRequiredOption, option_name: - log.err('Missing required option: "%s"' % option_name) - print options.getUsage() + d = director.start() + + d.addCallback(director.startNetTest, net_test_loader) + d.addBoth(shutdown) + reactor.run()
def run(): """