8 import matplotlib.pyplot as plt
9 from subprocess import Popen, PIPE, STDOUT
16 parser = argparse.ArgumentParser(description="Sensor profiler")
17 parser.add_argument('-p', '--peers', action='store', type=int, required=True,
18 help='Number of peers to run')
19 parser.add_argument('-l', '--links', action='store', type=int, required=False,
20 help='Number of links to create')
21 parser.add_argument('-i', '--sensors-interval', action='store', type=int,
23 help='Change the interval of running sensors to given value')
24 return parser.parse_args()
26 def generate_topology(peers, links):
30 graph = networkx.empty_graph(peers)
31 for i in range(0, links):
35 a = random.randint(0, peers - 1)
36 b = random.randint(0, peers - 1)
38 node_colors = [0] * peers
39 pos = networkx.layout.spring_layout(graph)
41 def create_topology_file():
44 for i in range(len(graph.edge)):
46 for e in graph.edges():
47 nodes[e[0]].append(e[1])
49 f = tempfile.NamedTemporaryFile(delete=False)
50 for i in range(len(nodes)):
51 if len(nodes[i]) == 0:
54 f.write('|'.join(map(str, nodes[i])))
65 name = str(t) + '.png'
66 while os.path.exists(name):
67 name = '%d(%d).png' % (t, inc)
69 print 'Drawing graph to file: %s' % name
72 for i in range(len(graph.node)):
73 if node_colors[i] >= 1:
74 anomaly_lbls[i] = '\n\n\n' + str(node_colors[i] - 1)
75 networkx.draw(graph, pos=pos, node_color=node_colors, with_labels=range(len(graph.node)), cmap=plt.cm.Reds, vmin=0, vmax=2)
76 networkx.draw_networkx_labels(graph, pos, anomaly_lbls)
79 def peers_reconnected(p1, p2):
82 print 'Link already exists'
84 graph.add_edge(p1, p2)
87 def peers_disconnected(p1, p2):
89 print 'Disconnected peers %d and %d' % (p1, p2)
90 if p2 not in graph[p1]:
91 print 'Link does not exist'
93 graph.remove_edge(p1, p2)
96 def anomaly_report(report):
98 if 0 == report['anomalous']:
99 node_colors[report['peer']] = 0
101 clr = 1 + report['neighbors']
102 if node_colors[report['peer']] >= clr:
104 node_colors[report['peer']] = clr
107 def handle_profiler_line(line):
111 if 'Peer disconnection request sent' in line: # Peers disconnected
112 parts = line.split(':')
113 peers = parts[-1].split(',')
114 peers_disconnected(int(peers[0]), int(peers[1]))
116 if 'Anomaly report:' in line:
117 parts = line.split('Anomaly report:')
118 anomaly_report(eval(parts[1]))
120 if 'Peer connection request sent' in line: # Peers reconnected
121 parts = line.split(':')
122 peers = parts[-1].split(',')
123 peers_reconnected(int(peers[0]), int(peers[1]))
125 def run_profiler(peers, topology_file, sensors_interval, split_file):
126 cmd1 = "./gnunet-sensor-profiler -p %d -t %s -s %s" % (peers, topology_file, split_file)
128 cmd1 += " -i %d" % sensors_interval
130 cmd = "%s %s" % (cmd1, cmd2)
132 process = Popen([cmd], shell=True)
136 while process.poll() is None:
138 if not c or c == '\n':
139 handle_profiler_line(line)
146 f = open('split', 'w+')
147 half_size = len(graph.node) / 2
155 for e in graph.edges():
156 if (e[0] in half1 and e[1] in half2) or (e[0] in half2 and e[1] in half1):
157 f.write('%d,%d\n' % (e[0], e[1]))
161 args = vars(get_args())
162 num_peers = args['peers']
164 print 'Min number of peers is 3'
166 sensors_interval = None
167 if 'sensors_interval' in args:
168 sensors_interval = args['sensors_interval']
170 num_links = args['links']
172 #num_links = int(math.log(num_peers) * math.log(num_peers) * num_peers / 2)
173 num_links = int(math.log(num_peers) * num_peers)
174 # Generate random topology
175 generate_topology(num_peers, num_links)
176 print 'Generated random topology with %d peers and %d links' % (num_peers, num_links)
177 # Create a file with links to cut to split the topology into two
179 # Create TESTBED topology file
180 top_file = create_topology_file()
181 print 'Created TESTBED topology file %s' % top_file
184 if os.path.isfile('log'):
186 run_profiler(num_peers, top_file, sensors_interval, 'split')
188 if __name__ == "__main__":