[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