[1206] | 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 |
|
---|