6fc1423124
This commit makes Nodes special dicts that return None-like objects for inexistent keys, making it a dynamic attribute store. Also, it removes the D3MapBuilder and moves its logic to the Node and Link classes' newly introduced export() method. Only they need to be changed to populate the final nodes.json with more attributes.
89 lines
2.4 KiB
Python
Executable file
89 lines
2.4 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
import json
|
|
import fileinput
|
|
import argparse
|
|
import os
|
|
import datetime
|
|
|
|
from batman import batman
|
|
from alfred import alfred
|
|
from rrd import rrd
|
|
from nodedb import NodeDB
|
|
from json_encoder import CustomJSONEncoder
|
|
|
|
# Force encoding to UTF-8
|
|
import locale # Ensures that subsequent open()s
|
|
locale.getpreferredencoding = lambda _=None: 'UTF-8' # are UTF-8 encoded.
|
|
|
|
import sys
|
|
#sys.stdin = open('/dev/stdin', 'r')
|
|
#sys.stdout = open('/dev/stdout', 'w')
|
|
#sys.stderr = open('/dev/stderr', 'w')
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
parser.add_argument('-a', '--aliases',
|
|
help='read aliases from FILE',
|
|
action='append',
|
|
metavar='FILE')
|
|
|
|
parser.add_argument('-m', '--mesh', action='append',
|
|
help='batman mesh interface')
|
|
|
|
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)
|
|
|
|
args = parser.parse_args()
|
|
|
|
options = vars(args)
|
|
|
|
db = NodeDB()
|
|
if options['mesh']:
|
|
for mesh_interface in options['mesh']:
|
|
bm = batman(mesh_interface)
|
|
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(options['alfred']))
|
|
for gw in bm.gateway_list():
|
|
db.mark_gateways([gw['mac']])
|
|
|
|
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())
|
|
|
|
db.count_clients()
|
|
|
|
if options['obscure']:
|
|
db.obscure_clients()
|
|
|
|
scriptdir = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
exported = db.export()
|
|
exported['meta'] = {'timestamp': datetime.datetime.utcnow().replace(microsecond=0).isoformat()}
|
|
|
|
#Write nodes json
|
|
nodes_json = open(options['destination_directory'] + '/nodes.json.new','w')
|
|
json.dump(exported, nodes_json, cls=CustomJSONEncoder)
|
|
nodes_json.close()
|
|
|
|
#Move to destination
|
|
os.rename(options['destination_directory'] + '/nodes.json.new',options['destination_directory'] + '/nodes.json')
|
|
|
|
rrd = rrd(scriptdir + "/nodedb/", options['destination_directory'] + "/nodes")
|
|
rrd.update_database(db)
|
|
rrd.update_images()
|