[tor-commits] [ooni-probe/master] * Fix some bugs in Daphn3

art at torproject.org art at torproject.org
Sat Aug 18 04:33:54 UTC 2012


commit 818e4603d4d2a91f033b013db2b3dfecc5c99114
Author: Arturo Filastò <hellais at torproject.org>
Date:   Thu Aug 2 17:42:43 2012 +0200

    * Fix some bugs in Daphn3
    * Add more details to Test interface
    * Remove dead code in Reporting system
    * Make some changes to bridget
---
 bin/ooniprobe            |    5 +-
 ooni/lib/Makefile        |    4 ++
 ooni/ooniprobe.py        |    3 +-
 ooni/plugins/bridget.py  |   10 +++-
 ooni/plugins/daphn3.py   |   23 +++++------
 ooni/plugoo/interface.py |    9 ++++
 ooni/plugoo/reports.py   |   93 +++-------------------------------------------
 ooni/plugoo/tests.py     |    5 +-
 ooni/protocols/daphn3.py |   15 +++++--
 9 files changed, 56 insertions(+), 111 deletions(-)

diff --git a/bin/ooniprobe b/bin/ooniprobe
index 505e1c2..5c87831 100755
--- a/bin/ooniprobe
+++ b/bin/ooniprobe
@@ -1,4 +1,5 @@
 #!/bin/sh
-ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
+ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+echo $ROOT
 export PYTHONPATH=$PYTHONPATH:$ROOT
-python $ROOT/ooni/ooniprobe.py
+python $ROOT/ooni/ooniprobe.py $1
diff --git a/ooni/lib/Makefile b/ooni/lib/Makefile
index 4cfbee3..3b0c922 100644
--- a/ooni/lib/Makefile
+++ b/ooni/lib/Makefile
@@ -12,6 +12,10 @@ txtorcon:
 	mv txtorcon.git/txtorcon txtorcon
 	rm -rf txtorcon.git
 
+clean:
+	rm -rf txtorcon
+	rm -rf txtraceroute.py
+
 #txscapy:
 #	echo "Processing dependency txscapy"
 #	git clone https://github.com/hellais/txscapy.git txscapy.git
diff --git a/ooni/ooniprobe.py b/ooni/ooniprobe.py
index b75deca..2189ddb 100755
--- a/ooni/ooniprobe.py
+++ b/ooni/ooniprobe.py
@@ -84,7 +84,8 @@ def runTest(test, options, global_options, reactor=reactor):
         test.runTool()
         return
 
-    if test.end:
+    if test.ended:
+        print "Ending because it's ended"
         return
 
     wgen = work.WorkGenerator(test,
diff --git a/ooni/plugins/bridget.py b/ooni/plugins/bridget.py
index fa3cb67..22ff9a0 100644
--- a/ooni/plugins/bridget.py
+++ b/ooni/plugins/bridget.py
@@ -33,6 +33,7 @@ class bridgetTest(OONITest):
         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.")
@@ -45,15 +46,18 @@ class bridgetTest(OONITest):
             return report
 
         config = TorConfig()
-        config.SocksPort = 9999
-        config.OrPort = 1234
+        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, reactor, progress_updates=updates)
+        d = launch_tor(config, self.reactor, progress_updates=updates)
         d.addCallback(setup_complete)
         d.addErrback(setup_failed)
         return d
diff --git a/ooni/plugins/daphn3.py b/ooni/plugins/daphn3.py
index 6c1186e..091fe8a 100644
--- a/ooni/plugins/daphn3.py
+++ b/ooni/plugins/daphn3.py
@@ -16,31 +16,29 @@ from ooni.utils import log
 
 class Daphn3ClientProtocol(daphn3.Daphn3Protocol):
     def connectionMade(self):
-        print "I have made a connection!"
         self.next_state()
 
-    def connectionLost(self, reason):
-        pass
-
 class Daphn3ClientFactory(protocol.ClientFactory):
     protocol = Daphn3ClientProtocol
     mutator = None
     steps = None
     test = None
-    report = reports.Report('daphn3', 'daphn3.yamlooni')
 
     def buildProtocol(self, addr):
         p = self.protocol()
-        p.report = self.report
         p.factory = self
+        p.test = self.test
+
         if self.steps:
             p.steps = self.steps
 
         if not self.mutator:
             self.mutator = daphn3.Mutator(p.steps)
