Wokring on support for hopglass server (raw.json).

This commit is contained in:
Simon Wüllhorst 2017-04-23 22:57:07 +02:00
parent cac097b242
commit 666cd20c04
4 changed files with 85 additions and 8 deletions

View file

@ -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
View 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

View file

@ -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
View file

@ -0,0 +1 @@
shapely