[tor-commits] [ooni-probe/master] Rename new bridget to new bridget
isis at torproject.org
isis at torproject.org
Thu Oct 4 14:41:15 UTC 2012
commit 0080bf6555e4b55d0391c1c2f3ad41c83428f7e9
Author: Arturo Filastò <arturo at filasto.net>
Date: Thu Aug 23 17:54:18 2012 +0200
Rename new bridget to new bridget
---
ooni/assets/bridgetests.txt | 6 +-
ooni/ooniprobe.py | 14 +++---
ooni/plugins/bridget.py | 76 -------------------------------
ooni/plugins/domclass.py | 37 ++++++++++++---
ooni/plugins/new_bridget.py | 105 +++++++++++++++++++++++++++++++++++++++++++
ooni/plugoo/interface.py | 1 +
ooni/plugoo/reports.py | 49 ++++++++++++++++++++
ooni/plugoo/tests.py | 1 +
8 files changed, 196 insertions(+), 93 deletions(-)
diff --git a/ooni/assets/bridgetests.txt b/ooni/assets/bridgetests.txt
index c837988..5519eea 100644
--- a/ooni/assets/bridgetests.txt
+++ b/ooni/assets/bridgetests.txt
@@ -1,3 +1,3 @@
-213.151.89.102:9001
-108.166.106.156:443
-217.150.224.213:443
+88.130.86.191:443
+195.74.237.236:9001
+127.0.0.1:9050
diff --git a/ooni/ooniprobe.py b/ooni/ooniprobe.py
index 4b5c086..f80669e 100755
--- a/ooni/ooniprobe.py
+++ b/ooni/ooniprobe.py
@@ -76,17 +76,18 @@ def runTest(test, options, global_options, reactor=reactor):
resume = 0
if not options:
options = {}
+
if 'resume' in options:
resume = options['resume']
test = test_class(options, global_options, report, reactor=reactor)
+
if test.tool:
test.runTool()
- return
if test.ended:
- print "Ending prematurely"
- return
+ print "Ending test"
+ return None
wgen = work.WorkGenerator(test,
dict(options),
@@ -94,6 +95,8 @@ def runTest(test, options, global_options, reactor=reactor):
for x in wgen:
worker.push(x)
+ return True
+
class Options(usage.Options):
tests = plugoo.keys()
subCommands = []
@@ -138,7 +141,6 @@ if __name__ == "__main__":
config.opt_help()
sys.exit(1)
- runTest(config.subCommand, config.subOptions, config)
-
- reactor.run()
+ if runTest(config.subCommand, config.subOptions, config):
+ reactor.run()
diff --git a/ooni/plugins/bridget.py b/ooni/plugins/bridget.py
deleted file mode 100644
index 22ff9a0..0000000
--- a/ooni/plugins/bridget.py
+++ /dev/null
@@ -1,76 +0,0 @@
-"""
-This is a self genrated test created by scaffolding.py.
-you will need to fill it up with all your necessities.
-Safe hacking :).
-"""
-from zope.interface import implements
-from twisted.python import usage
-from twisted.plugin import IPlugin
-from twisted.internet import reactor
-
-from ooni.utils import log
-from ooni.plugoo.tests import ITest, OONITest
-from ooni.plugoo.assets import Asset
-
-class bridgetArgs(usage.Options):
- optParameters = [['bridges', 'b', None, 'List of bridges to scan'],
- ['relays', 'f', None, 'List of relays to scan'],
- ['resume', 'r', 0, 'Resume at this index']]
-
-class bridgetTest(OONITest):
- implements(IPlugin, ITest)
-
- shortName = "bridget"
- description = "bridget"
- requirements = None
- options = bridgetArgs
- blocking = False
-
- def experiment(self, args):
- log.msg("Doing test")
- # What you return here gets handed as input to control
- from ooni.lib.txtorcon import TorProtocolFactory, TorConfig, TorState
- from ooni.lib.txtorcon import DEFAULT_VALUE, launch_tor
- def updates(prog, tag, summary):
- log.msg("%d%%: %s" % (prog, summary))
- return
-
- def setup_failed(args):
- log.msg("Setup Failed.")
- report.update({'failed': args})
- return report
-
- def setup_complete(proto):
- log.msg("Setup Complete.")
- report.update({'success': args})
- return report
-
- config = TorConfig()
- import random
- config.SocksPort = random.randint(1024, 2**16)
- config.ControlPort = random.randint(1024, 2**16)
-
- if 'bridge' in args:
- config.UseBridges = 1
- config.Bridge = args['bridge']
- config.save()
- print config.create_torrc()
- report = {'tor_config': config.config}
- log.msg("Starting Tor")
- d = launch_tor(config, self.reactor, progress_updates=updates)
- d.addCallback(setup_complete)
- d.addErrback(setup_failed)
- return d
-
- def load_assets(self):
- assets = {}
- if self.local_options:
- if self.local_options['bridges']:
- assets.update({'bridge': Asset(self.local_options['bridges'])})
- elif self.local_options['relays']:
- assets.update({'relay': Asset(self.local_options['relay'])})
- return assets
-
-# We need to instantiate it otherwise getPlugins does not detect it
-# XXX Find a way to load plugins without instantiating them.
-bridget = bridgetTest(None, None, None)
diff --git a/ooni/plugins/domclass.py b/ooni/plugins/domclass.py
index cdcd508..446b9e4 100644
--- a/ooni/plugins/domclass.py
+++ b/ooni/plugins/domclass.py
@@ -1,4 +1,4 @@
-#
+# -*- coding: utf-8
#
# domclass
# ********
@@ -28,6 +28,12 @@
# probability matrix B.
#
+try:
+ import numpy
+except:
+ print "Error numpy not installed!"
+
+import yaml
from zope.interface import implements
from twisted.python import usage
from twisted.plugin import IPlugin
@@ -40,7 +46,7 @@ class domclassArgs(usage.Options):
optParameters = [['output', 'o', None, 'Output to write'],
['file', 'f', None, 'Corpus file'],
['fileb', 'b', None, 'Corpus file'],
- ['asset', 'a', None, 'URL List'],
+ ['urls', 'u', None, 'URL List'],
['resume', 'r', 0, 'Resume at this index']]
# All HTML4 tags
@@ -80,7 +86,6 @@ def compute_probability_matrix(dataset):
:dataset: an array of pairs representing the parent child relationships.
"""
import itertools
- import numpy
ret = {}
matrix = numpy.zeros((len(thetags) + 1, len(thetags) + 1))
@@ -155,15 +160,16 @@ class domclassTest(HTTPTest):
#tool = True
def runTool(self):
- import yaml, numpy
site_a = readDOM(filename=self.local_options['file'])
site_b = readDOM(filename=self.local_options['fileb'])
+ a = {}
a['matrix'] = compute_probability_matrix(site_a)
- a['eigen'] = compute_eigenvalue(a['matrix'])
+ a['eigen'] = compute_eigenvalues(a['matrix'])
self.result['eigenvalues'] = a['eigen']
+ b = {}
b['matrix'] = compute_probability_matrix(site_b)
- b['eigen'] = compute_eigenvalue(b['matrix'])
+ b['eigen'] = compute_eigenvalues(b['matrix'])
#print "A: %s" % a
#print "B: %s" % b
@@ -171,13 +177,15 @@ class domclassTest(HTTPTest):
correlation /= numpy.linalg.norm(a['eigen'])*numpy.linalg.norm(b['eigen'])
correlation = (correlation + 1)/2
print "Corelation: %s" % correlation
+ self.end()
+ return a
def processResponseBody(self, data):
- import yaml, numpy
site_a = readDOM(data)
#site_b = readDOM(self.local_options['fileb'])
+ a = {}
a['matrix'] = compute_probability_matrix(site_a)
- a['eigen'] = compute_eigenvalue(a['matrix'])
+ a['eigen'] = compute_eigenvalues(a['matrix'])
if len(data) == 0:
@@ -191,4 +199,17 @@ class domclassTest(HTTPTest):
print "A: %s" % a
return a['eigen']
+ def load_assets(self):
+ if self.local_options:
+ if self.local_options['file']:
+ self.tool = True
+ return {}
+ elif self.local_options['urls']:
+ return {'url': Asset(self.local_options['urls'])}
+ else:
+ self.end()
+ return {}
+ else:
+ return {}
+
domclass = domclassTest(None, None, None)
diff --git a/ooni/plugins/new_bridget.py b/ooni/plugins/new_bridget.py
new file mode 100644
index 0000000..3e4db56
--- /dev/null
+++ b/ooni/plugins/new_bridget.py
@@ -0,0 +1,105 @@
+"""
+This is a self genrated test created by scaffolding.py.
+you will need to fill it up with all your necessities.
+Safe hacking :).
+"""
+from exceptions import Exception
+from datetime import datetime
+from zope.interface import implements
+from twisted.python import usage
+from twisted.plugin import IPlugin
+from twisted.internet import reactor, task
+
+from ooni.utils import log
+from ooni.plugoo.tests import ITest, OONITest
+from ooni.plugoo.assets import Asset
+
+from ooni.lib.txtorcon import TorProtocolFactory, TorConfig, TorState
+from ooni.lib.txtorcon import DEFAULT_VALUE, launch_tor
+
+class bridgetArgs(usage.Options):
+ optParameters = [['bridges', 'b', None, 'List of bridges to scan'],
+ ['relays', 'f', None, 'List of relays to scan'],
+ ['resume', 'r', 0, 'Resume at this index'],
+ ['timeout', 't', 5, 'Timeout in seconds after which to consider a bridge not working']
+ ]
+
+class bridgetTest(OONITest):
+ implements(IPlugin, ITest)
+
+ shortName = "bridget"
+ description = "bridget"
+ requirements = None
+ options = bridgetArgs
+ blocking = False
+
+ def experiment(self, args):
+ log.msg("Doing test")
+ last_update = datetime.now()
+ tor_log = []
+
+ def check_timeout():
+ log.msg("Checking for timeout")
+ time_since_update = datetime.now() - last_update
+ if time_since_update.seconds > self.local_options['timeout']:
+ log.msg("Timed out when connecting to %s" % args)
+ l.stop()
+ self.result['reason'] = 'timeout'
+ d.errback(args)
+ return
+
+ def updates(prog, tag, summary):
+ tor_log.append((prog, tag, summary))
+ last_update = datetime.now()
+ log.msg("%d%%: %s" % (prog, summary))
+
+ def setup_failed(failure):
+ log.msg("Setup Failed.")
+ if not self.result['reason']:
+ self.result['reason'] = 'unknown'
+ self.result['input'] = args
+ self.result['result'] = 'failed'
+ self.result['tor_log'] = tor_log
+ return
+
+ def setup_complete(proto):
+ log.msg("Setup Complete.")
+ self.result['input'] = args
+ self.result['result'] = 'success'
+ return
+
+ config = TorConfig()
+ import random
+ config.SocksPort = random.randint(1024, 2**16)
+ config.ControlPort = random.randint(1024, 2**16)
+
+ if 'bridge' in args:
+ config.UseBridges = 1
+ config.Bridge = args['bridge']
+
+ config.save()
+
+ print config.config
+ self.result['tor_config'] = config.config
+ log.msg("Starting Tor connecting to %s" % args['bridge'])
+
+ l = task.LoopingCall(check_timeout)
+ l.start(1.0)
+
+ d = launch_tor(config, self.reactor, control_port=config.ControlPort, progress_updates=updates)
+ d.addCallback(setup_complete)
+ d.addErrback(setup_failed)
+ return d
+
+ def load_assets(self):
+ assets = {}
+ if self.local_options:
+ if self.local_options['bridges']:
+ assets.update({'bridge': Asset(self.local_options['bridges'])})
+ elif self.local_options['relays']:
+ assets.update({'relay': Asset(self.local_options['relay'])})
+ return assets
+
+# We need to instantiate it otherwise getPlugins does not detect it
+# XXX Find a way to load plugins without instantiating them.
+bridget = bridgetTest(None, None, None)
diff --git a/ooni/plugoo/interface.py b/ooni/plugoo/interface.py
index d00e70b..6dc83a0 100644
--- a/ooni/plugoo/interface.py
+++ b/ooni/plugoo/interface.py
@@ -53,3 +53,4 @@ class ITest(Interface):
be created. A report will be written.
"""
+
diff --git a/ooni/plugoo/reports.py b/ooni/plugoo/reports.py
index a543151..1bfdac0 100644
--- a/ooni/plugoo/reports.py
+++ b/ooni/plugoo/reports.py
@@ -93,4 +93,53 @@ class Report:
log.msg("Reporting to %s" % type)
getattr(self, type+"_report").__call__(data)
+class NewReport(object):
+ filename = 'report.log'
+ startTime = None
+ endTime = None
+ testName = None
+ ipAddr = None
+ asnAddr = None
+
+ def _open():
+ self.fp = open(self.filename, 'a+')
+
+ @property
+ def header():
+ pretty_date = date.pretty_date()
+ report_header = "# OONI Probe Report for Test %s\n" % self.testName
+ report_header += "# %s\n\n" % pretty_date
+ test_details = {'start_time': self.startTime,
+ 'asn': asnAddr,
+ 'test_name': self.testName,
+ 'addr': ipAddr}
+ report_header += yaml.dump([test_details])
+ return report_header
+
+ def create():
+ """
+ Create a new report by writing it's header.
+ """
+ self.fp = open(self.filename, 'w+')
+ self.fp.write(self.header)
+
+ def exists():
+ """
+ Returns False if the file does not exists.
+ """
+ return os.path.exists(self.filename)
+
+ def write(data):
+ """
+ Write a report to the file.
+
+ :data: python data structure to be written to report.
+ """
+ if not self.exists():
+ self.create()
+ else:
+ self._open()
+ yaml_encoded_data = yaml.dump([data])
+ self.fp.write(yaml_encoded_data)
+ self.fp.close()
diff --git a/ooni/plugoo/tests.py b/ooni/plugoo/tests.py
index 7c190eb..5fad85e 100644
--- a/ooni/plugoo/tests.py
+++ b/ooni/plugoo/tests.py
@@ -99,6 +99,7 @@ class OONITest(object):
self.d.addCallback(self.control, args)
self.d.addCallback(self.finished)
+ self.d.addErrback(self.finished)
return self.d
def control(self, result, args):
More information about the tor-commits
mailing list