[tor-commits] [oonib/master] keep old config behavior with new endpoint code

art at torproject.org art at torproject.org
Mon May 30 13:44:56 UTC 2016


commit 575f0aa5a44d1f851fb3d4fbb1bcf1fbf36a4f2d
Author: Joe Landers <joe at joelanders.net>
Date:   Sun May 15 18:25:41 2016 +0200

    keep old config behavior with new endpoint code
---
 oonib/onion.py       | 36 ++++++++++++++++++++++++++++++++----
 oonib/oonibackend.py | 42 +++++++++++++++++++-----------------------
 2 files changed, 51 insertions(+), 27 deletions(-)

diff --git a/oonib/onion.py b/oonib/onion.py
index 262e672..8abefe5 100644
--- a/oonib/onion.py
+++ b/oonib/onion.py
@@ -1,7 +1,7 @@
 import tempfile
 from oonib import log
 from oonib.config import config
-from twisted.internet import reactor, endpoints
+from twisted.internet import reactor, endpoints, defer
 import os
 
 from random import randint
@@ -53,9 +53,8 @@ def txSetupFailed(failure):
     log.err("Setup failed")
     log.exception(failure)
 
-def configTor(torconfig):
-    def updates(prog, tag, summary):
-        print("%d%%: %s" % (prog, summary))
+def _configTor():
+    torconfig = TorConfig()
 
     if config.main.socks_port:
         torconfig.SocksPort = config.main.socks_port
@@ -89,3 +88,32 @@ def configTor(torconfig):
         config.main.socks_port = socks_port
 
     torconfig.save()
+    return torconfig
+
+# get_global_tor is a near-rip of that from txtorcon (so you can have some
+# confidence in the logic of it), but we use our own _configTor() while
+# the txtorcon function hardcodes some default values we don't want.
+_global_tor_config = None
+_global_tor_lock = defer.DeferredLock()
+# we need the lock because we (potentially) yield several times while
+# "creating" the TorConfig instance
+
+ at defer.inlineCallbacks
+def get_global_tor(reactor):
+    global _global_tor_config
+    global _global_tor_lock
+    yield _global_tor_lock.acquire()
+
+    try:
+        if _global_tor_config is None:
+            _global_tor_config = config = _configTor()
+
+            # start Tor launching
+            def updates(prog, tag, summary):
+                print("%d%%: %s" % (prog, summary))
+            yield launch_tor(config, reactor, progress_updates=updates)
+            yield config.post_bootstrap
+
+        defer.returnValue(_global_tor_config)
+    finally:
+        _global_tor_lock.release()
diff --git a/oonib/oonibackend.py b/oonib/oonibackend.py
index 337b797..18bacf0 100644
--- a/oonib/oonibackend.py
+++ b/oonib/oonibackend.py
@@ -11,14 +11,14 @@ from distutils.version import LooseVersion
 
 from oonib.api import ooniBackend, ooniBouncer
 from oonib.config import config
-from oonib.onion import configTor
+from oonib.onion import get_global_tor
 from oonib.testhelpers import dns_helpers, ssl_helpers
 from oonib.testhelpers import http_helpers, tcp_helpers
 
 import os
 
 from twisted.application import internet, service
-from twisted.internet import reactor, endpoints, ssl
+from twisted.internet import reactor, endpoints, ssl, defer
 from twisted.names import dns
 
 from txtorcon import TCPHiddenServiceEndpoint, TorConfig
@@ -103,15 +103,17 @@ if config.helpers['http-return-json-headers'].port:
     http_return_request_helper.startService()
 
 def getHSEndpoint(endpoint_config):
-    if torconfig is None:
-        raise Exception("you probably need to set tor_hidden_service: true")
-    hsdir = os.path.join(torconfig.DataDirectory, endpoint_config['hsdir'])
+    hsdir = endpoint_config['hsdir']
+    hsdir = os.path.expanduser(hsdir)
+    hsdir = os.path.realpath(hsdir)
     if LooseVersion(txtorcon_version) >= LooseVersion('0.10.0'):
-        return TCPHiddenServiceEndpoint.global_tor(reactor,
+        return TCPHiddenServiceEndpoint(reactor,
+                                        get_global_tor(reactor),
                                         80,
                                         hidden_service_dir=hsdir)
     else:
-        return TCPHiddenServiceEndpoint.global_tor(reactor,
+        return TCPHiddenServiceEndpoint(reactor,
+                                        get_global_tor(reactor),
                                         80,
                                         data_dir=hsdir)
 
@@ -151,27 +153,21 @@ def createService(endpoint, role, endpoint_config):
     multiService.addService(service)
     service.startService()
 
-torconfig = None
-if config.main.tor_hidden_service:
-    torconfig = TorConfig()
-    configTor(torconfig)
-
 # this is to ensure same behaviour with an old config file
-if config.main.bouncer_endpoints is None and config.main.tor_hidden_service:
-    config.main.bouncer_endpoints = [ {'type': 'onion', 'hsdir': 'bouncer'} ]
-
-if config.main.collector_endpoints is None and config.main.tor_hidden_service:
-    config.main.collector_endpoints = [ {'type': 'onion', 'hsdir': 'collector'} ]
-
-config.main.bouncer_endpoints = config.main.get('bouncer_endpoints', [])
-config.main.collector_endpoints = config.main.get('collector_endpoints', [])
-
-for endpoint_config in config.main.bouncer_endpoints:
+if config.main.tor_hidden_service and \
+        config.main.bouncer_endpoints is None and \
+        config.main.collector_endpoints is None:
+    bouncer_hsdir   = os.path.join(config.main.tor_datadir, 'bouncer')
+    collector_hsdir = os.path.join(config.main.tor_datadir, 'collector')
+    config.main.bouncer_endpoints   = [ {'type': 'onion', 'hsdir':   bouncer_hsdir} ]
+    config.main.collector_endpoints = [ {'type': 'onion', 'hsdir': collector_hsdir} ]
+
+for endpoint_config in config.main.get('bouncer_endpoints'):
     print "Starting bouncer with config %s" % endpoint_config
     endpoint = getEndpoint(endpoint_config)
     createService(endpoint, 'bouncer', endpoint_config)
 
-for endpoint_config in config.main.collector_endpoints:
+for endpoint_config in config.main.get('collector_endpoints'):
     print "Starting collector with config %s" % endpoint_config
     endpoint = getEndpoint(endpoint_config)
     createService(endpoint, 'collector', endpoint_config)





More information about the tor-commits mailing list