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(4, { "tag": "c", "torrc": "client.tmpl" }) initialNodes = Authority + Relay + Client HiddenService = Node( tag="h", hiddenservice=1, torrc="hidden-service.tmpl", hiddenservicetarget="127.0.0.1:8081" ) initialNodes.append(HiddenService) DelayedHiddenService = Node( tag="h", hiddenservice=1, torrc="hidden-service.tmpl", hiddenservicetarget="127.0.0.1:8082" ) #nodes = {} #for node in initialNodes + [ DelayedHiddenService ]: # nodes[node._env.nodenum] = node # Introduction Point Tracking nodeIntroCircuits = {} def trackIntroductionPoints(node): nodenum = node._env["nodenum"] nodeIntroCircuits[nodenum] = {} 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 #print(logevent.message) """prefix = "rend_service_launch_establish_intro(): Launched circuit " if logevent.message.startswith(prefix): circuit = logevent.message[len(prefix):].split(" ")[0] introid = logevent.message[len(prefix):].split(" ")[4] nodeCircuits[nodenum][circuit] = introid return 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] nodeCircuits[nodenum][circuit] = introid return""" 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] nodeIntroCircuits[nodenum][circuit] = introid return node.getStemController().add_event_listener(listener, EventType.INFO) # 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(): print("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") port8082.stopListening() print("stopped 8082") reactor.stop() print("stopped the reactor") def test(): print("connecting to clients") responses = {"1": 0, "2": 0} for c in Client: result = c.query("http://2oiifbe3wne4iaqb.onion/"); responses[result] += 1 print(result) print(responses) time.sleep(5) print("disabling an introduction point") # Need to be able to tell which introduction points are being used cleanup() thread.start_new_thread(test, ()) print("running reactor") reactor.run(installSignalHandlers=0) def start(): print("Starting hidden service test") if not all([ n.getController().start() for n in initialNodes ]): return False else: print("All initial nodes running") trackIntroductionPoints(HiddenService) def start_listener(logevent): # Probably after what needs waiting for if "Successfully uploaded v2 rend descriptors" in logevent.message: print("Node Circuits") print(nodeIntroCircuits) start_test() def log_listener(logevent): if "Successfully uploaded v2 rend descriptors" in logevent.message: print("log message: " + logevent.message) print("Node Circuits") print(nodeIntroCircuits) DelayedHiddenService.getController().start() DelayedHiddenService.getStemController().add_event_listener(start_listener, EventType.INFO) trackIntroductionPoints(DelayedHiddenService) HiddenService.getStemController().add_event_listener(log_listener, EventType.INFO)