+
         else:
             print "Moving on to next mutation"
             self.mutator.next()
+
         p.mutator = self.mutator
         return p
 
@@ -48,6 +46,7 @@ class Daphn3ClientFactory(protocol.ClientFactory):
         print "We failed connecting the the OONIB"
         print "Cannot perform test. Perhaps it got blocked?"
         print "Please report this to tor-assistants at torproject.org"
+        self.test.result['error'] = ('Failed in connecting to OONIB', reason)
         self.test.end(d)
 
     def clientConnectionLost(self, reason):
@@ -108,15 +107,16 @@ class daphn3Test(OONITest):
     def control(self, exp_res, args):
         try:
             mutation = self.factory.mutator.get(0)
+            self.result['censored'] = False
         except:
             mutation = None
-        return {'mutation_number': args['mutation'], 'value': mutation}
+
+        return {'mutation_number': args['mutation'],
+                'value': mutation}
 
     def _failure(self, *argc, **kw):
-        print "We failed connecting the the OONIB"
-        print "Cannot perform test. Perhaps it got blocked?"
-        print "Please report this to tor-assistants at torproject.org"
-        print "Traceback: %s %s" % (argc, kw)
+        self.result['censored'] = True
+        self.result['error'] = ('Failed in connecting', (argc, kw))
         self.end()
 
     def experiment(self, args):
@@ -133,7 +133,6 @@ class daphn3Test(OONITest):
         d = endpoint.connect(self.factory)
         d.addErrback(self._failure)
         return d
-        #return endpoint.connect(Daphn3ClientFactory)
 
     def load_assets(self):
         if not self.steps:
diff --git a/ooni/plugoo/interface.py b/ooni/plugoo/interface.py
index c3b3855..d00e70b 100644
--- a/ooni/plugoo/interface.py
+++ b/ooni/plugoo/interface.py
@@ -44,3 +44,12 @@ class ITest(Interface):
         If the test does not have any assets it should return an empty dict.
         """
 
+    def end():
+        """
+        This can be called at any time to terminate the execution of all of
+        these test instances.
+
+        What this means is that no more test instances with new parameters will
+        be created. A report will be written.
+        """
+
diff --git a/ooni/plugoo/reports.py b/ooni/plugoo/reports.py
index 3a9c5d2..a543151 100644
--- a/ooni/plugoo/reports.py
+++ b/ooni/plugoo/reports.py
@@ -4,7 +4,7 @@ import os
 import yaml
 
 import itertools
-from ooni.utils import log, date
+from ooni.utils import log, date, net
 
 class Report:
     """This is the ooni-probe reporting mechanism. It allows
@@ -46,10 +46,11 @@ class Report:
         header += "# %s\n\n" % pretty_date
         self._write_to_report(header)
         # XXX replace this with something proper
+        address = net.getClientAddress()
         test_details = {'start_time': str(date.now()),
-                        'asn': 'ASN-1234',
+                        'asn': address['asn'],
                         'test_name': self.testname,
-                        'addr': '1234'}
+                        'addr': address['ip']}
         self(test_details)
 
     def _write_to_report(self, dump):
