commit 315215dc66089302a92bd3a01c37d008f698811f
Author: juga0 <juga(a)riseup.net>
Date: Tue Mar 5 04:26:42 2019 +0000
fix: !minor. Catch SocketClosed when stopping
When SocketClosed is raised and the scanner is stopping, catch the
exception.
In #28869 similar exceptions were catched, but this was forgotten.
Bugfix v0.6.0.
---
sbws/core/scanner.py | 13 ++++++++++---
sbws/lib/circuitbuilder.py | 2 +-
sbws/util/requests.py | 3 +++
sbws/util/stem.py | 14 ++++++++++++--
4 files changed, 26 insertions(+), 6 deletions(-)
diff --git a/sbws/core/scanner.py b/sbws/core/scanner.py
index 4ad2cb5..cdf0b9b 100644
--- a/sbws/core/scanner.py
+++ b/sbws/core/scanner.py
@@ -240,6 +240,9 @@ def measure_relay(args, conf, destinations, cb, rl, relay):
log.debug('Measuring %s %s', relay.nickname, relay.fingerprint)
s = requests_utils.make_session(
cb.controller, conf.getfloat('general', 'http_timeout'))
+ # Probably because the scanner is stopping.
+ if s is None:
+ return None
# Pick a destionation
dest = destinations.next()
# If there is no any destination at this point, it can not continue.
@@ -401,13 +404,17 @@ def result_putter_error(target):
measurement -- and return that function so it can be used by someone else
'''
def closure(object):
+ if settings.end_event.is_set():
+ return
# The only object that can be here if there is not any uncatched
# exception is stem.SocketClosed when stopping sbws
# An exception here means that the worker thread finished.
log.warning(FILLUP_TICKET_MSG)
- # To print the traceback that happened in the thread, not here in the
- # main process
- traceback.print_exception(type(object), object, object.__traceback__)
+ # To print the traceback that happened in the thread, not here in
+ # the main process.
+ log.warning("".join(traceback.format_exception(
+ type(object), object, object.__traceback__))
+ )
return closure
diff --git a/sbws/lib/circuitbuilder.py b/sbws/lib/circuitbuilder.py
index c5bae5c..45b807f 100644
--- a/sbws/lib/circuitbuilder.py
+++ b/sbws/lib/circuitbuilder.py
@@ -66,7 +66,7 @@ class CircuitBuilder:
circ_id = c.new_circuit(
path, await_build=True, timeout=timeout)
except (InvalidRequest, CircuitExtensionFailed,
- ProtocolError, Timeout) as e:
+ ProtocolError, Timeout, SocketClosed) as e:
return None, str(e)
return circ_id, None
diff --git a/sbws/util/requests.py b/sbws/util/requests.py
index 615916d..ede847d 100644
--- a/sbws/util/requests.py
+++ b/sbws/util/requests.py
@@ -24,6 +24,9 @@ def make_session(controller, timeout):
"""
s = TimedSession()
socks_info = stem_utils.get_socks_info(controller)
+ # Probably because scanner is stopping.
+ if socks_info is None:
+ return None
s.proxies = {
'http': 'socks5h://{}:{}'.format(*socks_info),
'https': 'socks5h://{}:{}'.format(*socks_info),
diff --git a/sbws/util/stem.py b/sbws/util/stem.py
index cd8ca6e..05f8e90 100644
--- a/sbws/util/stem.py
+++ b/sbws/util/stem.py
@@ -14,6 +14,7 @@ import os
from sbws.globals import fail_hard
from sbws.globals import (TORRC_STARTING_POINT, TORRC_RUNTIME_OPTIONS,
TORRC_OPTIONS_CAN_FAIL)
+from sbws import settings
log = logging.getLogger(__name__)
stream_building_lock = RLock()
@@ -50,6 +51,11 @@ def add_event_listener(controller, func, event):
def remove_event_listener(controller, func):
try:
controller.remove_event_listener(func)
+ except SocketClosed as e:
+ if not settings.end_event.is_set():
+ log.debug(e)
+ else:
+ log.exception(e)
except ProtocolError as e:
log.exception("Exception trying to remove event %s", e)
@@ -245,9 +251,13 @@ def get_socks_info(controller):
try:
socks_ports = controller.get_listeners(Listener.SOCKS)
return socks_ports[0]
+ except SocketClosed as e:
+ if not settings.end_event.is_set():
+ log.debug(e)
+ # This might need to return the eception if this happen in other cases
+ # than when stopping the scanner.
except ControllerError as e:
- log.exception("Exception trying to get socks info: %e.", e)
- exit(1)
+ log.debug(e)
def only_relays_with_bandwidth(controller, relays, min_bw=None, max_bw=None):