5
0
mirror of https://github.com/cwinfo/yggdrasil-map synced 2024-10-18 07:40:42 +00:00
yggdrasil-map/web/updateGraph.py

80 lines
2.3 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python
import graphPlotter
import cgi
import urllib, json
2019-12-25 23:27:34 +00:00
#url = "http://y.yakamo.org:3000/current"
url = "current"
# nodes indexed by coords
class NodeInfo:
def __init__(self, ip, coords):
self.ip = str(ip)
self.label = str(ip).split(":")[-1]
self.coords = str(coords)
self.version = "unknown"
def getCoordList(self):
return self.coords.strip("[]").split(" ")
def getParent(self):
p = self.getCoordList()
if len(p) > 0: p = p[:-1]
return "[" + " ".join(p).strip() + "]"
def getLink(self):
c = self.getCoordList()
return int(self.getCoordList()[-1].strip() or "0")
class LinkInfo:
def __init__(self, a, b):
self.a = a # NodeInfo
self.b = b # NodeInfo
def generate_graph(time_limit=60*60*3):
response = urllib.urlopen(url)
data = json.loads(response.read())["yggnodes"]
toAdd = []
for key in data:
if 'address' not in data[key] or 'coords' not in data[key]: continue
ip = data[key]['address']
coords = data[key]['coords']
info = NodeInfo(ip, coords)
2021-07-06 23:48:25 +00:00
try:
if 'nodeinfo' in data[key]:
if 'name' in data[key]['nodeinfo']:
label = str(data[key]['nodeinfo']['name'])
if len(label) <= 64:
2021-07-06 23:48:25 +00:00
info.label = label
except: pass
info.label = cgi.escape(info.label)
toAdd.append(info)
nodes = dict()
def addAncestors(info):
2018-12-13 01:09:42 +00:00
coords = info.getParent()
parent = NodeInfo("{} {}".format("?", coords), coords)
2018-12-18 03:44:27 +00:00
parent.label = parent.ip
nodes[parent.coords] = parent
if parent.coords != parent.getParent(): addAncestors(parent)
for info in toAdd: addAncestors(info)
for info in toAdd: nodes[info.coords] = info
sortedNodes = sorted(nodes.values(), key=(lambda x: x.getLink()))
#for node in sortedNodes: print node.ip, node.coords, node.getParent(), node.getLink()
edges = []
for node in sortedNodes:
if node.coords == node.getParent: continue
edges.append(LinkInfo(node, nodes[node.getParent()]))
2015-11-21 11:47:21 +00:00
print '%d nodes, %d edges' % (len(nodes), len(edges))
2015-11-21 11:47:21 +00:00
graph = graphPlotter.position_nodes(nodes, edges)
js = graphPlotter.get_graph_json(graph)
2015-11-21 11:47:21 +00:00
with open('static/graph.json', 'w') as f:
f.write(js)
if __name__ == '__main__':
2015-11-21 11:47:21 +00:00
generate_graph()