Add the old state-parser
It's ugly, not layered at all and even more PoC :-)old_stateparser
parent
a5f83863c9
commit
28489ce10a
@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# Simple as of now.
|
||||
|
||||
import re
|
||||
|
||||
def _dumbload(f) -> list[tuple[int, str]]:
|
||||
"""Loads file into list of lines with their indentations"""
|
||||
tabs = re.compile(r'^\t*')
|
||||
return [(tabs.match(line).end(), line[tabs.match(line).end():]) for line in f]
|
||||
|
||||
def _load(f):
|
||||
"""Loads state file into tuples of the sections"""
|
||||
dumb = _dumbload(f)
|
||||
maxdepth = max(x[0] for x in dumb)
|
||||
state = [None] * (maxdepth+1)
|
||||
result = []
|
||||
for depth, line in dumb:
|
||||
line = line.strip()
|
||||
if line == '': continue
|
||||
state[depth] = line
|
||||
for x in range(depth+1, maxdepth+1):
|
||||
state[x] = None
|
||||
result.append(state.copy()) # It's all strings, so OK.
|
||||
return result
|
||||
|
||||
def load(f) -> dict[tuple[str, str], list[str]]:
|
||||
"""Loads state file into dictionaries area+router/network -> list of parameters"""
|
||||
# FIXME: Shouldn't we just create a ton of ordered dictionaries?
|
||||
# i.e. area -> router -> param -> None; all string.
|
||||
params = _load(f)
|
||||
result = {}
|
||||
for x in params:
|
||||
if x[-1] is None: continue # FIXME: Not working for general output.
|
||||
k = (x[0], x[1])
|
||||
if k not in result:
|
||||
result[k] = []
|
||||
result[k].append(' '.join(x[2:]))
|
||||
return result
|
||||
|
||||
def create_graph(d):
|
||||
"""takes the dict from load() and returns list of edges.
|
||||
|
||||
The graph is bipartite, one part is the routers, other is the networks"""
|
||||
edges = []
|
||||
names = {}
|
||||
for k, v in d.items():
|
||||
v1 = k[1]
|
||||
for l in v:
|
||||
# UGLY!
|
||||
if v1.startswith('router') and l.startswith(('network', 'stubnet', 'external')):
|
||||
m = re.match(r'^([^ ]+ [^ ]+) metric ([0-9]+)$', l)
|
||||
v2 = m.group(1)
|
||||
metric = int(m.group(2))
|
||||
edges.append((v1, v2, metric))
|
||||
if v1.startswith('network') and l.startswith('address'):
|
||||
names[v1] = l
|
||||
# NOTE: Not all networks have reasonable address (external, stubnets), so they will not be listed.
|
||||
return edges, names
|
||||
|
||||
if __name__ == '__main__':
|
||||
#from pprint import pprint
|
||||
#pprint(create_graph(load(open('state'))))
|
||||
edges, names = create_graph(load(open('state')))
|
||||
|
||||
# Prologue:
|
||||
print(r'graph "Visualisation" {')
|
||||
|
||||
for edge in edges:
|
||||
print(f'"{edge[0]}" -- "{edge[1]}" [label={edge[2]}];')
|
||||
|
||||
for ident,name in names.items():
|
||||
print(f'"{ident}" [label="{name}"]')
|
||||
# Dot falls back to vertex name, so this solves the missing keys in names.
|
||||
|
||||
# Epi:
|
||||
print('}')
|
Loading…
Reference in New Issue