From e0ec5d2e8560ae433ee677622b24ba82dbe7630b Mon Sep 17 00:00:00 2001 From: tv Date: Sun, 29 May 2011 15:47:21 +0200 Subject: lowered filesystem hierarchy--everything are modules --- retiolum/scripts/adv_graphgen/README | 28 +++++++++ retiolum/scripts/adv_graphgen/parse.py | 101 ++++++++++++++++++++++++++++++ retiolum/scripts/adv_graphgen/sanitize.sh | 13 ++++ 3 files changed, 142 insertions(+) create mode 100644 retiolum/scripts/adv_graphgen/README create mode 100755 retiolum/scripts/adv_graphgen/parse.py create mode 100755 retiolum/scripts/adv_graphgen/sanitize.sh (limited to 'retiolum/scripts/adv_graphgen') diff --git a/retiolum/scripts/adv_graphgen/README b/retiolum/scripts/adv_graphgen/README new file mode 100644 index 00000000..082e0f2b --- /dev/null +++ b/retiolum/scripts/adv_graphgen/README @@ -0,0 +1,28 @@ +The folder contains a number of scripts which provide a convenient way to +generate advanced graphs from the SIGUSR2 output of tinc. + +it currently contains the following files: + +sanitize.sh: + wrapper arond parse.py which filters the syslog file for all tinc + related lines and removes the status informations: + this means that + + May 19 20:40:44 servarch dnsmasq[5382]: reading /etc/resolv.conf + May 19 20:41:38 servarch tinc.retiolum[4780]: Error looking up pa-sharepoint.informatik.ba-stuttgart.de port 655: Name or service not known + + becomes + + Error looking up pa-sharepoint.informatik.ba-stuttgart.de port 655: Name or service not known + + and so on. + It also provides a wrapper around graphviz which automagically + generates graphs from the produced graph file + +parse.py: + reads from stdin the sanitized syslog file and prints a valid dot file + from the given output. + The parser module may also produce any other output (e.g. for dns + entries and so on) you will need to actually read and modify the source + in order to be able to do this. ~May the source be with you~ + diff --git a/retiolum/scripts/adv_graphgen/parse.py b/retiolum/scripts/adv_graphgen/parse.py new file mode 100755 index 00000000..639c5316 --- /dev/null +++ b/retiolum/scripts/adv_graphgen/parse.py @@ -0,0 +1,101 @@ +#!/usr/bin/python2 +# -*- coding: utf8 -*- + +import sys +""" TODO: Refactoring needed to pull the edges out of the node structures again, +it should be easier to handle both structures""" + +def write_digraph(nodes): + """ + writes the complete digraph in dot format + """ + print ('digraph retiolum {') + print (' node[shape=box,style=filled,fillcolor=grey]') + generate_stats(nodes) + nodes = delete_unused_nodes(nodes) + merge_edges(nodes) + for k,v in nodes.iteritems(): + write_node(k,v) + print ('}') +def generate_stats(nodes): + """ Generates some statistics of the network and nodes + """ + for k,v in nodes.iteritems(): + v['num_conns'] = len(v.get('to',[])) +def delete_unused_nodes(nodes): + new_nodes = {} + for k,v in nodes.iteritems(): + if v.get('to',[]): + new_nodes[k] = v + return new_nodes +def merge_edges(nodes): + """ merge back and forth edges into one + DESTRUCTS the current structure by deleting "connections" in the nodes + + """ + for k,v in nodes.iteritems(): + for con in v.get('to',[]): + for i,secon in enumerate(nodes[con['name']].get('to',[])): + if k == secon['name']: + del (nodes[con['name']]['to'][i]) + con['bidirectional'] = True + + +def write_node(k,v): + """ writes a single node and its edges + edges are weightet with the informations inside the nodes provided by + tinc + """ + node = " "+k+"[label=\"" + node += k+"\\l" + node += "external:"+v['external-ip']+":"+v['external-port']+"\\l" + if v.has_key('num_conns'): + node += "Num Connects:"+str(v['num_conns'])+"\\l" + for addr in v.get('internal-ip',['¯\\\\(°_o)/¯']): + node += "internal:"+addr+"\\l" + node +="\"" + if v['external-ip'] == "MYSELF": + node += ",fillcolor=steelblue1" + node += "]" + print node + + for con in v.get('to',[]): + edge = " "+k+ " -> " +con['name'] + "[weight="+str(float(con['weight'])) + if con.get('bidirectional',False): + edge += ",dir=both" + edge += "]" + print edge + +def parse_input(): + nodes={} + for line in sys.stdin: + line = line.replace('\n','') + if line == 'Nodes:': + nodes={} + for line in sys.stdin: + if line == 'End of nodes.\n': + break + l = line.replace('\n','').split() #TODO unhack me + nodes[l[0]]= { 'external-ip': l[2], 'external-port' : l[4] } + if line == 'Subnet list:': + for line in sys.stdin: + if line == 'End of subnet list.\n': + break + l = line.replace('\n','').split() + if not nodes[l[2]].get('internal-ip',False): + nodes[l[2]]['internal-ip'] = [] + nodes[l[2]]['internal-ip'].append(l[0].split('#')[0]) + if line == 'Edges:': + edges = {} + for line in sys.stdin: + if line == 'End of edges.\n': + break + l = line.replace('\n','').split() + + if not nodes[l[0]].has_key('to') : + nodes[l[0]]['to'] = [] + nodes[l[0]]['to'].append( + {'name':l[2],'addr':l[4],'port':l[6],'weight' : l[10] }) + return nodes +nodes = parse_input() +write_digraph(nodes) diff --git a/retiolum/scripts/adv_graphgen/sanitize.sh b/retiolum/scripts/adv_graphgen/sanitize.sh new file mode 100755 index 00000000..0e12d207 --- /dev/null +++ b/retiolum/scripts/adv_graphgen/sanitize.sh @@ -0,0 +1,13 @@ +GRAPH_SETTER1=dot +GRAPH_SETTER2=circo +LOG_FILE=/var/log/everything.log +OPENER=/bin/true + +sudo pkill -USR2 tincd +sudo sed -n '/tinc.retiolum/{s/.*tinc.retiolum\[[0-9]*\]: //gp}' $LOG_FILE |\ + ./parse.py > retiolum.dot + +$GRAPH_SETTER1 -Tpng -o $1retiolum_1.png retiolum.dot +$GRAPH_SETTER2 -Tpng -o $1retiolum_2.png retiolum.dot +$OPENER retiolum_1.png &>/dev/null +#rm retiolum.dot -- cgit v1.2.3 From 8f3a8ad37da0d683a851a11fe6b55d0a45403b5c Mon Sep 17 00:00:00 2001 From: Felix Richter Date: Mon, 30 May 2011 18:12:42 +0200 Subject: added overlap=false fix, neato grapher --- retiolum/scripts/adv_graphgen/parse.py | 1 + retiolum/scripts/adv_graphgen/sanitize.sh | 2 ++ 2 files changed, 3 insertions(+) (limited to 'retiolum/scripts/adv_graphgen') diff --git a/retiolum/scripts/adv_graphgen/parse.py b/retiolum/scripts/adv_graphgen/parse.py index 639c5316..9c2dd051 100755 --- a/retiolum/scripts/adv_graphgen/parse.py +++ b/retiolum/scripts/adv_graphgen/parse.py @@ -11,6 +11,7 @@ def write_digraph(nodes): """ print ('digraph retiolum {') print (' node[shape=box,style=filled,fillcolor=grey]') + print (' overlap=false') generate_stats(nodes) nodes = delete_unused_nodes(nodes) merge_edges(nodes) diff --git a/retiolum/scripts/adv_graphgen/sanitize.sh b/retiolum/scripts/adv_graphgen/sanitize.sh index 0e12d207..3860a9b8 100755 --- a/retiolum/scripts/adv_graphgen/sanitize.sh +++ b/retiolum/scripts/adv_graphgen/sanitize.sh @@ -1,5 +1,6 @@ GRAPH_SETTER1=dot GRAPH_SETTER2=circo +GRAPH_SETTER3=neato LOG_FILE=/var/log/everything.log OPENER=/bin/true @@ -9,5 +10,6 @@ sudo sed -n '/tinc.retiolum/{s/.*tinc.retiolum\[[0-9]*\]: //gp}' $LOG_FILE |\ $GRAPH_SETTER1 -Tpng -o $1retiolum_1.png retiolum.dot $GRAPH_SETTER2 -Tpng -o $1retiolum_2.png retiolum.dot +$GRAPH_SETTER3 -Tpng -o $1retiolum_3.png retiolum.dot $OPENER retiolum_1.png &>/dev/null #rm retiolum.dot -- cgit v1.2.3 From e89ede8ec7e8893c6fe23f456fbc4de4ab04804c Mon Sep 17 00:00:00 2001 From: Felix Richter Date: Wed, 8 Jun 2011 18:36:33 +0200 Subject: adv_graphgen/sanitize.sh: added sfdp graph setter --- retiolum/scripts/adv_graphgen/sanitize.sh | 2 ++ 1 file changed, 2 insertions(+) (limited to 'retiolum/scripts/adv_graphgen') diff --git a/retiolum/scripts/adv_graphgen/sanitize.sh b/retiolum/scripts/adv_graphgen/sanitize.sh index 3860a9b8..2febc54c 100755 --- a/retiolum/scripts/adv_graphgen/sanitize.sh +++ b/retiolum/scripts/adv_graphgen/sanitize.sh @@ -1,6 +1,7 @@ GRAPH_SETTER1=dot GRAPH_SETTER2=circo GRAPH_SETTER3=neato +GRAPH_SETTER3=sfdp LOG_FILE=/var/log/everything.log OPENER=/bin/true @@ -11,5 +12,6 @@ sudo sed -n '/tinc.retiolum/{s/.*tinc.retiolum\[[0-9]*\]: //gp}' $LOG_FILE |\ $GRAPH_SETTER1 -Tpng -o $1retiolum_1.png retiolum.dot $GRAPH_SETTER2 -Tpng -o $1retiolum_2.png retiolum.dot $GRAPH_SETTER3 -Tpng -o $1retiolum_3.png retiolum.dot +$GRAPH_SETTER4 -Tpng -o $1retiolum_4.png retiolum.dot $OPENER retiolum_1.png &>/dev/null #rm retiolum.dot -- cgit v1.2.3 From 02824eed4f957e25bf9bfda6bf09e093447abb68 Mon Sep 17 00:00:00 2001 From: makefu Date: Mon, 8 Aug 2011 23:36:42 +0200 Subject: retiolum/scripts/adv_graphgen: verb krebs output retiolum/scripts/adv_graphgen/parse.py: add the group info to the krebs parser retiolum/scripts/adv_graphgen/sanitize.sh: fixed bug which prevents generation of 4 graph new graph setter at retiolum_4.png --- retiolum/scripts/adv_graphgen/parse.py | 1 + retiolum/scripts/adv_graphgen/sanitize.sh | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'retiolum/scripts/adv_graphgen') diff --git a/retiolum/scripts/adv_graphgen/parse.py b/retiolum/scripts/adv_graphgen/parse.py index 9c2dd051..0744b262 100755 --- a/retiolum/scripts/adv_graphgen/parse.py +++ b/retiolum/scripts/adv_graphgen/parse.py @@ -57,6 +57,7 @@ def write_node(k,v): node +="\"" if v['external-ip'] == "MYSELF": node += ",fillcolor=steelblue1" + node +=",group="+v['external-ip'].replace(".","")+"" node += "]" print node diff --git a/retiolum/scripts/adv_graphgen/sanitize.sh b/retiolum/scripts/adv_graphgen/sanitize.sh index 2febc54c..c0d4e52e 100755 --- a/retiolum/scripts/adv_graphgen/sanitize.sh +++ b/retiolum/scripts/adv_graphgen/sanitize.sh @@ -1,7 +1,7 @@ GRAPH_SETTER1=dot GRAPH_SETTER2=circo -GRAPH_SETTER3=neato -GRAPH_SETTER3=sfdp +GRAPH_SETTER3='neato -Goverlap=prism ' +GRAPH_SETTER4=sfdp LOG_FILE=/var/log/everything.log OPENER=/bin/true @@ -13,5 +13,6 @@ $GRAPH_SETTER1 -Tpng -o $1retiolum_1.png retiolum.dot $GRAPH_SETTER2 -Tpng -o $1retiolum_2.png retiolum.dot $GRAPH_SETTER3 -Tpng -o $1retiolum_3.png retiolum.dot $GRAPH_SETTER4 -Tpng -o $1retiolum_4.png retiolum.dot +sfdp -Goverlap=prism retiolum.dot | gvmap -e retiolum.dot | neato -n2 -Tpng -o $!retiolum_6.png $OPENER retiolum_1.png &>/dev/null #rm retiolum.dot -- cgit v1.2.3