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
|