@@ -73,98 +74,16 @@ class Report:
         This should be invoked every time you wish to write some
         data to the reporting system
         """
-        #print "Writing report(s)"
-        #dump = '--- \n'
         dump = yaml.dump([data])
-        #dump += yaml.dump(data)
-
         self._write_to_report(dump)
 
-    def file_report(self, data, file=None, mode='a+'):
+    def file_report(self, data):
         """
         This reports to a file in YAML format
         """
-        if not file:
-            file = self.file
-        with open(file, mode) as f:
+        with open(self.file, 'a+') as f:
             f.write(data)
 
-    def tcp_report(self, data):
-        """
-        This connect to the specified tcp server
-        and writes the data passed as argument.
-        """
-        host, port = self.tcp.split(":")
-        tcp = socket.getprotobyname('tcp')
-        send_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, tcp)
-        try:
-            send_socket.connect((host, int(port)))
-            send_socket.send(data)
-
-        except Exception, e:
-            raise e
-
-        finally:
-            send_socket.close()
-
-
-    def scp_report(self, data, rfile=None, mode='a+'):
-        """
-        Push data to the remote ssh server.
-
-        :rfile the remote filename to write
-        :data the raw data content that should be written
-        :mode in what mode the file should be created
-        """
-        if not rfile:
-            rfile = self.file
-        host, port = self.scp.split(":")
-        transport = paramiko.Transport((host, port))
-
-        # The remote path of the remote file to write
-        rfpath = os.path.join(self.config.ssh_rpath, rfile)
-
-        try:
-            username = self.config.ssh_username
-        except:
-            raise "No username provided"
-
-        # Load the local known host key file
-        transport.load_host_keys(os.path.expanduser("~/.ssh/known_hosts"))
-
-        # We prefer to use an ssh keyfile fo authentication
-        if self.config.ssh_keyfile:
-            keyfile = os.path.expanduser(self.config.ssh_keyfile)
-            key = paramiko.RSAKey.from_private_key_file(keylocfile)
-            try:
-                transport.connect(username=username, pkey=key)
-            except Exception, e:
-                raise e
-
-        # If not even a password is fine
-        elif self.config.ssh_password:
-            try:
-                transport.connect(username=username, password=self.config.ssh_password)
-            except Exception, e:
-                raise e
-
-        # ... but no authentication, that is madness!
-        else:
-            raise "No key or password provided for ssh"
-
-        sftp = paramiko.SFTPClient.from_transport(transport)
-        try:
-            sftp = ssh.open_sftp()
-            remote_file = sftp.file(rfile, mode)
-            remote_file.set_pipelined(True)
-            remote_file.write(data)
-
-        except Exception, e:
-            raise e
-        sftp.close()
-        transport.close()
-
-
     def send_report(self, data, type):
         """
         This sends the report using the
diff --git a/ooni/plugoo/tests.py b/ooni/plugoo/tests.py
index 482b8bc..7c190eb 100644
--- a/ooni/plugoo/tests.py
+++ b/ooni/plugoo/tests.py
@@ -26,6 +26,7 @@ class OONITest(object):
     blocking = False
     reactor = None
     tool = False
+    ended = False
 
     def __init__(self, local_options, global_options, report, ooninet=None,
             reactor=None):
@@ -65,7 +66,7 @@ class OONITest(object):
         """
         self.ended = True
 
-    def finished(self, control):
+    def finished(self, return_value):
         """
         The Test has finished running, we must now calculate the test runtime
         and add all time data to the report.
@@ -76,7 +77,7 @@ class OONITest(object):
         result['start_time'] = str(self.start_time)
         result['end_time'] = str(self.end_time)
         result['run_time'] = str(self.end_time - self.start_time)
-        result['control'] = control
+        result['return_value'] = return_value
         log.msg("FINISHED %s" % result)
         self.report(result)
         return result
diff --git a/ooni/protocols/daphn3.py b/ooni/protocols/daphn3.py
index d7471ab..7514a40 100644
--- a/ooni/protocols/daphn3.py
+++ b/ooni/protocols/daphn3.py
@@ -208,6 +208,8 @@ class Daphn3Protocol(protocol.Protocol):
     to_receive_data = 0
     report = reports.Report('daphn3', 'daphn3.yamlooni')
 
+    test = None
+
     def next_state(self):
         """
         This is called once I have completed one step of the protocol and need
@@ -267,10 +269,11 @@ class Daphn3Protocol(protocol.Protocol):
         print "The connection was closed because of %s" % report['reason']
         print "State %s, Mutator %s" % (report['proto_state'],
                                         report['mutator_state'])
+        if self.test:
+            self.test.result['censored'] = True
+            self.test.result['state'] = report
         self.mutator.next()
 
-
-
     def connectionLost(self, reason):
         """
         The connection was closed. This may be because of a legittimate reason
@@ -289,8 +292,12 @@ class Daphn3Protocol(protocol.Protocol):
         else:
             print "I have reached the end of the state machine"
             print "Censorship fingerprint bruteforced!"
-            report = {'mutator_state': self.mutator.state()}
-            self.report(report)
+            if self.test:
+                print "In the test thing"
+                self.test.result['censored'] = False
+                self.test.result['state'] = report
+                self.test.result['state_walk_finished'] = True
+                self.test.report(self.test.result)
             return
 
         if reason.check(ConnectionDone):





More information about the tor-commits mailing list