Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also .

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also .
base repository: NullHypothesis/onionperf
base: master
head repository: NullHypothesis/onionperf
compare: enhancement/29368
Checking mergeability… Don’t worry, you can still create the pull request.
  • 2 commits
  • 3 files changed
  • 0 comments
  • 2 contributors
Commits on Jun 05, 2020
One can enable single onion services by passing the --single-onion flag
to OnionPerf's measure mode.
Signed-off-by: Philipp Winter <phw@nymity.ch>
Showing with 42 additions and 6 deletions.
  1. +5 −0 onionperf/docs/onionperf.rst
  2. +11 −2 onionperf/measurement.py
  3. +26 −4 onionperf/onionperf
@@ -128,6 +128,11 @@ Only download files through an Onion service (default: disabled) ::

Only download files through the Internet (default: disabled) ::

--single-onion

Use a single Onion service, which uses a direct circuit between the Onion
service and the introduction and rendezvous point. ::

--torclient-conf-file FILE

Download files using specified configuration file for the Tor client (default: disabled) ::
@@ -161,7 +161,7 @@ def logrotate_thread_task(writables, tgen_writable, torctl_writable, docroot, ni

class Measurement(object):

def __init__(self, tor_bin_path, tgen_bin_path, datadir_path, privatedir_path, nickname, oneshot, additional_client_conf=None, torclient_conf_file=None, torserver_conf_file=None):
def __init__(self, tor_bin_path, tgen_bin_path, datadir_path, privatedir_path, nickname, oneshot, additional_client_conf=None, torclient_conf_file=None, torserver_conf_file=None, single_onion=False):
self.tor_bin_path = tor_bin_path
self.tgen_bin_path = tgen_bin_path
self.datadir_path = datadir_path
@@ -176,6 +176,7 @@ def __init__(self, tor_bin_path, tgen_bin_path, datadir_path, privatedir_path, n
self.additional_client_conf = additional_client_conf
self.torclient_conf_file = torclient_conf_file
self.torserver_conf_file = torserver_conf_file
self.single_onion = single_onion

def run(self, do_onion=True, do_inet=True, client_tgen_listen_port=58888, client_tgen_connect_ip='0.0.0.0', client_tgen_connect_port=8080, client_tor_ctl_port=59050, client_tor_socks_port=59000,
server_tgen_listen_port=8080, server_tor_ctl_port=59051, server_tor_socks_port=59001):
@@ -216,7 +217,13 @@ def run(self, do_onion=True, do_inet=True, client_tgen_listen_port=58888, client

if do_onion:
logging.info("Onion Service private keys will be placed in {0}".format(self.privatedir_path))
tor_writable, torctl_writable = self.__start_tor_server(server_tor_ctl_port, server_tor_socks_port, {client_tgen_connect_port:server_tgen_listen_port})
# one must not have an open socks port when running a single
# onion service. see tor's man page for more information.
if self.single_onion:
server_tor_socks_port = 0
tor_writable, torctl_writable = self.__start_tor_server(server_tor_ctl_port,
server_tor_socks_port,
{client_tgen_connect_port:server_tgen_listen_port})
general_writables.append(tor_writable)
general_writables.append(torctl_writable)

@@ -372,6 +379,8 @@ def create_tor_config(self, control_port, socks_port, tor_datadir, name):
tor_config += self.additional_client_conf
if not 'UseEntryGuards' in tor_config and not 'UseBridges' in tor_config:
tor_config += "UseEntryGuards 0"
if name == "server" and self.single_onion:
tor_config += "HiddenServiceSingleHopMode 1\nHiddenServiceNonAnonymousMode 1\n"
return tor_config

def start_onion_service(self,
@@ -206,6 +206,11 @@ def main():
action="store_true", dest="inet_only",
default=False)

measure_parser.add_argument('-s', '--single-onion',
help="""use a single onion service""",
action="store_true", dest="single_onion",
default=False)

measure_parser.add_argument('-n', '--nickname',
help="""the 'SOURCE' STRING to use in measurement result files produced by OnionPerf""",
metavar="STRING", type=str,
@@ -346,10 +351,27 @@ def measure(args):
server_tor_ctl_port = util.get_random_free_port()
server_tor_socks_port = util.get_random_free_port()

meas = Measurement(args.torpath, args.tgenpath, args.prefix, args.private_prefix, args.nickname, args.oneshot, args.additional_client_conf, args.torclient_conf_file, args.torserver_conf_file)
meas.run(do_onion=not args.inet_only, do_inet=not args.onion_only,
client_tgen_listen_port=client_tgen_port, client_tgen_connect_ip=client_connect_ip, client_tgen_connect_port=client_connect_port, client_tor_ctl_port=client_tor_ctl_port, client_tor_socks_port=client_tor_socks_port,
server_tgen_listen_port=server_tgen_port, server_tor_ctl_port=server_tor_ctl_port, server_tor_socks_port=server_tor_socks_port)
meas = Measurement(args.torpath,
args.tgenpath,
args.prefix,
args.private_prefix,
args.nickname,
args.oneshot,
args.additional_client_conf,
args.torclient_conf_file,
args.torserver_conf_file,
args.single_onion)

meas.run(do_onion=not args.inet_only,
do_inet=not args.onion_only,
client_tgen_listen_port=client_tgen_port,
client_tgen_connect_ip=client_connect_ip,
client_tgen_connect_port=client_connect_port,
client_tor_ctl_port=client_tor_ctl_port,
client_tor_socks_port=client_tor_socks_port,
server_tgen_listen_port=server_tgen_port,
server_tor_ctl_port=server_tor_ctl_port,
server_tor_socks_port=server_tor_socks_port)
else:
logging.info("Please fix path errors to continue")

No commit comments for this range