[tor-commits] [ooni-probe/master] Implement first iteration of Tor Hidden Service support for ooniprobe and oonib

art at torproject.org art at torproject.org
Wed Nov 21 15:36:20 UTC 2012


commit d0d9662b4cafe11979e8173e6cc03c548f99ecf0
Author: Arturo Filastò <art at fuffa.org>
Date:   Wed Nov 21 14:49:29 2012 +0100

    Implement first iteration of Tor Hidden Service support for ooniprobe and oonib
    * Also with better error handling for reports
---
 ooni/reporter.py     |   16 +++++++++++---
 oonib/oonibackend.py |   17 ++++-----------
 oonib/runner.py      |   51 +++++++++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 67 insertions(+), 17 deletions(-)

diff --git a/ooni/reporter.py b/ooni/reporter.py
index 0110b02..0635d2f 100644
--- a/ooni/reporter.py
+++ b/ooni/reporter.py
@@ -188,9 +188,12 @@ class OONIBReporter(OReporter):
     def __init__(self, backend_url):
         from ooni.lib.txagentwithsocks import Agent
         from twisted.internet import reactor
+        try:
+            self.agent = Agent(reactor, sockshost="127.0.0.1",
+                socksport=int(config.advanced.tor_socksport))
+        except Exception, e:
+            log.exception(e)
 
-        self.agent = Agent(reactor, sockshost="127.0.0.1",
-                socksport=config.advanced.socksport)
         self.backend_url = backend_url
 
     @defer.inlineCallbacks
@@ -257,7 +260,7 @@ class OONIBReporter(OReporter):
         bodyProducer = StringProducer(json.dumps(request))
 
         try:
-            response = yield self.agent.request("POST", url, 
+            response = yield self.agent.request("POST", url,
                                 bodyProducer=bodyProducer)
         except ConnectionRefusedError:
             log.err("Connection to reporting backend failed (ConnectionRefusedError)")
@@ -273,7 +276,12 @@ class OONIBReporter(OReporter):
 
         backend_response = yield response_body
 
-        parsed_response = json.loads(backend_response)
+        try:
+            parsed_response = json.loads(backend_response)
+        except Exception, e:
+            log.exception(e)
+            raise OONIBReportCreationFailed
+
         self.report_id = parsed_response['report_id']
         self.backend_version = parsed_response['backend_version']
         log.debug("Created report with id %s" % parsed_response['report_id'])
diff --git a/oonib/oonibackend.py b/oonib/oonibackend.py
index dd25c8c..c712bc4 100644
--- a/oonib/oonibackend.py
+++ b/oonib/oonibackend.py
@@ -13,19 +13,17 @@ from twisted.application import internet, service
 from twisted.application.service import Application
 from twisted.names import dns
 
-from ooni.utils import log
+from cyclone import web
 
-from oonib.report.api import reportingBackend
-
-from oonib import config
+import txtorcon
 
 from oonib.testhelpers import dns_helpers, ssl_helpers
 from oonib.testhelpers import http_helpers, tcp_helpers
 
-#from oonib.testhelpers.daphn3 import Daphn3Server
-from oonib import db_threadpool
+from ooni.utils import log
 
-from cyclone import web
+from oonib import db_threadpool
+from oonib import config
 
 application = service.Application('oonibackend')
 serviceCollection = service.IServiceCollection(application)
@@ -59,11 +57,6 @@ if config.helpers.daphn3.port:
                             tcp_helpers.Daphn3Server())
     daphn3_helper.setServiceParent(serviceCollection)
 
-if config.main.collector_port:
-    print "Starting Collector on %s" % config.main.collector_port
-    collector = internet.TCPServer(int(config.main.collector_port),
-                       reportingBackend)
-    collector.setServiceParent(serviceCollection)
 
 if config.helpers.tcp_echo.port:
     print "Starting TCP echo helper on %s" % config.helpers.tcp_echo.port
diff --git a/oonib/runner.py b/oonib/runner.py
index febef46..2538710 100644
--- a/oonib/runner.py
+++ b/oonib/runner.py
@@ -4,11 +4,45 @@ We are just extending the
 
 """
 
+from twisted.internet import reactor
 from twisted.application import service, internet, app
 from twisted.python.runtime import platformType
 
+import txtorcon
+
+from oonib.report.api import reportingBackend
+
+from oonib import config
 from ooni.utils import log
 
+def txSetupFailed(failure):
+    log.err("Setup failed")
+    log.exception(failure)
+
+def setupCollector(tor_process_protocol):
+    def setup_complete(port):
+        print "Exposed collector Tor hidden service on httpo://%s" % port.onion_uri
+
+    torconfig = txtorcon.TorConfig(tor_process_protocol.tor_protocol)
+    public_port = 80
+    hs_endpoint = txtorcon.TCPHiddenServiceEndpoint(reactor, torconfig,
+            public_port)
+    hidden_service = hs_endpoint.listen(reportingBackend)
+    hidden_service.addCallback(setup_complete)
+    hidden_service.addErrback(txSetupFailed)
+
+def startTor():
+    def updates(prog, tag, summary):
+        print "%d%%: %s" % (prog, summary)
+
+    torconfig = txtorcon.TorConfig()
+    torconfig.SocksPort = 9055
+    torconfig.save()
+    d = txtorcon.launch_tor(torconfig, reactor,
+            progress_updates=updates)
+    d.addCallback(setupCollector)
+    d.addErrback(txSetupFailed)
+
 class OBaseRunner():
     pass
 
@@ -17,9 +51,24 @@ if platformType == "win32":
                                 WindowsApplicationRunner
 
     OBaseRunner = WindowsApplicationRunner
+
 else:
     from twisted.scripts._twistd_unix import ServerOptions, \
                                 UnixApplicationRunner
-    OBaseRunner = UnixApplicationRunner
+    class OBaseRunner(UnixApplicationRunner):
+        def postApplication(self):
+            """
+            To be called after the application is created: start the
+            application and run the reactor. After the reactor stops,
+            clean up PID files and such.
+            """
+            self.startApplication(self.application)
+            # This is our addition. The rest is taken from
+            # twisted/scripts/_twistd_unix.py 12.2.0
+            startTor()
+            self.startReactor(None, self.oldstdout, self.oldstderr)
+            self.removePID(self.config['pidfile'])
 
 OBaseRunner.loggerFactory = log.LoggerFactory
+
+





More information about the tor-commits mailing list