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('-i', '--sensors-interval', action='store', type=int,
21 help='Change the interval of running sensors to given value')
22 return parser.parse_args()
24 def generate_topology(peers, links):
28 graph = networkx.empty_graph(peers)
29 for i in range(0, links):
33 a = random.randint(0, peers - 1)
34 b = random.randint(0, peers - 1)
36 node_colors = [0] * peers
37 pos = networkx.layout.spring_layout(graph)
39 def create_topology_file():
42 for i in range(len(graph.edge)):
44 for e in graph.edges():
45 nodes[e[0]].append(e[1])
47 f = tempfile.NamedTemporaryFile(delete=False)
48 for i in range(len(nodes)):
49 if len(nodes[i]) == 0:
52 f.write('|'.join(map(str, nodes[i])))
63 name = str(t) + '.png'
64 while os.path.exists(name):
65 name = '%d(%d).png' % (t, inc)
67 print 'Drawing graph to file: %s' % name
69 networkx.draw(graph, pos=pos, node_color=node_colors, with_labels=range(len(graph.node)), cmap=plt.cm.Reds, vmin=0, vmax=2)
72 def peers_disconnected(p1, p2):
74 print 'Disconnected peers %d and %d' % (p1, p2)
75 if p2 not in graph[p1]:
76 print 'Link does not exist'
78 graph.remove_edge(p1, p2)
81 def anomaly_report(report):
83 if 0 == report['anomalous']:
84 node_colors[report['peer']] = 0
86 node_colors[report['peer']] = 1 + report['neighbors']
89 def handle_profiler_line(line):
93 if 'Peer disconnection request sent' in line: # Peers disconnected
94 parts = line.split(':')
95 peers = parts[-1].split(',')
96 peers_disconnected(int(peers[0]), int(peers[1]))
98 if 'Anomaly report:' in line:
99 parts = line.split('Anomaly report:')
100 anomaly_report(eval(parts[1]))
103 def run_profiler(peers, topology_file, sensors_interval):
104 cmd1 = "GNUNET_FORCE_LOG='gnunet-sensor-profiler;;;;DEBUG' gnunet-sensor-profiler -p %d -t %s" % (peers, topology_file)
106 cmd1 += " -i %d" % sensors_interval
108 cmd = "%s %s" % (cmd1, cmd2)
110 process = Popen([cmd], shell=True)
114 while process.poll() is None:
116 if not c or c == '\n':
117 handle_profiler_line(line)
124 args = vars(get_args())
125 num_peers = args['peers']
127 print 'Min number of peers is 3'
129 sensors_interval = None
130 if 'sensors_interval' in args:
131 sensors_interval = args['sensors_interval']
132 #num_links = int(math.log(num_peers) * math.log(num_peers) * num_peers / 2)
133 num_links = int(math.log(num_peers) * num_peers)
134 # Generate random topology
135 generate_topology(num_peers, num_links)
136 print 'Generated random topology with %d peers and %d links' % (num_peers, num_links)
137 # Create TESTBED topology file
138 top_file = create_topology_file()
139 print 'Created TESTBED topology file %s' % top_file
142 run_profiler(num_peers, top_file, sensors_interval)
144 if __name__ == "__main__":