1 | # Usage:
|
---|
2 | #
|
---|
3 | # $ find . -name wleiden.conf > l
|
---|
4 | #
|
---|
5 | # prune demo, test and uninteresting stuff from l
|
---|
6 | #
|
---|
7 | # $ python channelplot.py
|
---|
8 | # $ gv channelplot.ps
|
---|
9 | #
|
---|
10 | # needs graphviz (http://www.graphviz.org/) to run
|
---|
11 | import os
|
---|
12 | import re
|
---|
13 | import string
|
---|
14 |
|
---|
15 | ipdict = {}
|
---|
16 | ipnr_node = {}
|
---|
17 | node_ipnr = {}
|
---|
18 | node_wi_channel = {}
|
---|
19 | node_links = {}
|
---|
20 | node_links_channel = {}
|
---|
21 | nodelabel = {}
|
---|
22 |
|
---|
23 | def parse_wleiden_conf(lines):
|
---|
24 | ipnr = None
|
---|
25 | wi = None
|
---|
26 | peer = None
|
---|
27 | omni = 0
|
---|
28 | for l in lines:
|
---|
29 | if wi != None:
|
---|
30 | match = re.match("^\EW.*", l)
|
---|
31 | if match != None:
|
---|
32 | wi = None
|
---|
33 | ipnr = None
|
---|
34 | peer = None
|
---|
35 | continue
|
---|
36 | match = re.match("^SDESC=omni.*", l)
|
---|
37 | if match != None:
|
---|
38 | omni = 1
|
---|
39 | match = re.match("^IP=([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*).*", l)
|
---|
40 | if match != None:
|
---|
41 | ipnr = match.group(1)
|
---|
42 | if not node_ipnr.has_key(nodename):
|
---|
43 | node_ipnr[nodename] = []
|
---|
44 | node_ipnr[nodename].append(ipnr)
|
---|
45 | ipnr_node[ipnr] = nodename
|
---|
46 | match = re.match("^POINT_TO_POINT=([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*).*", l)
|
---|
47 | if match != None:
|
---|
48 | peer = match.group(1)
|
---|
49 | if not node_links.has_key(nodename):
|
---|
50 | node_links[nodename] = []
|
---|
51 | node_links[nodename].append( (peer, wi) )
|
---|
52 | match = re.match("^CHANNEL=([0-9]*).*", l)
|
---|
53 | if match != None:
|
---|
54 | if omni == 1:
|
---|
55 | nodelabel[nodename] = "%s\\n(%s)" % (nodename, match.group(1) )
|
---|
56 | else:
|
---|
57 | node_wi_channel[(nodename, wi)] = match.group(1)
|
---|
58 | else:
|
---|
59 | match = re.match("^\$nodename='([^']*)';.*", l)
|
---|
60 | if match != None:
|
---|
61 | nodename = match.group(1).lower()
|
---|
62 | match = re.match("^\$config{'(wi[0-9]*).*", l)
|
---|
63 | if match != None:
|
---|
64 | wi = match.group(1)
|
---|
65 | omni = 0
|
---|
66 |
|
---|
67 | for fname in open("l").readlines():
|
---|
68 | parse_wleiden_conf(open(fname[:-1]).readlines())
|
---|
69 |
|
---|
70 | out = open("foo.dot", "w")
|
---|
71 | out.write("digraph channelplot {\n")
|
---|
72 | for node in node_ipnr.keys():
|
---|
73 | if nodelabel.has_key(node):
|
---|
74 | label = "[label=\"%s\"]" % nodelabel[node]
|
---|
75 | else:
|
---|
76 | label = ''
|
---|
77 | out.write("\t%s %s\n" % (node, label))
|
---|
78 | for node in node_ipnr.keys():
|
---|
79 | if node_links.has_key(node):
|
---|
80 | for peer, wi in node_links[node]:
|
---|
81 | if ipnr_node.has_key(peer):
|
---|
82 | if node_wi_channel.has_key( (node,wi) ):
|
---|
83 | label = "[label=\"%s\"]" % node_wi_channel[ (node, wi) ]
|
---|
84 | else:
|
---|
85 | label = ''
|
---|
86 | out.write("%s -> %s%s\n" % (node, ipnr_node[peer], label))
|
---|
87 | else:
|
---|
88 | # link naar onbekend iemand, zal wel niet
|
---|
89 | # belangrijk zijn.
|
---|
90 | pass
|
---|
91 | out.write("}\n")
|
---|
92 | out.close()
|
---|
93 | os.system('neato -Gstart=foo -Goverlap=false/scale -Gsplines=true -Gsep=2 -Gratio=fill -Gnslimit=50.0 -Grotate=90 -Gsize="11,7.5" -Tps -o channelplot.ps foo.dot')
|
---|
94 |
|
---|