Browse Source

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 7 years ago
parent
commit
a5dc7bcf87
2 changed files with 108 additions and 0 deletions
  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)