diff --git a/alfred.py b/alfred.py new file mode 100755 index 0000000..c0f9d13 --- /dev/null +++ b/alfred.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +import subprocess +import json + +class alfred: + def __init__(self,request_data_type = 158): + self.request_data_type = request_data_type + + def aliases(self): + output = subprocess.check_output(["alfred-json","-r",str(self.request_data_type),"-f","json"]) + alfred_data = json.loads(output.decode("utf-8")) + alias = {} + for mac,node in alfred_data.items(): + node_alias = {} + if 'location' in node: + node_alias['gps'] = str(node['location']['latitude']) + ' ' + str(node['location']['longitude']) + if 'hostname' in node: + node_alias['name'] = node['hostname'] + elif 'name' in node: + node_alias['name'] = node['name'] + if len(node_alias): + alias[mac] = node_alias + return alias + +if __name__ == "__main__": + ad = alfred() + al = ad.alias() + print(al) diff --git a/bat2nodes.py b/bat2nodes.py index af1f10f..15e0a39 100755 --- a/bat2nodes.py +++ b/bat2nodes.py @@ -6,6 +6,7 @@ import argparse import os from batman import batman +from alfred import alfred from rrd import rrd from nodedb import NodeDB from d3mapbuilder import D3MapBuilder @@ -32,6 +33,9 @@ parser.add_argument('-m', '--mesh', action='append', parser.add_argument('-o', '--obscure', action='store_true', help='obscure client macs') +parser.add_argument('-A', '--alfred', action='store_true', + help='retrieve aliases from alfred') + parser.add_argument('-d', '--destination-directory', action='store', help='destination directory for generated files',required=True) @@ -43,12 +47,12 @@ db = NodeDB() if options['mesh']: for mesh_interface in options['mesh']: bm = batman(mesh_interface) - db.parse_vis_data(bm.vis_data()) + db.parse_vis_data(bm.vis_data(options['alfred'])) for gw in bm.gateway_list(): db.mark_gateways(gw.mac) else: bm = batman() - db.parse_vis_data(bm.vis_data()) + db.parse_vis_data(bm.vis_data(options['alfred'])) for gw in bm.gateway_list(): db.mark_gateways([gw['mac']]) @@ -56,6 +60,10 @@ if options['aliases']: for aliases in options['aliases']: db.import_aliases(json.load(open(aliases))) +if options['alfred']: + af = alfred() + db.import_aliases(af.aliases()) + if options['obscure']: db.obscure_clients() diff --git a/batman.py b/batman.py index 5a19016..fac2a9e 100755 --- a/batman.py +++ b/batman.py @@ -9,11 +9,13 @@ class batman: def __init__(self, mesh_interface = "bat0"): self.mesh_interface = mesh_interface - def vis_data(self): - """ Parse "batctl -m vd json -n" into an array of dictionaries. - """ - output = subprocess.check_output(["batctl","-m",self.mesh_interface,"vd","json","-n"]) - lines = output.splitlines() + def vis_data(self,batadv_vis=False): + vds = self.vis_data_batctl_legacy() + if batadv_vis: + vds += self.vis_data_batadv_vis() + return vds + + def vis_data_helper(self,lines): vd = [] for line in lines: try: @@ -23,6 +25,23 @@ class batman: pass return vd + def vis_data_batctl_legacy(self): + """ Parse "batctl -m vd json -n" into an array of dictionaries. + """ + output = subprocess.check_output(["batctl","-m",self.mesh_interface,"vd","json","-n"]) + lines = output.splitlines() + vds = self.vis_data_helper(lines) + for vd in vds: + vd['legacy'] = True + return vds + + def vis_data_batadv_vis(self): + """ Parse "batadv-vis -i -f json" into an array of dictionaries. + """ + output = subprocess.check_output(["batadv-vis","-i",self.mesh_interface,"-f","json"]) + lines = output.splitlines() + return self.vis_data_helper(lines) + def gateway_list(self): """ Parse "batctl -m gwl -n" into an array of dictionaries. """ diff --git a/nodedb.py b/nodedb.py index 8685c81..9dd9849 100644 --- a/nodedb.py +++ b/nodedb.py @@ -52,6 +52,8 @@ class NodeDB: except: node = Node() node.flags['online'] = True + if 'legacy' in x: + node.flags['legacy'] = True self._nodes.append(node) node.add_mac(x['of']) @@ -65,6 +67,8 @@ class NodeDB: except: node = Node() node.flags['online'] = True + if 'legacy' in x: + node.flags['legacy'] = True node.add_mac(x['router']) self._nodes.append(node) diff --git a/rrd.py b/rrd.py index 26ff956..aaf64d7 100755 --- a/rrd.py +++ b/rrd.py @@ -118,7 +118,8 @@ class rrd: if not node.flags['client']: nodes[node.id] = node node.clients = 0; - clientCount -= 1 # XXX: might not be needed with gluon/alfred + if 'legacy' in node.flags and node.flags['legacy']: + clientCount -= 1 else: clientCount += 1 for link in db.get_links():