diff options
Diffstat (limited to 'retiolum/scripts/adv_graphgen/parse_tinc_anon.py')
-rwxr-xr-x | retiolum/scripts/adv_graphgen/parse_tinc_anon.py | 79 |
1 files changed, 14 insertions, 65 deletions
diff --git a/retiolum/scripts/adv_graphgen/parse_tinc_anon.py b/retiolum/scripts/adv_graphgen/parse_tinc_anon.py index 82ee2f2e..9041fb35 100755 --- a/retiolum/scripts/adv_graphgen/parse_tinc_anon.py +++ b/retiolum/scripts/adv_graphgen/parse_tinc_anon.py @@ -1,6 +1,7 @@ #!/usr/bin/python # -*- coding: utf8 -*- -from BackwardsReader import BackwardsReader +from tinc_stats.BackwardsReader import BackwardsReader +from tinc_stats.Graph import generate_stats,delete_unused_nodes,merge_edges import sys,json #supernodes= [ "kaah","supernode","euer","pa_sharepoint","oxberg" ] try: @@ -19,6 +20,7 @@ except Exception as e: """ TODO: Refactoring needed to pull the edges out of the node structures again, it should be easier to handle both structures""" DUMP_FILE = "/krebs/db/availability" + def write_digraph(nodes): """ writes the complete digraph in dot format @@ -37,6 +39,7 @@ def write_digraph(nodes): print ('}') def anon_nodes(nodes): + #anonymizes all nodes i = "0" newnodes = {} for k,v in nodes.iteritems(): @@ -66,46 +69,6 @@ def write_stat_node(nodes): node_text += "]" print(node_text) -def generate_stats(nodes): - """ Generates some statistics of the network and nodes - """ - for k,v in nodes.iteritems(): - conns = v.get('to',[]) - for c in conns: #sanitize weights - if float(c['weight']) > 9000: c['weight'] = str(9001) - elif float(c['weight']) < 0: c['weight'] = str(0) - v['num_conns'] = len(conns) - v['avg_weight'] = get_node_avg_weight(conns) -def get_node_avg_weight(conns): - """ calculates the average weight for the given connections """ - if not conns: - sys.syderr.write("get_node_avg_weight: connection parameter empty") - return 9001 - else: - return sum([float(c['weight']) for c in conns])/len(conns) - -def delete_unused_nodes(nodes): - new_nodes = {} - for k,v in nodes.iteritems(): - if v['external-ip'] == "(null)": - continue - if v.get('to',[]): - new_nodes[k] = v - for k,v in new_nodes.iteritems(): - if not [ i for i in v['to'] if i['name'] in new_nodes]: - #del(new_nodes[k]) - del(k) - 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.get(con['name'],{}).get('to',[])): - if k == secon['name']: - del (nodes[con['name']]['to'][i]) - con['bidirectional'] = True def write_node(k,v): @@ -115,13 +78,6 @@ def write_node(k,v): """ node = " "+k #+"[label=\"" - #node += k+"\\l" - #node += "avg weight: %.2f\\l" % v['avg_weight'] - #if v.has_key('num_conns'): - # node += "Conns:"+str(v['num_conns'])+"\\l" - #node +="\"" - #node +=",group=\""+v['external-ip'].replace(".","") + "\"" - #node += "]" print node for con in v.get('to',[]): @@ -130,27 +86,20 @@ def write_node(k,v): weight = str(1000 - (((w - 150) * (1000 - 0)) / (1000 -150 )) + 0) length = str(float(w)/1500) - #weight = "1000" #str(300/float(con['weight'])) - #weight = str((100/float(con['weight']))) - #weight = str(-1 * (200-100000/int(con['weight']))) if float(weight) < 0 : weight= "1" - #sys.stderr.write(weight + ":"+ length +" %s -> " %k + str(con) + "\n") - edge = " "+k+ " -> " +con['name'] + " [label="+label + " weight="+weight #+ " minlen="+length + edge = " "+k+ " -> " +con['name'] + " [label="+label + " weight="+weight if con.get('bidirectional',False): edge += ",dir=both" edge += "]" print edge - -def decode_input(FILE): - return json.load(FILE) -nodes = decode_input(sys.stdin) -nodes = delete_unused_nodes(nodes) -write_digraph(nodes) -try: - end = time() - msg = '%s.graph.anon_build_time %d %d\r\n' % (g_path,((end-begin)*1000),end) - s.send(msg) - s.close() -except Exception as e: pass +if __name__ == "__main__": + nodes = delete_unused_nodes(json.load(sys.stdin)) + write_digraph(nodes) + try: + end = time() + msg = '%s.graph.anon_build_time %d %d\r\n' % (g_path,((end-begin)*1000),end) + s.send(msg) + s.close() + except Exception as e: pass |