From 64b892d507e133b72bc6681baf0dd69cdbc0ab17 Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Sun, 16 Mar 2014 23:10:24 +0000 Subject: Some stuff --- networks/hs-intro-fail | 218 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 154 insertions(+), 64 deletions(-) (limited to 'networks/hs-intro-fail') diff --git a/networks/hs-intro-fail b/networks/hs-intro-fail index 222136c..3b18d0b 100644 --- a/networks/hs-intro-fail +++ b/networks/hs-intro-fail @@ -11,75 +11,93 @@ Relay = Node.create(10, { "torrc": "intro.tmpl" }) -Client = Node.create(4, { +Client = Node.create(6, { "tag": "c", "torrc": "client.tmpl" }) -initialNodes = Authority + Relay + Client +initial_nodes = Authority + Relay + Client -HiddenService = Node( +# hidden service (hs) nodes + +hs_node_1 = Node( tag="h", hiddenservice=1, torrc="hidden-service.tmpl", hiddenservicetarget="127.0.0.1:8081" ) -initialNodes.append(HiddenService) +initial_nodes.append(hs_node_1) -DelayedHiddenService = Node( +hs_node_2 = Node( tag="h", hiddenservice=1, torrc="hidden-service.tmpl", hiddenservicetarget="127.0.0.1:8082" ) -#nodes = {} +hs_nodes = (hs_node_1, hs_node_2) + +nodes_by_fingerprint = {} -#for node in initialNodes + [ DelayedHiddenService ]: -# nodes[node._env.nodenum] = node +#{ nodenum: { circuit: "fingerprint", circuit: "fingerprint" } } # Introduction Point Tracking -nodeIntroCircuits = {} +node_intro_circuits = {} + +node_intro_events = {} -def trackIntroductionPoints(node): +def track_introduction_points(node): nodenum = node._env["nodenum"] - nodeIntroCircuits[nodenum] = {} + nodenick = node._env["nick"] - def listener(logevent): - if not (logevent.message.startswith("rend_services_introduce") or - logevent.message.startswith("rend_service_launch_establish_intro") or - logevent.message.startswith("rend_service_intro_has_opened")): - return + node_intro_circuits[nodenum] = {} - #print(logevent.message) + node_intro_events[nodenum] = Queue.Queue() - """prefix = "rend_service_launch_establish_intro(): Launched circuit " + def listener(logevent): + prefix = "rend_service_intro_has_opened(): Established circuit " if logevent.message.startswith(prefix): circuit = logevent.message[len(prefix):].split(" ")[0] - introid = logevent.message[len(prefix):].split(" ")[4] + fingerprint = logevent.message[len(prefix):].split(" ")[1][1:] - nodeCircuits[nodenum][circuit] = introid - return + node_intro_circuits[nodenum][circuit] = fingerprint - prefix = "rend_service_launch_establish_intro(): The intro circuit " - if logevent.message.startswith(prefix): - circuit = logevent.message[len(prefix):].split(" ")[0] - introid = logevent.message[len(prefix):].split(" ")[6] + added_intro_node = nodes_by_fingerprint[fingerprint] - nodeCircuits[nodenum][circuit] = introid - return""" + log("%s: added %s (%s)" % (nodenick, added_intro_node._env["nick"], fingerprint)) - prefix = "rend_service_intro_has_opened(): Established circuit " - if logevent.message.startswith(prefix): - circuit = logevent.message[len(prefix):].split(" ")[0] - introid = logevent.message[len(prefix):].split(" ")[1] + 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] - nodeIntroCircuits[nodenum][circuit] = introid - return 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): @@ -95,74 +113,146 @@ class Site(resource.Resource): return str(self.siteNum) def start_test(): - print("Starting test") + log("Starting test") port8081 = reactor.listenTCP(8081, server.Site(Site(1))) port8082 = reactor.listenTCP(8082, server.Site(Site(2))) def cleanup(): port8081.stopListening() - print("stopped 8081") + log("stopped 8081") port8082.stopListening() - print("stopped 8082") + log("stopped 8082") reactor.stop() - print("stopped the reactor") + log("stopped the reactor") - def test(): - print("connecting to clients") + def watch_for_new_intro_points(): + log("begining to watch for the establishment of new introduction points") + + changed = [False for n in hs_nodes] + + intro_points_before = [set(node_intro_circuits[n._env["nodenum"]].values()) for n in hs_nodes] + + time.sleep(60) + + intro_points_after = [set(node_intro_circuits[n._env["nodenum"]].values()) for n in hs_nodes] + + for i, node in enumerate(hs_nodes): + before = intro_points_before[i] + after = intro_points_after[i] + + if before != after: + changed[i] = True + + if all(changed): + log("All changed") + else: + log("All did not change") + + check_same_intro_points() + + connection_test() + + cleanup() + + stop() + + def connection_test(): + log("connecting to clients") responses = {"1": 0, "2": 0} for c in Client: result = c.query("http://2oiifbe3wne4iaqb.onion/"); - responses[result] += 1 + if result in responses: + responses[result] += 1 + else: + log("Unknown response:") - print(result) + log(responses) - print(responses) + def test(): + connection_test() time.sleep(5) - print("disabling an introduction point") + # Clear out the event queues such that the events are relevant + for node in hs_nodes: + nodenum = node._env["nodenum"] - # Need to be able to tell which introduction points are being used + log("replaced queue") + node_intro_events[nodenum] = Queue.Queue() - cleanup() + # 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() thread.start_new_thread(test, ()) - print("running reactor") + 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(): - print("Starting hidden service test") + log("Starting hidden service test") - if not all([ n.getController().start() for n in initialNodes ]): + if not all([ n.getController().start() for n in initial_nodes ]): return False - else: - print("All initial nodes running") - trackIntroductionPoints(HiddenService) + log("All initial nodes running") - def start_listener(logevent): - # Probably after what needs waiting for - if "Successfully uploaded v2 rend descriptors" in logevent.message: - print("Node Circuits") - print(nodeIntroCircuits) + for n in Authority + Relay: + fingerprint = n.getStemController().get_info("fingerprint") + nodes_by_fingerprint[fingerprint] = n - start_test() + track_introduction_points(hs_node_1) def log_listener(logevent): if "Successfully uploaded v2 rend descriptors" in logevent.message: - print("log message: " + 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) - print("Node Circuits") - print(nodeIntroCircuits) + if check_same_intro_points(): + thread.start_new_thread(start_test, ()) + log("finished running start_test in another thread") - DelayedHiddenService.getController().start() + hs_node_2.getController().start() - DelayedHiddenService.getStemController().add_event_listener(start_listener, EventType.INFO) + track_introduction_points(hs_node_2) - trackIntroductionPoints(DelayedHiddenService) + hs_node_2.getStemController().add_event_listener(start_listener, EventType.INFO) - HiddenService.getStemController().add_event_listener(log_listener, EventType.INFO) + hs_node_1.getStemController().add_event_listener(log_listener, EventType.INFO) -- cgit v1.2.3