sensor: towards profiler
[oweals/gnunet.git] / src / sensor / profiler.py
1 import argparse
2 import math
3 import networkx
4 import random
5 import tempfile
6 import os
7 import time
8 from subprocess import Popen, PIPE, STDOUT
9
10 def get_args():
11   parser = argparse.ArgumentParser(description="Sensor profiler")
12   parser.add_argument('-p', '--peers', action='store', type=int, required=True,
13                       help='Number of peers to run')
14   return parser.parse_args()
15
16 def generate_topology(peers, links):
17   G = networkx.empty_graph(peers)
18   for i in range(0, links):
19     a = 0
20     b = 0
21     while a == b:
22       a = random.randint(0, peers)
23       b = random.randint(0, peers)
24     G.add_edge(a, b)
25   return G
26
27 def create_topology_file(graph):
28   nodes = list()
29   for i in range(len(graph.edge)):
30     nodes.append(list())
31   for e in graph.edges():
32     nodes[e[0]].append(e[1])
33   print nodes
34   f = tempfile.NamedTemporaryFile(delete=False)
35   for i in range(len(nodes)):
36     if len(nodes[i]) == 0:
37       continue
38     f.write('%d:' % i)
39     f.write('|'.join(map(str, nodes[i])))
40     f.write('\n')
41   # f.close()
42   return f.name
43
44 def handle_profiler_line(line):
45   if not line:
46     return
47   print line
48
49 def run_profiler(peers, topology_file):
50   cmd = "GNUNET_FORCE_LOG='gnunet-sensor-profiler;;;;DEBUG' gnunet-sensor-profiler -p %d -t %s > log 2>&1" % (peers, topology_file)
51   process = Popen([cmd], shell=True)
52   time.sleep(0.5)
53   line = ''
54   f = open('log')
55   while process.poll() is None:
56     for c in f.read():
57       if not c or c == '\n':
58         handle_profiler_line(line)
59         line = ''
60       else:
61         line += c
62   os.remove('log')
63
64 def main():
65   args = vars(get_args())
66   num_peers = args['peers']
67   if num_peers < 3:
68     print 'Min number of peers is 3'
69     return
70   num_links = int(math.log(num_peers) * math.log(num_peers) * num_peers / 2)
71   # Generate random topology
72   graph = generate_topology(num_peers, num_links)
73   print 'Generated random topology with %d peers and %d links' % (num_peers, num_links)
74   # Create TESTBED topology file
75   top_file = create_topology_file(graph)
76   print 'Created TESTBED topology file %s' % top_file
77   # Run c profiler
78   run_profiler(num_peers, top_file)
79   
80 if __name__ == "__main__":
81   main()