summaryrefslogtreecommitdiffstats
path: root/retiolum/scripts/adv_graphgen/parse_tinc_anon.py
blob: 9041fb35e7e671d5fc02706504d3178497a8fd0a (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
94
95
96
97
98
99
100
101
102
103
104
105
#!/usr/bin/python
# -*- coding: utf8 -*-
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:
  import socket
  from time import time
  import os
  host = os.environ.get("GRAPHITE_HOST","localhost")
  port = 2003
  g_path =  os.environ.get("GRAPHITE_PATH","retiolum")
  begin = time()
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  sys.stderr.write("connecting to %s:%d"%(host,port))
  s.connect((host,port))
except Exception as e:
  sys.stderr.write( "Cannot connect to graphite: " + str(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
  """
  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: 
    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