Commit f7847ed2 authored by juga's avatar juga
Browse files

chg: stem: Add function to connect or start tor

Move initialization via existing socket to this new function and start
tor only when it fails.

Closes: #33150.
parent 80f379ac
......@@ -679,21 +679,8 @@ def run_speedtest(args, conf):
"""
global rd, pool, controller
controller = stem_utils.init_controller(conf)
if not controller:
controller = stem_utils.launch_tor(conf)
else:
log.warning(
'Is sbws already running? '
'We found an existing Tor process at %s. We are not going to '
'launch Tor, nor are we going to try to configure it to behave '
'like we expect. This might work okay, but it also might not. '
'If you experience problems, you should try letting sbws launch '
'Tor for itself. The ability to use an already running Tor only '
'exists for sbws developers. It is expected to be broken and may '
'even lead to messed up results.',
conf.getpath('tor', 'control_socket'))
time.sleep(15)
controller = stem_utils.launch_or_connect_to_tor(conf)
# When there will be a refactor where conf is global, this can be removed
# from here.
......
......@@ -6,7 +6,6 @@ from stem import (SocketError, InvalidRequest, UnsatisfiableRequest,
ProtocolError, SocketClosed)
from stem.connection import IncorrectSocketType
import stem.process
from configparser import ConfigParser
from threading import RLock
import copy
import logging
......@@ -68,10 +67,8 @@ def init_controller(conf):
control_port = int(control_port)
# If it can not connect, the program will exit here
c = _init_controller_port(control_port)
else:
c = _init_controller_socket(
socket=conf.getpath('tor', 'control_socket')
)
# There is no configuration for external control socket, therefore do not
# attempt to connect to the control socket.
return c
......@@ -190,7 +187,6 @@ def set_torrc_options_can_fail(controller):
def launch_tor(conf):
assert isinstance(conf, ConfigParser)
os.makedirs(conf.getpath('tor', 'datadir'), mode=0o700, exist_ok=True)
os.makedirs(conf.getpath('tor', 'log'), exist_ok=True)
os.makedirs(conf.getpath('tor', 'run_dpath'), mode=0o700, exist_ok=True)
......@@ -216,6 +212,8 @@ def launch_tor(conf):
torrc = parse_user_torrc_config(torrc, conf['tor']['extra_lines'])
# Finally launch Tor
try:
# If there is already a tor process running with the same control
# socket, this will exit here.
stem.process.launch_tor_with_config(
torrc, init_msg_handler=log.debug, take_ownership=True)
except Exception as e:
......@@ -223,6 +221,18 @@ def launch_tor(conf):
log.info("Started own tor.")
# And return a controller to it
cont = _init_controller_socket(conf.getpath('tor', 'control_socket'))
# In the case it was not possible to connect to own tor socket.
if not cont:
fail_hard('Could not connect to own tor control socket.')
return cont
def launch_or_connect_to_tor(conf):
# If connecting to an existing controller, there is no need to configure
# own tor.
cont = init_controller(conf)
if not cont:
cont = launch_tor(conf)
# Set options that can fail at runtime
set_torrc_options_can_fail(cont)
# Set runtime options
......
......@@ -7,7 +7,7 @@ from sbws.lib.circuitbuilder import GapsCircuitBuilder as CB
from sbws.lib.destination import DestinationList
from sbws.lib.relaylist import RelayList
from sbws.util.config import _get_default_config
from sbws.util.stem import launch_tor
from sbws.util.stem import launch_or_connect_to_tor
class _PseudoArguments(argparse.Namespace):
......@@ -91,7 +91,7 @@ SafeLogging 0
@pytest.fixture(scope='session')
def persistent_launch_tor(conf):
cont = launch_tor(conf)
cont = launch_or_connect_to_tor(conf)
return cont
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment