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 return parser.parse_args()
21 def generate_topology(peers, links):
25 graph = networkx.empty_graph(peers)
26 for i in range(0, links):
30 a = random.randint(0, peers - 1)
31 b = random.randint(0, peers - 1)
33 node_colors = [0] * peers
34 pos = networkx.layout.spring_layout(graph)
36 def create_topology_file():
39 for i in range(len(graph.edge)):
41 for e in graph.edges():
42 nodes[e[0]].append(e[1])
44 f = tempfile.NamedTemporaryFile(delete=False)
45 for i in range(len(nodes)):
46 if len(nodes[i]) == 0:
49 f.write('|'.join(map(str, nodes[i])))
60 name = str(t) + '.png'
61 while os.path.exists(name):
62 name = '%d(%d).png' % (t, inc)
64 print 'Drawing graph to file: %s' % name
66 networkx.draw(graph, pos=pos, node_color=node_colors, with_labels=range(len(graph.node)), cmap=plt.cm.Reds, vmin=0, vmax=2)
69 def peers_disconnected(p1, p2):
71 print 'Disconnected peers %d and %d' % (p1, p2)
72 if p2 not in graph[p1]:
73 print 'Link does not exist'
75 graph.remove_edge(p1, p2)
78 def anomaly_report(report):
80 if 0 == report['anomalous']:
81 node_colors[report['peer']] = 0
83 node_colors[report['peer']] = 1 + report['neighbors']
86 def handle_profiler_line(line):
90 if 'Peer disconnection request sent' in line: # Peers disconnected
91 parts = line.split(':')
92 peers = parts[-1].split(',')
93 peers_disconnected(int(peers[0]), int(peers[1]))
95 if 'Anomaly report:' in line:
96 parts = line.split('Anomaly report:')
97 anomaly_report(eval(parts[1]))
100 def run_profiler(peers, topology_file):
101 cmd = "GNUNET_FORCE_LOG='gnunet-sensor-profiler;;;;DEBUG' gnunet-sensor-profiler -p %d -t %s > log 2>&1" % (peers, topology_file)
102 process = Popen([cmd], shell=True)
106 while process.poll() is None:
108 if not c or c == '\n':
109 handle_profiler_line(line)
116 args = vars(get_args())
117 num_peers = args['peers']
119 print 'Min number of peers is 3'
121 num_links = int(math.log(num_peers) * math.log(num_peers) * num_peers / 2)
122 # Generate random topology
123 generate_topology(num_peers, num_links)
124 print 'Generated random topology with %d peers and %d links' % (num_peers, num_links)
125 # Create TESTBED topology file
126 top_file = create_topology_file()
127 print 'Created TESTBED topology file %s' % top_file
130 run_profiler(num_peers, top_file)
132 if __name__ == "__main__":