[tor-commits] [sbws/master] Remove is_controller_ok and log exceptions

pastly at torproject.org pastly at torproject.org
Wed Jul 11 15:05:40 UTC 2018


commit b5d3fb4fc8d1d2edb9c48a7a6d9996f7b37912b9
Author: juga0 <juga at riseup.net>
Date:   Tue Jul 3 08:26:40 2018 +0000

    Remove is_controller_ok and log exceptions
---
 sbws/core/scanner.py                |  1 -
 sbws/lib/circuitbuilder.py          | 32 ++++++++++++---------
 sbws/lib/relaylist.py               | 21 +++++++++-----
 sbws/util/stem.py                   | 57 +++++++++++++++++++++----------------
 tests/integration/util/test_stem.py |  1 -
 5 files changed, 66 insertions(+), 46 deletions(-)

diff --git a/sbws/core/scanner.py b/sbws/core/scanner.py
index 249d8d4..5bcf276 100644
--- a/sbws/core/scanner.py
+++ b/sbws/core/scanner.py
@@ -347,7 +347,6 @@ def run_speedtest(args, conf):
             'exists for sbws developers. It is expected to be broken and may '
             'even lead to messed up results.', conf['tor']['control_socket'])
         time.sleep(15)
-    assert stem_utils.is_controller_okay(controller)
     rl = RelayList(args, conf, controller)
     cb = CB(args, conf, controller, rl)
     rd = ResultDump(args, conf, end_event)
diff --git a/sbws/lib/circuitbuilder.py b/sbws/lib/circuitbuilder.py
index d55b929..b8d4db7 100644
--- a/sbws/lib/circuitbuilder.py
+++ b/sbws/lib/circuitbuilder.py
@@ -1,7 +1,6 @@
 from stem import CircuitExtensionFailed, InvalidRequest, ProtocolError, Timeout
 from stem import InvalidArguments
 import random
-import sbws.util.stem as stem_utils
 from .relaylist import Relay
 import logging
 
@@ -59,28 +58,30 @@ class CircuitBuilder:
 
     def get_circuit_path(self, circ_id):
         c = self.controller
-        assert stem_utils.is_controller_okay(c)
-        circ = c.get_circuit(circ_id, default=None)
-        if circ is None:
-            return None
-        return [relay[0] for relay in circ.path]
+        try:
+            circ = c.get_circuit(circ_id, default=None)
+        except Exception as e:
+            log.exception("Exception trying to get circuit: %s.", e)
+        else:
+            return [relay[0] for relay in circ.path]
+        return None
 
     def close_circuit(self, circ_id):
         c = self.controller
-        if not stem_utils.is_controller_okay(c):
-            return
-        if c.get_circuit(circ_id, default=None):
+        try:
+            c.get_circuit(circ_id, default=None)
             try:
                 c.close_circuit(circ_id)
             except InvalidArguments:
                 pass
             self.built_circuits.discard(circ_id)
+        except Exception as e:
+            log.exception("Error trying to get circuit to close it: %s.", e)
 
     def _build_circuit_impl(self, path):
         if not valid_circuit_length(path):
             raise PathLengthException()
         c = self.controller
-        assert stem_utils.is_controller_okay(c)
         timeout = self.circuit_timeout
         fp_path = '[' + ' -> '.join([p[0:8] for p in path]) + ']'
         log.debug('Building %s', fp_path)
@@ -92,6 +93,9 @@ class CircuitBuilder:
                     ProtocolError, Timeout) as e:
                 log.warning(e)
                 continue
+            except Exception as e:
+                log.exception("Exception trying to build circuit: %s.", e)
+                continue
             else:
                 return circ_id
         return None
@@ -100,14 +104,16 @@ class CircuitBuilder:
         c = self.controller
         if not self.close_circuits_on_exit:
             return
-        if not stem_utils.is_controller_okay(c):
-            return
         for circ_id in self.built_circuits:
-            if c.get_circuit(circ_id, default=None):
+            try:
+                c.get_circuit(circ_id, default=None)
                 try:
                     c.close_circuit(circ_id)
                 except InvalidArguments:
                     pass
