aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Baines <cb15g11@soton.ac.uk>2014-04-11 23:52:52 +0100
committerChristopher Baines <cb15g11@soton.ac.uk>2014-04-11 23:52:52 +0100
commit43ad6bc0f94a048cfffe4ec3d22e78e75d4d6795 (patch)
tree8b7401354f76f9ac0b2f41de9fb7471f24ffff44
parent4eb4e01e49d78a4a74b1e8f9bccaebd16d9ebcb1 (diff)
downloadchutney-43ad6bc0f94a048cfffe4ec3d22e78e75d4d6795.tar
chutney-43ad6bc0f94a048cfffe4ec3d22e78e75d4d6795.tar.gz
Better command line options
-rw-r--r--lib/chutney/TorNet.py84
-rw-r--r--networks/hs-dual-intro-fail-32
-rw-r--r--networks/hs-intro-fail-22
-rw-r--r--networks/hs-intro-fail-37
-rw-r--r--networks/hs-intro-round-robin228
-rw-r--r--networks/hs-intro-scale379
-rw-r--r--networks/hs-intro-select-27
-rw-r--r--networks/hs-start-37
-rw-r--r--networks/hs-stop-37
-rw-r--r--networks/hs-tripple-intro-fail-37
-rw-r--r--networks/hs_instance_start.py6
-rw-r--r--networks/hs_instance_stop.py6
-rw-r--r--networks/hs_intro_fail.py11
-rw-r--r--networks/hs_intro_selection.py6
-rw-r--r--networks/hs_round_robin.py88
15 files changed, 181 insertions, 666 deletions
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)