| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 | # This network generates a random mix of tor versions each time it is run# You'll need at least 4 runs to cover all possibilitiesimport randomrng = random.SystemRandom()# We have to use the same tags for old and new versions, otherwise switching# between them at random does not workOLD_TOR="tor-stable"# By default, Authorities are not configured as exitsAuthority = 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 randomOldNewExitRelay = 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 timeprint("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 lengthNODES = Authority.getN(1) + OldAuthority.getN(1) + OldExitRelay.getN(1) + OldClient.getN(1)ConfigureNodes(NODES)
 |