+            except Exception as e:
+                log.exception("Exception trying to get circuit to delete: %s",
+                              e)
         self.built_circuits.clear()
 
 
diff --git a/sbws/lib/relaylist.py b/sbws/lib/relaylist.py
index 11390de..bafd7b7 100644
--- a/sbws/lib/relaylist.py
+++ b/sbws/lib/relaylist.py
@@ -1,6 +1,5 @@
 from stem.descriptor.router_status_entry import RouterStatusEntryV3
 from stem.descriptor.server_descriptor import ServerDescriptor
-import sbws.util.stem as stem_utils
 from stem import Flag
 from stem.util.connection import is_valid_ipv4_address
 from stem.util.connection import is_valid_ipv6_address
@@ -25,17 +24,22 @@ class Relay:
         '''
         assert isinstance(fp, str)
         assert len(fp) == 40
-        assert stem_utils.is_controller_okay(cont)
         if ns is not None:
             assert isinstance(ns, RouterStatusEntryV3)
             self._ns = ns
         else:
-            self._ns = cont.get_network_status(fp, default=None)
+            try:
+                self._ns = cont.get_network_status(fp, default=None)
+            except Exception as e:
+                log.exception("Exception trying to get ns %s", e)
         if desc is not None:
             assert isinstance(desc, ServerDescriptor)
             self._desc = desc
         else:
-            self._desc = cont.get_server_descriptor(fp, default=None)
+            try:
+                self._desc = cont.get_server_descriptor(fp, default=None)
+            except Exception as e:
+                log.exception("Exception trying to get ns %s", e)
 
     def _from_desc(self, attr):
         if not self._desc:
@@ -190,9 +194,12 @@ class RelayList:
 
     def _init_relays(self):
         c = self._controller
-        assert stem_utils.is_controller_okay(c)
-        relays = [Relay(ns.fingerprint, c, ns=ns)
-                  for ns in c.get_network_statuses()]
+        try:
+            relays = [Relay(ns.fingerprint, c, ns=ns)
+                      for ns in c.get_network_statuses()]
+        except Exception as e:
+            log.exception("Exception trying to init relays %s", e)
+            return []
         return relays
 
     def _refresh(self):
diff --git a/sbws/util/stem.py b/sbws/util/stem.py
index 8a92673..54779fd 100644
--- a/sbws/util/stem.py
+++ b/sbws/util/stem.py
@@ -17,7 +17,6 @@ stream_building_lock = RLock()
 def attach_stream_to_circuit_listener(controller, circ_id):
     ''' Returns a function that should be given to add_event_listener(). It
     looks for newly created streams and attaches them to the given circ_id '''
-    assert is_controller_okay(controller)
 
     def closure_stream_event_listener(st):
         if st.status == 'NEW' and st.purpose == 'USER':
@@ -28,21 +27,25 @@ def attach_stream_to_circuit_listener(controller, circ_id):
             except (UnsatisfiableRequest, InvalidRequest) as e:
                 log.warning('Couldn\'t attach stream to circ %s: %s',
                             circ_id, e)
+            except Exception as e:
+                log.exception("Exception trying to get ns %s", e)
         else:
             pass
     return closure_stream_event_listener
 
 
 def add_event_listener(controller, func, event):
-    assert is_controller_okay(controller)
-    controller.add_event_listener(func, event)
+    try:
+        controller.add_event_listener(func, event)
+    except Exception as e:
+        log.exception("Exception trying to add event listener %s", e)
 
 
 def remove_event_listener(controller, func):
-    if not is_controller_okay(controller):
-        log.warning('Controller not okay so not trying to remove event')
-        return
-    controller.remove_event_listener(func)
+    try:
+        controller.remove_event_listener(func)
+    except Exception as e:
+        log.exception("Exception trying to remove event %s", e)
 
 
 def init_controller(port=None, path=None, set_custom_stream_settings=True):
@@ -72,9 +75,11 @@ def init_controller(port=None, path=None, set_custom_stream_settings=True):
 
 
 def is_bootstrapped(c):
-    if not is_controller_okay(c):
+    try:
+        line = c.get_info('status/bootstrap-phase')
+    except Exception as e:
+        log.exception("Exception bootstrapping %s", e)
         return False
-    line = c.get_info('status/bootstrap-phase')
     state, _, progress, *_ = line.split()
     progress = int(progress.split('=')[1])
     if state == 'NOTICE' and progress == 100:
@@ -83,12 +88,6 @@ def is_bootstrapped(c):
     return False
 
 
-def is_controller_okay(c):
-    if not c:
-        return False
-    return c.is_alive() and c.is_authenticated()
-
-
 def _init_controller_port(port):
     assert isinstance(port, int)
     try:
@@ -106,6 +105,10 @@ def _init_controller_socket(socket):
         c = Controller.from_socket_file(path=socket)
         c.authenticate()
     except (IncorrectSocketType, SocketError):
+        log.debug("Error initting controller socket: socket error.")
+        return None
+    except Exception as e:
+        log.exception("Error initting controller socket: %s", e)
         return None
     # TODO: Allow for auth via more than just CookieAuthentication
     return c
@@ -182,21 +185,26 @@ def launch_tor(conf):
         torrc, init_msg_handler=log.debug, take_ownership=True)
     # And return a controller to it
     cont = _init_controller_socket(conf['tor']['control_socket'])
-    assert is_controller_okay(cont)
     # Because we build things by hand and can't set these before Tor bootstraps
     cont.set_conf('__DisablePredictedCircuits', '1')
     cont.set_conf('__LeaveStreamsUnattached', '1')
-    log.info('Started and connected to Tor %s via %s', cont.get_version(),
-             conf['tor']['control_socket'])
-    return cont
+    try:
+        log.info('Started and connected to Tor %s via %s', cont.get_version(),
+                 conf['tor']['control_socket'])
+        return cont
+    except Exception as e:
+        log.exception("Exception trying to launch tor %s", e)
 
 
 def get_socks_info(controller):
     ''' Returns the first SocksPort Tor is configured to listen on, in the form
     of an (address, port) tuple '''
-    assert is_controller_okay(controller)
-    socks_ports = controller.get_listeners(Listener.SOCKS)
-    return socks_ports[0]
+    try:
+        socks_ports = controller.get_listeners(Listener.SOCKS)
+        return socks_ports[0]
+    except Exception as e:
+        log.exception("Exception trying to get socks info: %e.", e)
+        exit(1)
 
 
 def only_relays_with_bandwidth(controller, relays, min_bw=None, max_bw=None):
@@ -206,7 +214,6 @@ def only_relays_with_bandwidth(controller, relays, min_bw=None, max_bw=None):
     min_bw nor max_bw are given, essentially just returns the input list of
     relays.
     '''
