[tor-commits] [onionperf/master] Measure static guard nodes.

karsten at torproject.org karsten at torproject.org
Tue Sep 1 20:40:04 UTC 2020


commit e9fd47d95db102b3a7ace36fa412e18d182c5fa4
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Tue Jun 16 21:30:07 2020 +0200

    Measure static guard nodes.
    
    Add --drop-guards parameter to use and drop guards after a given
    number of hours.
    
    Implements #33399.
---
 onionperf/measurement.py |  7 ++++---
 onionperf/monitor.py     | 18 +++++++++++++-----
 onionperf/onionperf      |  9 ++++++++-
 3 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/onionperf/measurement.py b/onionperf/measurement.py
index 4a58bc4..899b277 100644
--- a/onionperf/measurement.py
+++ b/onionperf/measurement.py
@@ -172,7 +172,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, single_onion=False):
+    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, drop_guards_interval_hours=None):
         self.tor_bin_path = tor_bin_path
         self.tgen_bin_path = tgen_bin_path
         self.datadir_path = datadir_path
@@ -188,6 +188,7 @@ class Measurement(object):
         self.torclient_conf_file = torclient_conf_file
         self.torserver_conf_file = torserver_conf_file
         self.single_onion = single_onion
+        self.drop_guards_interval_hours = drop_guards_interval_hours
 
     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):
@@ -388,7 +389,7 @@ WarnUnsafeSocks 0\nSafeLogging 0\nMaxCircuitDirtiness 60 seconds\nDataDirectory
                 tor_config = tor_config + f.read()
         if name == "client" and self.additional_client_conf:
             tor_config += self.additional_client_conf
-        if not 'UseEntryGuards' in tor_config and not 'UseBridges' in tor_config:
+        if not 'UseEntryGuards' in tor_config and not 'UseBridges' in tor_config and self.drop_guards_interval_hours == 0:
             tor_config += "UseEntryGuards 0\n"
         if name == "server" and self.single_onion:
             tor_config += "HiddenServiceSingleHopMode 1\nHiddenServiceNonAnonymousMode 1\n"
@@ -467,7 +468,7 @@ WarnUnsafeSocks 0\nSafeLogging 0\nMaxCircuitDirtiness 60 seconds\nDataDirectory
 
         torctl_events = [e for e in monitor.get_supported_torctl_events() if e not in ['DEBUG', 'INFO', 'NOTICE', 'WARN', 'ERR']]
         newnym_interval_seconds = 300
-        torctl_args = (control_port, torctl_writable, torctl_events, newnym_interval_seconds, self.done_event)
+        torctl_args = (control_port, torctl_writable, torctl_events, newnym_interval_seconds, self.drop_guards_interval_hours, self.done_event)
         torctl_helper = threading.Thread(target=monitor.tor_monitor_run, name="torctl_{0}_helper".format(name), args=torctl_args)
         torctl_helper.start()
         self.threads.append(torctl_helper)
diff --git a/onionperf/monitor.py b/onionperf/monitor.py
index 5387bff..ac6fea9 100644
--- a/onionperf/monitor.py
+++ b/onionperf/monitor.py
@@ -22,7 +22,7 @@ class TorMonitor(object):
         self.writable = writable
         self.events = events
 
-    def run(self, newnym_interval_seconds=None, done_ev=None):
+    def run(self, newnym_interval_seconds=None, drop_guards_interval_hours=0, done_ev=None):
         with Controller.from_port(port=self.tor_ctl_port) as torctl:
             torctl.authenticate()
 
@@ -54,6 +54,10 @@ class TorMonitor(object):
             # let stem run its threads and log all of the events, until user interrupts
             try:
                 interval_count = 0
+                if newnym_interval_seconds is not None:
+                    next_newnym = newnym_interval_seconds
+                if drop_guards_interval_hours > 0:
+                    next_drop_guards = drop_guards_interval_hours * 3600
                 while done_ev is None or not done_ev.is_set():
                     # if self.filepath != '-' and os.path.exists(self.filepath):
                     #    with open(self.filepath, 'rb') as sizef:
@@ -61,9 +65,13 @@ class TorMonitor(object):
                     #        logging.info(msg)
                     sleep(1)
                     interval_count += 1
-                    if newnym_interval_seconds is not None and interval_count >= newnym_interval_seconds:
-                        interval_count = 0
+                    if newnym_interval_seconds is not None and interval_count >= next_newnym:
+                        next_newnym += newnym_interval_seconds
                         torctl.signal(Signal.NEWNYM)
+                    if drop_guards_interval_hours > 0 and interval_count >= next_drop_guards:
+                        next_drop_guards += drop_guards_interval_hours * 3600
+                        torctl.drop_guards()
+
             except KeyboardInterrupt:
                 pass  # the user hit ctrl+c
 
@@ -79,6 +87,6 @@ class TorMonitor(object):
         unix_ts = (utcnow - epoch).total_seconds()
         writable.write("{0} {1:.02f} {2}".format(now.strftime("%Y-%m-%d %H:%M:%S"), unix_ts, msg))
 
-def tor_monitor_run(tor_ctl_port, writable, events, newnym_interval_seconds, done_ev):
+def tor_monitor_run(tor_ctl_port, writable, events, newnym_interval_seconds, drop_guards_interval_hours, done_ev):
     torctl_monitor = TorMonitor(tor_ctl_port, writable, events)
-    torctl_monitor.run(newnym_interval_seconds=newnym_interval_seconds, done_ev=done_ev)
+    torctl_monitor.run(newnym_interval_seconds=newnym_interval_seconds, drop_guards_interval_hours=drop_guards_interval_hours, done_ev=done_ev)
diff --git a/onionperf/onionperf b/onionperf/onionperf
index a7d32f6..52a779f 100755
--- a/onionperf/onionperf
+++ b/onionperf/onionperf
@@ -194,6 +194,12 @@ def main():
         action="store", dest="tgenconnectport",
         default=8080)
 
+    measure_parser.add_argument('--drop-guards',
+        help="""Use and drop guards every N > 0 hours, or do not use guards at all if N = 0""",
+        metavar="N", type=type_nonnegative_integer,
+        action="store", dest="drop_guards_interval_hours",
+        default=0)
+
     onion_or_inet_only_group = measure_parser.add_mutually_exclusive_group()
 
     onion_or_inet_only_group.add_argument('-o', '--onion-only',
@@ -360,7 +366,8 @@ def measure(args):
                            args.additional_client_conf,
                            args.torclient_conf_file,
                            args.torserver_conf_file,
-                           args.single_onion)
+                           args.single_onion,
+                           args.drop_guards_interval_hours)
 
         meas.run(do_onion=not args.inet_only,
                  do_inet=not args.onion_only,





More information about the tor-commits mailing list