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 parser.add_argument('-a', '--anomalous-peers', action='store', type=int,
26 help='Number of peers to simulate anomalies on')
27 return parser.parse_args()
29 def generate_topology(peers, links):
33 graph = networkx.empty_graph(peers)
34 for i in range(0, links):
38 a = random.randint(0, peers - 1)
39 b = random.randint(0, peers - 1)
41 node_colors = [0] * peers
42 pos = networkx.layout.spring_layout(graph)
44 def create_topology_file():
47 for i in range(len(graph.edge)):
49 for e in graph.edges():
50 nodes[e[0]].append(e[1])
52 f = tempfile.NamedTemporaryFile(delete=False)
53 for i in range(len(nodes)):
54 if len(nodes[i]) == 0:
57 f.write('|'.join(map(str, nodes[i])))
68 name = str(t) + '.png'
69 while os.path.exists(name):
70 name = '%d(%d).png' % (t, inc)
72 print 'Drawing graph to file: %s' % name
75 for i in range(len(graph.node)):
76 if node_colors[i] >= 1:
77 anomaly_lbls[i] = '\n\n\n' + str(node_colors[i] - 1)
78 networkx.draw(graph, pos=pos, node_color=node_colors, with_labels=range(len(graph.node)), cmap=plt.cm.Reds, vmin=0, vmax=2)
79 networkx.draw_networkx_labels(graph, pos, anomaly_lbls)
82 def peers_reconnected(p1, p2):
85 print 'Link already exists'
87 graph.add_edge(p1, p2)
90 def peers_disconnected(p1, p2):
92 print 'Disconnected peers %d and %d' % (p1, p2)
93 if p2 not in graph[p1]:
94 print 'Link does not exist'
96 graph.remove_edge(p1, p2)
99 def anomaly_report(report):
101 if 0 == report['anomalous']:
102 node_colors[report['peer']] = 0
104 clr = 1 + report['neighbors']
105 if node_colors[report['peer']] >= clr:
107 node_colors[report['peer']] = clr
110 def handle_profiler_line(line):
114 if 'Peer disconnection request sent' in line: # Peers disconnected
115 parts = line.split(':')
116 peers = parts[-1].split(',')
117 peers_disconnected(int(peers[0]), int(peers[1]))
119 if 'Anomaly report:' in line:
120 parts = line.split('Anomaly report:')
121 anomaly_report(eval(parts[1]))
123 if 'Peer connection request sent' in line: # Peers reconnected
124 parts = line.split(':')
125 peers = parts[-1].split(',')
126 peers_reconnected(int(peers[0]), int(peers[1]))
128 def run_profiler(peers, topology_file, sensors_interval, anomalous_peers):
129 cmd1 = "./gnunet-sensor-profiler -p %d -t %s -a %d" % (peers, topology_file, anomalous_peers)
131 cmd1 += " -i %d" % sensors_interval
133 cmd = "%s %s" % (cmd1, cmd2)
135 process = Popen([cmd], shell=True)
139 while process.poll() is None:
141 if not c or c == '\n':
142 handle_profiler_line(line)
148 args = vars(get_args())
149 num_peers = args['peers']
151 print 'Min number of peers is 3'
153 sensors_interval = None
154 if 'sensors_interval' in args:
155 sensors_interval = args['sensors_interval']
157 num_links = args['links']
159 #num_links = int(math.log(num_peers) * math.log(num_peers) * num_peers / 2)
160 num_links = int(math.log(num_peers) * num_peers)
161 # Generate random topology
162 generate_topology(num_peers, num_links)
163 print 'Generated random topology with %d peers and %d links' % (num_peers, num_links)
164 # Create a file with links to cut to split the topology into two
165 # Create TESTBED topology file
166 top_file = create_topology_file()
167 print 'Created TESTBED topology file %s' % top_file
170 if os.path.isfile('log'):
172 run_profiler(num_peers, top_file, sensors_interval, args['anomalous_peers'])
174 if __name__ == "__main__":