mirror of
https://github.com/cwinfo/yggdrasil-map
synced 2025-08-14 17:08:09 +00:00
changes to get it working with y.yakamo.org:3000/current as a source of node info
This commit is contained in:
@@ -3,16 +3,64 @@ from flask import Config
|
||||
from database import NodeDB
|
||||
import graphPlotter
|
||||
|
||||
import urllib, json
|
||||
url = "http://y.yakamo.org:3000/current"
|
||||
|
||||
# nodes indexed by coords
|
||||
class NodeInfo:
|
||||
def __init__(self, ip, coords):
|
||||
self.ip = str(ip)
|
||||
self.label = str(ip) # TODO readable labels
|
||||
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):
|
||||
nodes, edges = load_graph_from_db(time_limit)
|
||||
response = urllib.urlopen(url)
|
||||
data = json.loads(response.read())["yggnodes"]
|
||||
|
||||
toAdd = []
|
||||
for ip in data:
|
||||
info = NodeInfo(ip, data[ip][0])
|
||||
toAdd.append(info)
|
||||
|
||||
nodes = dict()
|
||||
def addAncestors(info):
|
||||
parent = NodeInfo("?", info.getParent())
|
||||
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()]))
|
||||
|
||||
print '%d nodes, %d edges' % (len(nodes), len(edges))
|
||||
|
||||
graph = graphPlotter.position_nodes(nodes, edges)
|
||||
json = graphPlotter.get_graph_json(graph)
|
||||
js = graphPlotter.get_graph_json(graph)
|
||||
|
||||
with open('static/graph.json', 'w') as f:
|
||||
f.write(json)
|
||||
f.write(js)
|
||||
|
||||
|
||||
def load_graph_from_db(time_limit):
|
||||
|
Reference in New Issue
Block a user