85 lines
3.1 KiB
Python
85 lines
3.1 KiB
Python
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.gatewayMacs = []
|
|
self.gateways = []
|
|
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', 'statistics')) <= set(nodeData):
|
|
continue
|
|
|
|
nodeInfo = nodeData['nodeinfo']
|
|
neighbours = nodeData['neighbours']
|
|
statistics = nodeData['statistics']
|
|
|
|
if not 'batadv' in neighbours:
|
|
continue
|
|
|
|
if not 'mesh' in nodeInfo.get('network', {}):
|
|
continue
|
|
|
|
if statistics.get('gateway', False):
|
|
self.gatewayMacs.append(statistics['gateway'])
|
|
|
|
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():
|
|
nodeData['nodeinfo']['isGateway'] = False
|
|
nodeData['nodeinfo']['isOnline'] = True # Todo: implement detection
|
|
for iname, ivalue in nodeData['neighbours']['batadv'].items():
|
|
if 'neighbours' not in ivalue:
|
|
continue
|
|
if iname in self.gatewayMacs:
|
|
nodeData['nodeinfo']['isGateway'] = True
|
|
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
|