浏览代码

Add minimal mixed tor version networks

These networks attempt to have an even split of Tor versions.
When that's not possible, they choose the final one at random.

This means they need multiple verifies to cover all possible
version combinations.

Assists in testing Tor ticket #19163.
teor 8 年之前
父节点
当前提交
a5dc7bcf87
共有 2 个文件被更改,包括 108 次插入0 次删除
  1. 47 0
      networks/basic-min-mixed
  2. 61 0
      networks/hs-min-mixed

+ 47 - 0
networks/basic-min-mixed

@@ -0,0 +1,47 @@
+# This network generates a random mix of tor versions each time it is run
+# You'll need at least 4 runs to cover all possibilities
+
+import random
+rng = random.SystemRandom()
+
+# We have to use the same tags for old and new versions, otherwise switching
+# between them at random does not work
+OLD_TOR="tor-stable"
+
+# By default, Authorities are not configured as exits
+Authority = Node(tag="a", authority=1, relay=1, torrc="authority.tmpl")
+OldAuthority = Node(tag="a", authority=1, relay=1, torrc="authority.tmpl",
+                    tor=OLD_TOR)
+
+ExitRelay = Node(tag="r", relay=1, exit=1, torrc="relay.tmpl")
+OldExitRelay = Node(tag="r", relay=1, exit=1, torrc="relay.tmpl",
+                    tor=OLD_TOR)
+
+Client = Node(tag="c", torrc="client.tmpl")
+OldClient = Node(tag="c", torrc="client.tmpl", tor=OLD_TOR)
+
+# Choose old or new Exit and Client at random
+OldNewExitRelay = rng.choice([OldExitRelay, ExitRelay])
+OldNewClient = rng.choice([OldClient, Client])
+
+def version(node):
+  if node._env["tor"] == Authority._env["tor"]:
+    return "new"
+  elif node._env["tor"] == OldAuthority._env["tor"]:
+    return "old"
+  else:
+    return "unk"
+
+# Every time chutney takes an action, it will pick versions at random
+# It will likely choose different versions for each action
+# This could be confusing, so log a message each time
+print("Chose 1 %s authority, 1 %s authority, 1 %s exit and 1 %s client"
+      % (version(Authority),
+         version(OldAuthority),
+         version(OldNewExitRelay),
+         version(OldNewClient)))
+
+# The minimum number of authorities/relays/exits is 3, the minimum path length
+NODES = Authority.getN(1) + OldAuthority.getN(1) + OldExitRelay.getN(1) + OldClient.getN(1)
+
+ConfigureNodes(NODES)

+ 61 - 0
networks/hs-min-mixed

@@ -0,0 +1,61 @@
+# This network generates a random mix of tor versions each time it is run
+# You'll need at least 8 runs to cover all possibilities
+
+import random
+rng = random.SystemRandom()
+
+# We have to use the same tags for old and new versions, otherwise switching
+# between them at random does not work
+OLD_TOR="tor-stable"
+
+# By default, Authorities are not configured as exits
+Authority = Node(tag="a", authority=1, relay=1, torrc="authority.tmpl")
+OldAuthority = Node(tag="a", authority=1, relay=1, torrc="authority.tmpl",
+                    tor=OLD_TOR)
+
+NonExitRelay = Node(tag="r", relay=1, torrc="relay-non-exit.tmpl")
+OldNonExitRelay = Node(tag="r", relay=1, torrc="relay-non-exit.tmpl",
+                       tor=OLD_TOR)
+
+Client = Node(tag="c", torrc="client.tmpl")
+OldClient = Node(tag="c", torrc="client.tmpl", tor=OLD_TOR)
+
+HS = Node(tag="h", hs=1, torrc="hs.tmpl")
+OldHS = Node(tag="h", hs=1, torrc="hs.tmpl", tor=OLD_TOR)
+
+# Choose old or new Relay, Client, and HS at random
+OldNewNonExitRelay = rng.choice([OldNonExitRelay, NonExitRelay])
+OldNewClient = rng.choice([OldClient, Client])
+OldNewHS = rng.choice([OldHS, HS])
+
+def version(node):
+  if node._env["tor"] == Authority._env["tor"]:
+    return "new"
+  elif node._env["tor"] == OldAuthority._env["tor"]:
+    return "old"
+  else:
+    return "unk"
+
+# Every time chutney takes an action, it will pick versions at random
+# It will likely choose different versions for each action
+# This could be confusing, so log a message each time
+print(("Chose 1 %s authority, 1 %s authority, %d %s non-exit relay, " +
+       "%d %s non-exit relay, 1 %s client and 1 %s hidden service")
+      % (version(Authority),
+         version(OldAuthority),
+         2 if OldNewNonExitRelay == NonExitRelay else 1,
+	 version(NonExitRelay),
+         2 if OldNewNonExitRelay == OldNonExitRelay else 1,
+	 version(OldNonExitRelay),
+	 version(OldNewClient),
+         version(OldNewHS)))
+
+# A hidden service needs 5 authorities/relays to ensure it can build HS
+# connections:
+# a minimum path length of 3, plus the client-nominated rendezvous point,
+# plus a seperate introduction point
+NODES = Authority.getN(1) + OldAuthority.getN(1) + NonExitRelay.getN(1) + \
+        OldNonExitRelay.getN(1) + OldNewNonExitRelay.getN(1) + \
+        OldNewClient.getN(1) + OldNewHS.getN(1)
+
+ConfigureNodes(NODES)