-    assert is_controller_okay(controller)
     assert min_bw is None or min_bw >= 0
     assert max_bw is None or max_bw >= 0
     ret = []
@@ -221,7 +228,6 @@ def only_relays_with_bandwidth(controller, relays, min_bw=None, max_bw=None):
 
 
 def circuit_str(controller, circ_id):
-    assert is_controller_okay(controller)
     assert isinstance(circ_id, str)
     int(circ_id)
     try:
@@ -230,6 +236,9 @@ def circuit_str(controller, circ_id):
         log.warning('Circuit %s no longer seems to exist so can\'t return '
                     'a valid circuit string for it: %s', circ_id, e)
         return None
+    except Exception as e:
+        log.exception("Exception trying to get circuit string %s", e)
+        return None
     return '[' +\
         ' -> '.join(['{} ({})'.format(n, fp[0:8]) for fp, n in circ.path]) +\
         ']'
diff --git a/tests/integration/util/test_stem.py b/tests/integration/util/test_stem.py
index 203cf5d..291f485 100644
--- a/tests/integration/util/test_stem.py
+++ b/tests/integration/util/test_stem.py
@@ -3,5 +3,4 @@ import sbws.util.stem as stem_utils
 
 def test_launch_and_okay(persistent_launch_tor):
     cont = persistent_launch_tor
-    assert stem_utils.is_controller_okay(cont)
     assert stem_utils.is_bootstrapped(cont)





More information about the tor-commits mailing list