Wokring on support for hopglass server (raw.json).
This commit is contained in:
parent
cac097b242
commit
666cd20c04
|
@ -1,7 +1,8 @@
|
||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
import argparse
|
import argparse
|
||||||
from parser.NodesParser import NodesParser
|
# from parser.NodesParser import NodesParser
|
||||||
from parser.GraphParser import GraphParser
|
# from parser.GraphParser import GraphParser
|
||||||
|
from parser.Hopglass import Hopglass
|
||||||
from cloud.Node import Node
|
from cloud.Node import Node
|
||||||
from cloud.Link import Link
|
from cloud.Link import Link
|
||||||
from cloud.GlobalGraph import GlobalGraph
|
from cloud.GlobalGraph import GlobalGraph
|
||||||
|
@ -13,8 +14,9 @@ from info.Info import Info
|
||||||
class NodeHierarchy(object):
|
class NodeHierarchy(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.__args__ = self.__parseArguments__()
|
self.__args__ = self.__parseArguments__()
|
||||||
self.__nodesJson__ = NodesParser(self.__args__.json_path)
|
self.__hopglass = Hopglass(self.__args__.raw_json)
|
||||||
self.__graphJson__ = GraphParser(self.__args__.json_path)
|
# self.__nodesJson__ = NodesParser(self.__args__.json_path)
|
||||||
|
# self.__graphJson__ = GraphParser(self.__args__.json_path)
|
||||||
self.__shapesJson__ = self.__parseShapes__()
|
self.__shapesJson__ = self.__parseShapes__()
|
||||||
self.nodes = self.__createNodeObjects__()
|
self.nodes = self.__createNodeObjects__()
|
||||||
self.links = self.__createLinkObjects__()
|
self.links = self.__createLinkObjects__()
|
||||||
|
@ -48,7 +50,7 @@ class NodeHierarchy(object):
|
||||||
|
|
||||||
def __createLinkObjects__(self):
|
def __createLinkObjects__(self):
|
||||||
links = []
|
links = []
|
||||||
for link in self.__graphJson__.links:
|
for link in self.__hopglass.links:
|
||||||
try:
|
try:
|
||||||
srcNode = self.nodes[link['source']['node_id']]
|
srcNode = self.nodes[link['source']['node_id']]
|
||||||
except:
|
except:
|
||||||
|
@ -68,7 +70,7 @@ class NodeHierarchy(object):
|
||||||
|
|
||||||
def __parseArguments__(self):
|
def __parseArguments__(self):
|
||||||
parser = argparse.ArgumentParser(description='This Script generates a hierarchical nodes list for node migration using nginx geo feature.')
|
parser = argparse.ArgumentParser(description='This Script generates a hierarchical nodes list for node migration using nginx geo feature.')
|
||||||
parser.add_argument('-j', '--json-path', required=False, default='https://service.freifunk-muensterland.de/maps/data/', help='Path of nodes.json and graph.json (can be local folder or remote URL).')
|
parser.add_argument('-r', '--raw-json', required=False, default='https://karte.freifunk-muensterland.de/data/raw.json', help='Location of raw.json file (can be local folder or remote URL).')
|
||||||
parser.add_argument('-s', '--shapes-path', required=False, default='https://freifunk-muensterland.de/md-fw-dl/shapes/', help='Path of shapefiles (can be local folder or remote URL).')
|
parser.add_argument('-s', '--shapes-path', required=False, default='https://freifunk-muensterland.de/md-fw-dl/shapes/', help='Path of shapefiles (can be local folder or remote URL).')
|
||||||
parser.add_argument('-t', '--targets', nargs='+', required=True, help='List of targets which should be proceeded. Example: -t citya cityb ...')
|
parser.add_argument('-t', '--targets', nargs='+', required=True, help='List of targets which should be proceeded. Example: -t citya cityb ...')
|
||||||
parser.add_argument('-o', '--out-file', default='./webserver-configuration', required=False, help='Filename where the generated Output should stored.')
|
parser.add_argument('-o', '--out-file', default='./webserver-configuration', required=False, help='Filename where the generated Output should stored.')
|
||||||
|
|
74
parser/Hopglass.py
Normal file
74
parser/Hopglass.py
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
from parser.JsonParser import JsonParser
|
||||||
|
import collections
|
||||||
|
import json
|
||||||
|
|
||||||
|
class Hopglass(JsonParser):
|
||||||
|
def __init__(self, filePath):
|
||||||
|
super().__init__(filePath)
|
||||||
|
self.ifIDs = {}
|
||||||
|
self.links = collections.defaultdict(dict)
|
||||||
|
self.nodes = {}
|
||||||
|
self.__aggregateData__()
|
||||||
|
#print(self.ifIDs)
|
||||||
|
for k, v in self.links.items():
|
||||||
|
print(k,v,'\n')
|
||||||
|
|
||||||
|
def __aggregateData__(self):
|
||||||
|
for nodeID, nodeData in self.__jsonData__.items():
|
||||||
|
|
||||||
|
# let pass nodes that provide all required informations only
|
||||||
|
if not set(('nodeinfo', 'neighbours')) <= set(nodeData):
|
||||||
|
continue
|
||||||
|
|
||||||
|
nodeInfo = nodeData['nodeinfo']
|
||||||
|
neighbours = nodeData['neighbours']
|
||||||
|
|
||||||
|
if not 'batadv' in neighbours:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if not 'mesh' in nodeInfo.get('network', {}):
|
||||||
|
continue
|
||||||
|
|
||||||
|
for batID, batVal in nodeInfo['network']['mesh'].items():
|
||||||
|
if not 'interfaces' in batVal:
|
||||||
|
continue
|
||||||
|
for ifType, ifVal in batVal['interfaces'].items():
|
||||||
|
for mac in ifVal:
|
||||||
|
self.ifIDs[mac] = {
|
||||||
|
'type' : ifType,
|
||||||
|
'nodeID' : nodeID
|
||||||
|
}
|
||||||
|
|
||||||
|
self.nodes[nodeID] = nodeData
|
||||||
|
|
||||||
|
for nodeID, nodeData in self.nodes.items():
|
||||||
|
for iname, ivalue in nodeData['neighbours']['batadv'].items():
|
||||||
|
if 'neighbours' not in ivalue:
|
||||||
|
continue
|
||||||
|
if not iname in self.ifIDs:
|
||||||
|
continue
|
||||||
|
for nname, nvalue in ivalue['neighbours'].items():
|
||||||
|
if nname not in self.ifIDs:
|
||||||
|
continue
|
||||||
|
nifID = self.ifIDs[nname]['nodeID']
|
||||||
|
partID = (nodeID, nifID) if nodeID > nifID else (nifID, nodeID)
|
||||||
|
linkID = (iname, nname) if iname > nname else (nname, iname)
|
||||||
|
|
||||||
|
linkNode = {
|
||||||
|
'nodeID' : nodeID,
|
||||||
|
'type' : self.ifIDs[iname]['type'],
|
||||||
|
'tq' : nvalue['tq']
|
||||||
|
}
|
||||||
|
|
||||||
|
if linkID in self.links[partID]:
|
||||||
|
self.links[partID][linkID].append(linkNode)
|
||||||
|
else:
|
||||||
|
self.links[partID][linkID] = [linkNode]
|
||||||
|
|
||||||
|
|
||||||
|
def getLinksForNodeID(self, nodeID):
|
||||||
|
links = []
|
||||||
|
for link in self.links:
|
||||||
|
if link['target']['node_id'] == nodeID or link['source']['node_id'] == nodeID:
|
||||||
|
links.append(link)
|
||||||
|
return links
|
|
@ -9,7 +9,7 @@ class JsonParser(object):
|
||||||
def __getFile__(self, fileName):
|
def __getFile__(self, fileName):
|
||||||
if fileName.startswith('https://') or fileName.startswith('http://'):
|
if fileName.startswith('https://') or fileName.startswith('http://'):
|
||||||
if self.printStatus:
|
if self.printStatus:
|
||||||
print('Download', fileName.rsplit('/', 1)[1] , 'from URL:', fileName)
|
print('Download', fileName, 'from URL:', fileName)
|
||||||
resource = urllib.request.urlopen(fileName)
|
resource = urllib.request.urlopen(fileName)
|
||||||
try:
|
try:
|
||||||
data = json.loads(resource.read().decode('utf-8'))
|
data = json.loads(resource.read().decode('utf-8'))
|
||||||
|
@ -19,7 +19,7 @@ class JsonParser(object):
|
||||||
resource.close()
|
resource.close()
|
||||||
else:
|
else:
|
||||||
if self.printStatus:
|
if self.printStatus:
|
||||||
print('Open', fileName.rsplit('/', 1)[1] , 'from file:', fileName)
|
print('Open', fileName, 'from file:', fileName)
|
||||||
with open(fileName) as data_file:
|
with open(fileName) as data_file:
|
||||||
try:
|
try:
|
||||||
data = json.load(data_file)
|
data = json.load(data_file)
|
||||||
|
|
1
requirements.txt
Normal file
1
requirements.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
shapely
|
Loading…
Reference in a new issue