[Pkg-privacy-commits] [onionbalance] 89/117: Add script for gathering stats on HS rend circuits

Donncha O'Cearbahill donncha-guest at moszumanska.debian.org
Wed Dec 16 23:18:52 UTC 2015


This is an automated email from the git hooks/post-receive script.

donncha-guest pushed a commit to branch debian/sid
in repository onionbalance.

commit bc09a87f0de548a8fb9cf0ed237680b030f2ec70
Author: Donncha O'Cearbhaill <donncha at donncha.is>
Date:   Wed Jul 15 16:32:56 2015 +0200

    Add script for gathering stats on HS rend circuits
---
 scripts/rend-connection-stats.py | 146 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 146 insertions(+)

diff --git a/scripts/rend-connection-stats.py b/scripts/rend-connection-stats.py
new file mode 100755
index 0000000..a8613ec
--- /dev/null
+++ b/scripts/rend-connection-stats.py
@@ -0,0 +1,146 @@
+# -*- coding: utf-8 -*-
+"""
+Log information about the number and rate of rendezvous connections to a HS.
+"""
+
+import sys
+import time
+import argparse
+import logging
+import logging.handlers
+import threading
+
+import stem
+from stem.control import Controller
+import schedule
+
+handler = logging.StreamHandler()
+formatter = logging.Formatter(fmt="%(asctime)s [%(levelname)s]: %(message)s")
+handler.setFormatter(formatter)
+
+logger = logging.getLogger("onionbalance")
+logger.addHandler(handler)
+logger.setLevel(logging.DEBUG)
+
+lock = threading.RLock()
+
+# Track circuits established in current time period.
+new_rend_circuits_established = 0
+rend_circuits_closed = 0
+
+
+def circ_event_handler(event):
+    """
+    Handle the event received when Tor emits an event related the a rendezvous
+    circuit
+    """
+    global new_rend_circuits_established, rend_circuits_closed
+
+    if event.purpose == "HS_SERVICE_REND" and event.hs_state == "HSSR_JOINED":
+        if event.type == "CIRC_MINOR":
+            # Log when a new rendezvous circuit is successfully established.
+            # A CIRC_MINOR event is emitted when the rendezvous circuit moves
+            # from HS_STATE=HSSR_CONNECTING to HS_STATE=HSSR_JOINED
+            logger.debug("New rendezvous circuit established (CircID: %s)",
+                         event.id)
+            new_rend_circuits_established += 1
+
+        elif event.type == "CIRC" and event.status == "CLOSED":
+            logger.debug("Rendezvous circuit closed (CircID: %s)", event.id)
+            rend_circuits_closed += 1
+    return
+
+
+def output_status(controller):
+    """
+    Output the current counts every tick period.
+    """
+    global new_rend_circuits_established, rend_circuits_closed
+
+    # Count number of currently established rendezvous circuits for this HS.
+    rend_circ_count = len([circ for circ in controller.get_circuits()
+                           if circ.purpose == "HS_SERVICE_REND"
+                           and circ.hs_state == "HSSR_JOINED"])
+
+    with lock:
+        logger.info("New rend circuits: %d - Closed rend circuits: %d - "
+                    "Established rend circuits: %d",
+                    new_rend_circuits_established,
+                    rend_circuits_closed,
+                    rend_circ_count)
+        new_rend_circuits_established = 0
+        rend_circuits_closed = 0
+
+    return None
+
+
+def parse_cmd_args():
+    """
+    Parses and returns command line arguments.
+    """
+
+    parser = argparse.ArgumentParser(
+        description="%s logs stats about Tor rendezvous circuits" %
+        sys.argv[0])
+
+    parser.add_argument("-i", "--ip", type=str, default="127.0.0.1",
+                        help="Tor controller IP address")
+
+    parser.add_argument("-p", "--port", type=int, default=9051,
+                        help="Tor controller port")
+
+    parser.add_argument("-t", "--tick", type=int, default=60,
+                        help="Output total every tick seconds "
+                        "(default: %(default)s)")
+
+    parser.add_argument("--log-file", type=str, default="rendezvous.log",
+                        help="Location to log the rendezvous connection"
+                        "data.")
+
+    parser.add_argument("-v", "--verbosity", type=str, default="info",
+                        help="Minimum verbosity level for logging.  Available "
+                             "in ascending order: debug, info, warning, "
+                             "error, critical).  The default is info.")
+
+    return parser.parse_args()
+
+
+def main():
+
+    args = parse_cmd_args()
+    logger.setLevel(logging.__dict__[args.verbosity.upper()])
+
+    if args.log_file:
+        file_handler = logging.handlers.TimedRotatingFileHandler(
+            args.log_file, when='D')
+        file_handler.setFormatter(formatter)
+        logger.addHandler(file_handler)
+
+    logger.info("Beginning rendezvous circuit monitoring."
+                "Status output every %d seconds", args.tick)
+
+    with Controller.from_port(port=args.port) as controller:
+        # Create a connection to the Tor control port
+        controller.authenticate()
+
+        # Add event listeners for HS_DESC and HS_DESC_CONTENT
+        controller.add_event_listener(circ_event_handler,
+                                      stem.control.EventType.CIRC)
+        controller.add_event_listener(circ_event_handler,
+                                      stem.control.EventType.CIRC_MINOR)
+
+        # Schedule rendezvous status output.
+        schedule.every(args.tick).seconds.do(output_status, controller)
+        schedule.run_all()
+
+        try:
+            while True:
+                schedule.run_pending()
+                time.sleep(1)
+        except KeyboardInterrupt:
+            logger.info("Stopping rendezvous circuit monitoring.")
+
+    sys.exit(0)
+
+if __name__ == '__main__':
+    main()

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-privacy/packages/onionbalance.git



More information about the Pkg-privacy-commits mailing list