summaryrefslogtreecommitdiffstats
path: root/retiolum/scripts/adv_graphgen/parse_tinc_anon.py
blob: 05b828288bf1177a70489b9077896a4d473efaf6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/usr/bin/python
# -*- coding: utf8 -*-
from tinc_stats.Graphite import GraphiteSender
from time import time

try:
  import os
  gr = GraphiteSender(os.environ.get("GRAPHITE_HOST","localhost"))
  begin = time()
except Exception as e:
  sys.stderr.write( "Cannot connect to graphite: " + str(e))


def write_digraph(nodes):
  """
  writes the complete digraph in dot format
  """
  print ('digraph retiolum {')
  #print ('  graph [center rankdir=LR packMode="clust"]')
  print ('  graph [center packMode="clust"]')
  print ('  node[shape=circle,style=filled,fillcolor=grey]')
  print ('  overlap=false')
  generate_stats(nodes)
  merge_edges(nodes)
  nodes = anon_nodes(nodes)
  for k,v in nodes.iteritems():
    write_node(k,v)
  write_stat_node(nodes)
  print ('}')

def anon_nodes(nodes):
  #anonymizes all nodes
  i = "0"
  newnodes = {}
  for k,v in nodes.iteritems():
    for nodek,node in nodes.iteritems():
      for to in node['to']:
        if to['name'] == k:
          to['name'] = i
    newnodes[i] = v
    i = str(int(i)+1)
  return newnodes

def write_stat_node(nodes):
  ''' Write a `stats` node in the corner
      This node contains infos about the current number of active nodes and connections inside the network
  '''
  from time import localtime,strftime
  num_conns = 0
  num_nodes = len(nodes)
  for k,v in nodes.iteritems():
    num_conns+= len(v['to'])
  node_text = "  stats_node [shape=box,label=\"Statistics\\l"
  node_text += "Build Date  : %s\\l" % strftime("%Y-%m-%d %H:%M:%S",localtime())
  node_text += "Active Nodes: %s\\l" % num_nodes
  node_text += "Connections : %s\\l" % num_conns
  node_text += "\""
  node_text += ",fillcolor=green"
  node_text += "]"
  print(node_text)



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=\""
  print node

  for con in v.get('to',[]):
    label  = con['weight']
    w = int(con['weight'])
    weight = str(1000 - (((w - 150) * (1000 - 0)) / (1000 -150 )) + 0)

    length = str(float(w)/1500)
    if float(weight) < 0 :
      weight= "1"

    edge = "  "+k+ " -> " +con['name'] + " [label="+label + " weight="+weight 
    if con.get('bidirectional',False):
      edge += ",dir=both"
    edge += "]"
    print edge

if __name__ == "__main__":
  nodes = delete_unused_nodes(json.load(sys.stdin))
  write_digraph(nodes)
  try: 
    gr.send("graph.anon_build_time",(time()-begin)*1000)
  except Exception as e: pass