blob: 1ed351a4e82d6dea3e58ea593f17fe0a5065c1ba (
about) (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
from chutney.Testing import *
from chutney.TorNet import *
from stem.control import EventType
def hs_select_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]
if not all([ n.getController().start() for n in initial_nodes ]):
return False
logging.info("All initial nodes running")
nodes_by_fingerprint = get_node_fingerprints(network.get("a") + network.get("r"))
track_introduction_points(hs_nodes[0])
node_0_published_descriptor = threading.Event()
def hs_node_0_listener(logevent):
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()
hs_nodes[0].getStemController().remove_event_listener(hs_node_0_listener)
# list to cope with scope problems
node_counter = [len(hs_nodes) - 1]
node_counter_lock = threading.RLock()
nodes_published_descriptors = threading.Event()
def hs_node_listener(logevent):
if "Successfully uploaded v2 rend descriptors" in logevent.message:
with node_counter_lock:
node_counter[0] -= 1
if node_counter[0] == 0:
nodes_published_descriptors.set()
for node in hs_nodes[1:]:
node.getController().start()
track_introduction_points(node)
node.getStemController().add_event_listener(hs_node_listener, EventType.INFO)
nodes_published_descriptors.wait()
for node in hs_nodes[1:]:
node.getStemController().remove_event_listener(hs_node_listener)
# Now begin testing
result &= connection_test(network.get("c"), len(hs_nodes))
time.sleep(5)
# Prediction
next_intro_points = get_next_intro_points()
logging.info("Predicted new introduction points")
logging.info(next_intro_points)
fingerprint = next_intro_points[0][0]
node = nodes_by_fingerprint[fingerprint]
logging.info("stopping " + node._env["nick"] + " (" + fingerprint + ")")
node.getStemController().close()
node.getController().stop()
time.sleep(10)
result &= check_same_intro_points()
logging.info("About to stop %d introduction points" % failures)
fingerprints = set()
while len(fingerprints) != failures:
# 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())
fingerprints.add(fingerprint)
for fingerprint in fingerprints:
node = nodes_by_fingerprint[fingerprint]
logging.info("stopping " + node._env["nick"] + " (" + fingerprint + ")")
node.getStemController().close()
node.getController().stop()
logging.info("begining to watch for the establishment of new introduction points")
changed = [False for n in hs_nodes]
intro_points_before = [set(node_intro_circuits[n._env["nodenum"]].values()) for n in hs_nodes]
time.sleep(60)
intro_points_after = [set(node_intro_circuits[n._env["nodenum"]].values()) for n in hs_nodes]
for i, node in enumerate(hs_nodes):
before = intro_points_before[i]
after = intro_points_after[i]
if before != after:
changed[i] = True
if all(changed):
logging.info("All changed")
else:
logging.info("All did not change")
result &= check_same_intro_points()
result &= connection_test(network.get("c"), len(hs_nodes))
return result
|