From 43ad6bc0f94a048cfffe4ec3d22e78e75d4d6795 Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Fri, 11 Apr 2014 23:52:52 +0100 Subject: Better command line options --- lib/chutney/TorNet.py | 84 ++++++--- networks/hs-dual-intro-fail-3 | 2 +- networks/hs-intro-fail-2 | 2 +- networks/hs-intro-fail-3 | 7 +- networks/hs-intro-round-robin | 228 ----------------------- networks/hs-intro-scale | 379 --------------------------------------- networks/hs-intro-select-2 | 7 +- networks/hs-start-3 | 7 +- networks/hs-stop-3 | 7 +- networks/hs-tripple-intro-fail-3 | 7 +- networks/hs_instance_start.py | 6 - networks/hs_instance_stop.py | 6 - networks/hs_intro_fail.py | 11 +- networks/hs_intro_selection.py | 6 - networks/hs_round_robin.py | 88 +++++++++ 15 files changed, 181 insertions(+), 666 deletions(-) delete mode 100644 networks/hs-intro-round-robin delete mode 100644 networks/hs-intro-scale create mode 100644 networks/hs_round_robin.py diff --git a/lib/chutney/TorNet.py b/lib/chutney/TorNet.py index 1c626ba..436810d 100644 --- a/lib/chutney/TorNet.py +++ b/lib/chutney/TorNet.py @@ -22,6 +22,7 @@ import time import thread import threading import random +import argparse import stem.control @@ -31,6 +32,8 @@ import urllib import socks import pycurl +from twisted.internet import reactor + import Queue import chutney.Templating @@ -49,7 +52,7 @@ DEFAULTS = { 'hiddenserviceport' : 80, 'hiddenservicetarget' : '127.0.0.1', 'connlimit' : 60, - 'net_base_dir' : 'net', +# 'net_base_dir' : 'net', 'tor' : 'tor', 'auth_cert_lifetime' : 12, 'ip' : '127.0.0.1', @@ -386,7 +389,7 @@ class LocalNodeBuilder(NodeBuilder): datadir = self._env['dir'] cmdline = [ "cp", "-r", - "/".join(datadir.split("/")[:-3]) + "/hs", + "./hs", datadir + "/hidden_service" ] p = subprocess.Popen(cmdline, stdout=subprocess.PIPE) #stdout, stderr = p.communicate() @@ -519,11 +522,11 @@ class LocalNodeController(NodeController): running = self.isRunning() nick = self._env['nick'] if self.isRunning(): - print "Sending sighup to %s"%nick + logging.info("Sending sighup to %s"%nick) os.kill(pid, signal.SIGHUP) return True else: - print "%s is not running"%nick + logging.info("%s is not running"%nick) return False def start(self): @@ -623,7 +626,7 @@ class TorEnviron(chutney.Templating.Environ): class Network(list): """A network of Tor nodes, plus functions to manipulate them """ - def __init__(self, defaultEnviron=_BASE_ENVIRON): + def __init__(self, name="net"): """if name: environ = chutney.Templating.Environ(parent=defaultEnviron) @@ -633,7 +636,17 @@ class Network(list): self._dfltEnv = environ else:""" - self._dfltEnv = defaultEnviron + + NETWORK_DEFAULTS = { + 'torrc_fname' : '${dir}/torrc', + 'authority' : False, + 'bridgeauthority' : False, + 'hasbridgeauth' : False, + 'net_base_dir' : name, + 'bridges' : "Bridge bleargh bad torrc file!", + } + + self._dfltEnv = chutney.Templating.Environ(parent=_BASE_ENVIRON, **NETWORK_DEFAULTS) self._nextnodenum = 0 @@ -655,6 +668,9 @@ class Network(list): def _addNode(self, n): n.setNodenum(self._nextnodenum) + + n._env._parent = self._dfltEnv + self._nextnodenum += 1 self.append(n) @@ -719,11 +735,11 @@ class Network(list): for sig, desc in [(signal.SIGINT, "SIGINT"), (signal.SIGINT, "another SIGINT"), (signal.SIGKILL, "SIGKILL")]: - print "Sending %s to nodes"%desc + logging.info("Sending %s to nodes"%desc) for c in controllers: if c.isRunning(): c.stop(sig=sig) - print "Waiting for nodes to finish." + logging.info("Waiting for nodes to finish.") for n in xrange(10): time.sleep(1) if all(not c.isRunning() for c in controllers): @@ -791,17 +807,26 @@ def runConfigFile(verb, f): return getattr(network, verb)() def main(): + + parser = argparse.ArgumentParser() + parser.add_argument("command", help="what to do") + parser.add_argument("file", help="network to act on", nargs='+') + parser.add_argument("--quiet", dest="quiet", help="quiet", action='store_true') + parser.set_defaults(quiet=False) + args = parser.parse_args() + stem.util.log.get_logger().setLevel(logging.WARN) logger = logging.getLogger() logger.setLevel(logging.DEBUG) - # create console handler and set level to info - handler = logging.StreamHandler() - handler.setLevel(logging.INFO) - formatter = logging.Formatter("%(asctime)s %(message)s", datefmt="%b %d %H:%M:%S.000") - handler.setFormatter(formatter) - logger.addHandler(handler) + if not args.quiet: + # create console handler and set level to info + handler = logging.StreamHandler() + handler.setLevel(logging.INFO) + formatter = logging.Formatter("%(asctime)s %(message)s", datefmt="%b %d %H:%M:%S.000") + handler.setFormatter(formatter) + logger.addHandler(handler) # create debug file handler and set level to debug handler = logging.FileHandler(os.path.join(".", "chutney.log"), "w") @@ -810,22 +835,27 @@ def main(): handler.setFormatter(formatter) logger.addHandler(handler) - if len(sys.argv) < 3: - print usage(network) - print "Error: Not enough arguments given." - sys.exit(1) + thread.start_new_thread(reactor.run, (), {"installSignalHandlers": 0}) + + overall_result = True + + for path in args.file: + f = open(path) - f = open(sys.argv[2]) - result = runConfigFile(sys.argv[1], f) - #print("run config file returns " + str(result)) - if result is False: - sys.exit(-1) + result = runConfigFile(args.command, f) - #if sys.argv[1] == "start": - # signal.signal(signal.SIGINT, signal_handler) - # signal.pause() + overall_result = result and overall_result - return 0 + if args.command == "start": + if result: + print(path + " PASS") + else: + print(path + " FAIL") + + reactor.stop() + + if not overall_result: + sys.exit(1) if __name__ == '__main__': main() diff --git a/networks/hs-dual-intro-fail-3 b/networks/hs-dual-intro-fail-3 index 49a5537..9be8479 100644 --- a/networks/hs-dual-intro-fail-3 +++ b/networks/hs-dual-intro-fail-3 @@ -1,6 +1,6 @@ from hs_intro_fail import * -network = Network() +network = Network(name="net/hs-dual-intro-fail-3") hs_nodes, hs_servers = testing.create_hidden_service(3) diff --git a/networks/hs-intro-fail-2 b/networks/hs-intro-fail-2 index 20e9e11..ae0a35b 100644 --- a/networks/hs-intro-fail-2 +++ b/networks/hs-intro-fail-2 @@ -1,6 +1,6 @@ from hs_intro_fail import * -network = Network() +network = Network(name="net/hs-intro-fail-2") hs_nodes, hs_servers = testing.create_hidden_service(2) diff --git a/networks/hs-intro-fail-3 b/networks/hs-intro-fail-3 index fa4dc7e..4835b0c 100644 --- a/networks/hs-intro-fail-3 +++ b/networks/hs-intro-fail-3 @@ -1,6 +1,6 @@ from hs_intro_fail import * -network = Network() +network = Network(name="net/hs-intro-fail-3") hs_nodes, hs_servers = testing.create_hidden_service(3) @@ -32,5 +32,10 @@ def start(): network.stop() + if results: + logging.info("hs-intro-fail-3 PASS") + else: + logging.info("hs-intro-fail-3 FAIL") + return results diff --git a/networks/hs-intro-round-robin b/networks/hs-intro-round-robin deleted file mode 100644 index f210bc7..0000000 --- a/networks/hs-intro-round-robin +++ /dev/null @@ -1,228 +0,0 @@ -Authority = Node.create(3, { - "tag": "a", - "authority": 1, - "relay": 1, - "torrc": "authority.tmpl" -}) - -Relay = Node.create(10, { - "tag": "r", - "relay": 1, - "torrc": "intro.tmpl" -}) - -Client = Node.create(6, { - "tag": "c", - "torrc": "client.tmpl" -}) - -# hidden service (hs) nodes - -hs_node_1 = Node( - tag="h", - hiddenservice=1, - torrc="hidden-service.tmpl", - hiddenservicetarget="127.0.0.1:8081" -) - -hs_node_2 = Node( - tag="h", - hiddenservice=1, - torrc="hidden-service.tmpl", - hiddenservicetarget="127.0.0.1:8082" -) - -hs_nodes = (hs_node_1, hs_node_2) - -initial_nodes = Authority + Relay + Client + [ hs_node_1 ] - -nodes_by_fingerprint = {} - -#{ nodenum: { circuit: "fingerprint", circuit: "fingerprint" } } - -# Introduction Point Tracking - -node_intro_circuits = {} - -node_intro_events = {} - -introduction_point_circuits = {} - -def track_hs_node(node): - nodenum = node._env["nodenum"] - nodenick = node._env["nick"] - - node_intro_circuits[nodenum] = {} - - node_intro_events[nodenum] = Queue.Queue() - - def listener(logevent): - prefix = "rend_service_intro_has_opened(): Established circuit " - if logevent.message.startswith(prefix): - circuit = logevent.message[len(prefix):].split(" ")[0] - fingerprint = logevent.message[len(prefix):].split(" ")[1][1:] - - node_intro_circuits[nodenum][circuit] = fingerprint - - added_intro_node = nodes_by_fingerprint[fingerprint] - - log("%s: added %s (%s)" % (nodenick, added_intro_node._env["nick"], fingerprint)) - - node_intro_events[nodenum].put(("added", fingerprint)) - - prefix = "rend_services_introduce(): Giving up on " - if logevent.message.startswith(prefix) or "Giving up on" in logevent.message: - log(logevent.message) - fingerprint = logevent.message[len(prefix):].split(" ")[0][1:41] - - for_deletion = [] - - for circuit, fp in node_intro_circuits[nodenum].iteritems(): - #log("circuit " + str(circuit) + " fp " + str(fp)) - if fingerprint == fp: - for_deletion.append(circuit) - - if len(for_deletion) == 0: - log("got log message " + logevent.message + " but not deleting an introduction point") - - for circuit in for_deletion: - fingerprint = node_intro_circuits[nodenum][circuit] - - removed_intro_node = nodes_by_fingerprint[fingerprint] - - log("%s: removed %s (%s)" % (nodenick, removed_intro_node._env["nick"], fingerprint)) - - node_intro_events[nodenum].put(("removed", fingerprint)) - del node_intro_circuits[nodenum][circuit] - - - node.getStemController().add_event_listener(listener, EventType.INFO) - log("Tracking introduction points for " + node._env["nick"]) - -def track_introduction_point(node): - nodenum = node._env["nodenum"] - nodenick = node._env["nick"] - - introduction_point_circuits[node] = {} - - def listener(logevent): - prefix = "rend_mid_introduce" - if logevent.message.startswith(prefix): - print(logevent.message) - - node.getStemController().add_event_listener(listener, EventType.INFO) - log("Tracking introduction points for " + node._env["nick"]) - -# Use twisted to create web servers in this script -class Site(resource.Resource): - isLeaf = True - numberRequests = 0 - - def __init__(self, siteNum): - self.siteNum = siteNum - - def render_GET(self, request): - self.numberRequests += 1 - request.setHeader("content-type", "text/plain") - return str(self.siteNum) - -def start_test(): - log("Starting test") - - port8081 = reactor.listenTCP(8081, server.Site(Site(1))) - port8082 = reactor.listenTCP(8082, server.Site(Site(2))) - - def cleanup(): - port8081.stopListening() - log("stopped 8081") - port8082.stopListening() - log("stopped 8082") - reactor.stop() - log("stopped the reactor") - - def connection_test(): - log("connecting to clients") - responses = {"1": 0, "2": 0} - - for c in Client: - result = c.query("http://2oiifbe3wne4iaqb.onion/"); - - if result in responses: - responses[result] += 1 - else: - log("Unknown response:") - - log(responses) - - def test(): - connection_test() - - connection_test() - - cleanup() - - stop() - - thread.start_new_thread(test, ()) - - log("running reactor") - - reactor.run(installSignalHandlers=0) - -def check_same_intro_points(): - intro_sets = [] - for introduction_points in node_intro_circuits.values(): - intro_sets.append(set(introduction_points.values())) - - if intro_sets[0].issubset(intro_sets[1]) and intro_sets[1].issubset(intro_sets[0]): - log("Same introduction points") - for fingerprint in node_intro_circuits.values()[0].values(): - node = nodes_by_fingerprint[fingerprint] - log(" - " + node._env["nick"] + "(" + fingerprint + ")") - return True - else: - log("Not the same introduction points") - for num, circuits in node_intro_circuits.items(): - log("node %i" % num) - for fingerprint in circuits.values(): - node = nodes_by_fingerprint[fingerprint] - log(" - " + node._env["nick"] + "(" + fingerprint + ")") - return False - -def start(): - log("Starting round robin test") - - if not all([ n.getController().start() for n in initial_nodes ]): - return False - - log("All initial nodes running") - - for node in Authority + Relay: - fingerprint = node.getStemController().get_info("fingerprint") - nodes_by_fingerprint[fingerprint] = node - - track_introduction_point(node) - - track_hs_node(hs_node_1) - - def log_listener(logevent): - if "Successfully uploaded v2 rend descriptors" in logevent.message: - hs_node_1.getStemController().remove_event_listener(log_listener) - - def start_listener(logevent): - - # Probably after what needs waiting for - if "Successfully uploaded v2 rend descriptors" in logevent.message: - hs_node_2.getStemController().remove_event_listener(start_listener) - - if check_same_intro_points(): - thread.start_new_thread(start_test, ()) - log("finished running start_test in another thread") - - hs_node_2.getController().start() - - track_hs_node(hs_node_2) - - hs_node_2.getStemController().add_event_listener(start_listener, EventType.INFO) - - hs_node_1.getStemController().add_event_listener(log_listener, EventType.INFO) diff --git a/networks/hs-intro-scale b/networks/hs-intro-scale deleted file mode 100644 index 2543b6d..0000000 --- a/networks/hs-intro-scale +++ /dev/null @@ -1,379 +0,0 @@ -authority_nodes = Node.create(3, { - "tag": "a", - "authority": 1, - "relay": 1, - "torrc": "authority.tmpl" -}) - -# hidden service (hs) nodes -hs_nodes = [] - -hs_servers = [] - -port = 8081 - -from twisted.web import server, resource -from twisted.internet import reactor -from twisted.protocols import htb - -# Use twisted to create web servers in this script -class Site(resource.Resource): - isLeaf = True - numberRequests = 0 - - def __init__(self, siteNum): - self.siteNum = siteNum - - def render_GET(self, request): - self.numberRequests += 1 - request.setHeader("content-type", "text/plain") - return str(self.siteNum) - -# https://twistedmatrix.com/documents/12.3.0/core/examples/ - -serverFilter = htb.HierarchicalBucketFilter() -serverBucket = htb.Bucket() - -# Cap total server traffic at 20 kB/s -serverBucket.maxburst = 200000000 -serverBucket.rate = 200000000 - -serverFilter.buckets[None] = serverBucket - -base_port = 9080 -for i in [1]: - - port = base_port + i - - node = Node( - tag="h", - hiddenservice=1, - torrc="hidden-service.tmpl", - hiddenservicetarget="127.0.0.1:%i" % port - ) - hs_nodes.append(node) - - site = server.Site(Site(i)) - #site.protocol = htb.ShapedProtocolFactory(site.protocol, serverFilter) - - s = reactor.listenTCP(port, site) - hs_servers.append(s) - - port += 1 - -client_nodes = Node.create(50, { - "tag": "c", - "torrc": "client.tmpl" -}) - -relay_nodes = Node.create(100, { - "tag": "r", - "relay": 1, - "torrc": "intro.tmpl" -}) - -initial_nodes = authority_nodes + relay_nodes + client_nodes + hs_nodes[:1] - -def start(): - if not all([ n.getController().start() for n in initial_nodes ]): - return False - - log("All initial nodes running") - - for n in authority_nodes + relay_nodes: - fingerprint = n.getStemController().get_info("fingerprint") - nodes_by_fingerprint[fingerprint] = n - - track_introduction_points(hs_nodes[0]) - - def hs_node_0_listener(logevent): - if "Successfully uploaded v2 rend descriptors" in logevent.message: - hs_nodes[0].getStemController().remove_event_listener(hs_node_0_listener) - - thread.start_new_thread(test_load, ()) - - hs_nodes[0].getStemController().add_event_listener(hs_node_0_listener, EventType.INFO) - -def test_load(): - thread.start_new_thread(reactor.run, (), {"installSignalHandlers": 0}) - - # Run initial bandwidth test - max_load = determine_max_load("http://2oiifbe3wne4iaqb.onion/", client_nodes) - - print("max_load: " + str(max_load)) - - for server in hs_servers: - server.stopListening() - - reactor.stop() - log("stopped the reactor") - - """def start_listener(logevent): - - # Probably after what needs waiting for - if "Successfully uploaded v2 rend descriptors" in logevent.message: - hs_node_2.getStemController().remove_event_listener(start_listener) - - if check_same_intro_points(): - thread.start_new_thread(start_test, ()) - log("finished running start_test in another thread") - - hs_node_2.getController().start() - - track_introduction_points(hs_node_2) - - hs_node_2.getStemController().add_event_listener(start_listener, EventType.INFO)""" - -## Utility Code - -# Introduction Point Tracking - -node_intro_circuits = {} - -node_intro_events = {} - -introduction_point_circuits = {} - -nodes_byefingerprint = {} - -#{ nodenum: { circuit: "fingerprint", circuit: "fingerprint" } } - -def track_introduction_points(node): - nodenum = node._env["nodenum"] - nodenick = node._env["nick"] - - node_intro_circuits[nodenum] = {} - - node_intro_events[nodenum] = Queue.Queue() - - def listener(logevent): - prefix = "rend_service_intro_has_opened(): Established circuit " - if logevent.message.startswith(prefix): - circuit = logevent.message[len(prefix):].split(" ")[0] - fingerprint = logevent.message[len(prefix):].split(" ")[1][1:] - - node_intro_circuits[nodenum][circuit] = fingerprint - - added_intro_node = nodes_by_fingerprint[fingerprint] - - log("%s: added %s (%s)" % (nodenick, added_intro_node._env["nick"], fingerprint)) - - node_intro_events[nodenum].put(("added", fingerprint)) - - prefix = "rend_services_introduce(): Giving up on " - if logevent.message.startswith(prefix) or "Giving up on" in logevent.message: - log(logevent.message) - fingerprint = logevent.message[len(prefix):].split(" ")[0][1:41] - - for_deletion = [] - - for circuit, fp in node_intro_circuits[nodenum].iteritems(): - #log("circuit " + str(circuit) + " fp " + str(fp)) - if fingerprint == fp: - for_deletion.append(circuit) - - if len(for_deletion) == 0: - log("got log message " + logevent.message + " but not deleting an introduction point") - - for circuit in for_deletion: - fingerprint = node_intro_circuits[nodenum][circuit] - - removed_intro_node = nodes_by_fingerprint[fingerprint] - - log("%s: removed %s (%s)" % (nodenick, removed_intro_node._env["nick"], fingerprint)) - - node_intro_events[nodenum].put(("removed", fingerprint)) - del node_intro_circuits[nodenum][circuit] - - - node.getStemController().add_event_listener(listener, EventType.INFO) - log("Tracking introduction points for " + node._env["nick"]) - -def track_introduction_point(node): - nodenum = node._env["nodenum"] - nodenick = node._env["nick"] - - introduction_point_circuits[node] = {} - - def listener(logevent): - prefix = " " - if logevent.message.startswith(prefix): - circuit = logevent.message[len(prefix):].split(" ")[0] - fingerprint = logevent.message[len(prefix):].split(" ")[1][1:] - - node_intro_circuits[nodenum][circuit] = fingerprint - - added_intro_node = nodes_by_fingerprint[fingerprint] - - log("%s: added %s (%s)" % (nodenick, added_intro_node._env["nick"], fingerprint)) - - node_intro_events[nodenum].put(("added", fingerprint)) - - prefix = "rend_services_introduce(): Giving up on " - if logevent.message.startswith(prefix) or "Giving up on" in logevent.message: - log(logevent.message) - fingerprint = logevent.message[len(prefix):].split(" ")[0][1:41] - - for_deletion = [] - - for circuit, fp in node_intro_circuits[nodenum].iteritems(): - #log("circuit " + str(circuit) + " fp " + str(fp)) - if fingerprint == fp: - for_deletion.append(circuit) - - if len(for_deletion) == 0: - log("got log message " + logevent.message + " but not deleting an introduction point") - - for circuit in for_deletion: - fingerprint = node_intro_circuits[nodenum][circuit] - - removed_intro_node = nodes_by_fingerprint[fingerprint] - - log("%s: removed %s (%s)" % (nodenick, removed_intro_node._env["nick"], fingerprint)) - - node_intro_events[nodenum].put(("removed", fingerprint)) - del node_intro_circuits[nodenum][circuit] - - - node.getStemController().add_event_listener(listener, EventType.INFO) - log("Tracking introduction points for " + node._env["nick"]) - - -def determine_max_load(service_url, clients): - request_queue = Queue.Queue(1000) - singlelock = threading.Lock() - - responses = [] - - running = True - - class worker(threading.Thread): - def __init__ (self, client): - super(worker, self).__init__() - self.client = client - - def run(self): - while running: - try: - request = request_queue.get(True, 1) - - print("making request") - result = self.client.query("http://2oiifbe3wne4iaqb.onion/"); - - singlelock.acquire() - responses.append((result, time.time())) - print("result " + str(result)) - singlelock.release() - - # Let the queue know the job is finished. - request_queue.task_done() - except: - pass - - # Create worker threads - for client in clients: - worker(client).start() - - # Add elements to queue at rate current_load - # Check size of queue, if above limit, return current_load - - while True: - # Determine Average Load - time_barrier = time.time() - 10.0 - - last_responses = [] - - singlelock.acquire() - for response, response_time in reversed(responses): - if response_time < time_barrier: - break - last_responses.append(response) - singlelock.release() - - current_average_load = len(last_responses) / 10.0 - print("current average load %f" % current_average_load) - - new_load = int(current_average_load) + 1 - - time_per_item = 1.0 / new_load - - for i in range(new_load): - print("putting in item") - request_queue.put(1) - time.sleep(time_per_item) - - -def start_test(): - log("Starting test") - - def connection_test(): - log("connecting to clients") - responses = {"1": 0, "2": 0} - - for c in Client: - result = c.query("http://2oiifbe3wne4iaqb.onion/"); - - if result in responses: - responses[result] += 1 - else: - log("Unknown response:") - - log(responses) - - def test(): - connection_test() - - time.sleep(5) - - # Clear out the event queues such that the events are relevant - for node in hs_nodes: - nodenum = node._env["nodenum"] - - log("replaced queue") - node_intro_events[nodenum] = Queue.Queue() - - # Select a random node that is being used as an introduction point - nodenum = random.choice(node_intro_circuits.keys()) - fingerprint = random.choice(node_intro_circuits[nodenum].values()) - - node = nodes_by_fingerprint[fingerprint] - - log("stopping " + node._env["nick"] + " (" + fingerprint + ")") - - node.getController().stop() - - watch_for_new_intro_points() - - check_same_intro_points() - - connection_test() - - cleanup() - - stop() - - thread.start_new_thread(test, ()) - - log("running reactor") - - reactor.run(installSignalHandlers=0) - -def check_same_intro_points(): - intro_sets = [] - for introduction_points in node_intro_circuits.values(): - intro_sets.append(set(introduction_points.values())) - - if intro_sets[0].issubset(intro_sets[1]) and intro_sets[1].issubset(intro_sets[0]): - log("Same introduction points") - for fingerprint in node_intro_circuits.values()[0].values(): - node = nodes_by_fingerprint[fingerprint] - log(" - " + node._env["nick"] + "(" + fingerprint + ")") - return True - else: - log("Not the same introduction points") - for num, circuits in node_intro_circuits.items(): - log("node %i" % num) - for fingerprint in circuits.values(): - node = nodes_by_fingerprint[fingerprint] - log(" - " + node._env["nick"] + "(" + fingerprint + ")") - return False diff --git a/networks/hs-intro-select-2 b/networks/hs-intro-select-2 index 411fd3c..e477a00 100644 --- a/networks/hs-intro-select-2 +++ b/networks/hs-intro-select-2 @@ -1,6 +1,6 @@ from hs_intro_selection import * -network = Network() +network = Network(name="net/hs-intro-select-2") hs_nodes, hs_servers = testing.create_hidden_service(2) @@ -32,4 +32,9 @@ def start(): network.stop() + if results: + logging.info("hs-intro-select-2 PASS") + else: + logging.info("hs-intro-select-2 FAIL") + return results diff --git a/networks/hs-start-3 b/networks/hs-start-3 index bc60e94..4fead95 100644 --- a/networks/hs-start-3 +++ b/networks/hs-start-3 @@ -1,6 +1,6 @@ from hs_instance_start import * -network = Network() +network = Network(name="net/hs-start-3") hs_nodes, hs_servers = testing.create_hidden_service(3) @@ -32,4 +32,9 @@ def start(): network.stop() + if results: + logging.info("hs-start-3 PASS") + else: + logging.info("hs-start-3 FAIL") + return results diff --git a/networks/hs-stop-3 b/networks/hs-stop-3 index 9242f77..7d30f40 100644 --- a/networks/hs-stop-3 +++ b/networks/hs-stop-3 @@ -1,6 +1,6 @@ from hs_instance_stop import * -network = Network() +network = Network(name="net/hs-stop-3") hs_nodes, hs_servers = testing.create_hidden_service(3) @@ -32,4 +32,9 @@ def start(): network.stop() + if results: + logging.info("hs-stop-3 PASS") + else: + logging.info("hs-stop-3 FAIL") + return results diff --git a/networks/hs-tripple-intro-fail-3 b/networks/hs-tripple-intro-fail-3 index b301640..fedfc44 100644 --- a/networks/hs-tripple-intro-fail-3 +++ b/networks/hs-tripple-intro-fail-3 @@ -1,6 +1,6 @@ from hs_intro_fail import * -network = Network() +network = Network(name="net/hs-tripple-fail-3") hs_nodes, hs_servers = testing.create_hidden_service(3) @@ -32,5 +32,10 @@ def start(): network.stop() + if results: + logging.info("hs-tripple-fail-3 PASS") + else: + logging.info("hs-tripple-fail-3 FAIL") + return results diff --git a/networks/hs_instance_start.py b/networks/hs_instance_start.py index 42a3dbc..38282de 100644 --- a/networks/hs_instance_start.py +++ b/networks/hs_instance_start.py @@ -1,8 +1,6 @@ from chutney.Testing import * from chutney.TorNet import * -from twisted.internet import reactor - from stem.control import EventType def hs_instance_start(network): @@ -33,8 +31,6 @@ def hs_instance_start(network): logging.info("All initial nodes running") - thread.start_new_thread(reactor.run, (), {"installSignalHandlers": 0}) - logging.info("There are %d nodes to start" % len(hs_nodes)) for i, hs_node in enumerate(hs_nodes): @@ -64,5 +60,3 @@ def hs_instance_start(network): connection_test(client_groups[c_group], i + 1) check_same_intro_points() - - reactor.stop() diff --git a/networks/hs_instance_stop.py b/networks/hs_instance_stop.py index a8d7dd9..f3ca787 100644 --- a/networks/hs_instance_stop.py +++ b/networks/hs_instance_stop.py @@ -1,8 +1,6 @@ from chutney.Testing import * from chutney.TorNet import * -from twisted.internet import reactor - from stem.control import EventType import time @@ -35,8 +33,6 @@ def hs_instance_stop(network): logging.info("All initial nodes running") - thread.start_new_thread(reactor.run, (), {"installSignalHandlers": 0}) - logging.info("There are %d nodes to start" % len(hs_nodes)) for i, hs_node in enumerate(hs_nodes): @@ -82,5 +78,3 @@ def hs_instance_stop(network): connection_test(client_groups[c_group], i + 1) check_same_intro_points() - - reactor.stop() diff --git a/networks/hs_intro_fail.py b/networks/hs_intro_fail.py index 537e881..90c7f48 100644 --- a/networks/hs_intro_fail.py +++ b/networks/hs_intro_fail.py @@ -1,11 +1,11 @@ from chutney.Testing import * from chutney.TorNet import * -from twisted.internet import reactor - from stem.control import EventType def hs_fail_test(network, failures=1): + result = True + hs_nodes = network.get("h") initial_nodes = network.get("a") + network.get("r") + network.get("c") + hs_nodes[:1] @@ -15,8 +15,6 @@ def hs_fail_test(network, failures=1): logging.info("All initial nodes running") - thread.start_new_thread(reactor.run, (), {"installSignalHandlers": 0}) - nodes_by_fingerprint = get_node_fingerprints(network.get("a") + network.get("r")) track_introduction_points(hs_nodes[0]) @@ -27,7 +25,6 @@ def hs_fail_test(network, failures=1): if "Successfully uploaded v2 rend descriptors" in logevent.message: node_0_published_descriptor.set() - hs_nodes[0].getStemController().add_event_listener(hs_node_0_listener, EventType.INFO) node_0_published_descriptor.wait() @@ -106,8 +103,8 @@ def hs_fail_test(network, failures=1): else: logging.info("All did not change") - check_same_intro_points() + result &= check_same_intro_points() connection_test(network.get("c"), len(hs_nodes)) - reactor.stop() + return result diff --git a/networks/hs_intro_selection.py b/networks/hs_intro_selection.py index deed5ac..99b73d8 100644 --- a/networks/hs_intro_selection.py +++ b/networks/hs_intro_selection.py @@ -1,8 +1,6 @@ from chutney.Testing import * from chutney.TorNet import * -from twisted.internet import reactor - from stem.control import EventType def hs_select_test(network, failures=1): @@ -15,8 +13,6 @@ def hs_select_test(network, failures=1): logging.info("All initial nodes running") - thread.start_new_thread(reactor.run, (), {"installSignalHandlers": 0}) - nodes_by_fingerprint = get_node_fingerprints(network.get("a") + network.get("r")) track_introduction_points(hs_nodes[0]) @@ -127,5 +123,3 @@ def hs_select_test(network, failures=1): check_same_intro_points() connection_test(network.get("c"), len(hs_nodes)) - - reactor.stop() diff --git a/networks/hs_round_robin.py b/networks/hs_round_robin.py new file mode 100644 index 0000000..5703f93 --- /dev/null +++ b/networks/hs_round_robin.py @@ -0,0 +1,88 @@ +nodes_by_fingerprint = {} + +#{ nodenum: { circuit: "fingerprint", circuit: "fingerprint" } } + +# Introduction Point Tracking + +node_intro_circuits = {} + +node_intro_events = {} + +introduction_point_circuits = {} + +def start_test(): + log("Starting test") + + port8081 = reactor.listenTCP(8081, server.Site(Site(1))) + port8082 = reactor.listenTCP(8082, server.Site(Site(2))) + + def cleanup(): + port8081.stopListening() + log("stopped 8081") + port8082.stopListening() + log("stopped 8082") + reactor.stop() + log("stopped the reactor") + + def connection_test(): + log("connecting to clients") + responses = {"1": 0, "2": 0} + + for c in Client: + result = c.query("http://2oiifbe3wne4iaqb.onion/"); + + if result in responses: + responses[result] += 1 + else: + log("Unknown response:") + + log(responses) + + def test(): + connection_test() + + connection_test() + + cleanup() + + stop() + + thread.start_new_thread(test, ()) + +def start(): + log("Starting round robin test") + + if not all([ n.getController().start() for n in initial_nodes ]): + return False + + log("All initial nodes running") + + for node in Authority + Relay: + fingerprint = node.getStemController().get_info("fingerprint") + nodes_by_fingerprint[fingerprint] = node + + track_introduction_point(node) + + track_hs_node(hs_node_1) + + def log_listener(logevent): + if "Successfully uploaded v2 rend descriptors" in logevent.message: + hs_node_1.getStemController().remove_event_listener(log_listener) + + def start_listener(logevent): + + # Probably after what needs waiting for + if "Successfully uploaded v2 rend descriptors" in logevent.message: + hs_node_2.getStemController().remove_event_listener(start_listener) + + if check_same_intro_points(): + thread.start_new_thread(start_test, ()) + log("finished running start_test in another thread") + + hs_node_2.getController().start() + + track_hs_node(hs_node_2) + + hs_node_2.getStemController().add_event_listener(start_listener, EventType.INFO) + + hs_node_1.getStemController().add_event_listener(log_listener, EventType.INFO) -- cgit v1.2.3