Browse Source

merge ALFRED and BATMAN data

Helge Jung 9 years ago
parent
commit
4b8c193794
3 changed files with 30 additions and 4 deletions
  1. 22 1
      ffstatus/__init__.py
  2. 7 2
      ffstatus/alfred.py
  3. 1 1
      status-daemon.py

+ 22 - 1
ffstatus/__init__.py

@@ -8,7 +8,10 @@ from .graphite import GraphitePush
 __all__ = [
 	'AlfredParser', 'BatmanParser',
 	'DashingClient', 'GraphitePush',
-	'dict_merge' ]
+	'dict_merge', 'merge_alfred_batman', 'mac2id' ]
+
+def mac2id(mac):
+	return mac.lower().replace(':', '')
 
 def dict_merge(a, b):
     '''recursively merges dict's. not just simple a['key'] = b['key'], if
@@ -24,4 +27,22 @@ def dict_merge(a, b):
             result[k] = deepcopy(v)
     return result
 
+def merge_alfred_batman(alfreddata, batmandata):
+	merged = {}
+	for nodeid in alfreddata:
+		nodeinfo = alfreddata[nodeid]
+		candidates = set()
+		candidates.add(nodeid)
+		if 'mac' in nodeinfo: candidates.add(mac2id(nodeinfo['mac']))
+		if 'macs' in nodeinfo:
+			for mac in nodeinfo['macs']:
+				candidates.add(mac2id(mac))
+
+		for candidate in candidates:
+			if candidate in batmandata:
+				nodeinfo = dict_merge(nodeinfo, batmandata[candidate])
+
+		merged[nodeid] = nodeinfo
+
+	return merged
 

+ 7 - 2
ffstatus/alfred.py

@@ -58,8 +58,13 @@ class AlfredParser:
 
 			nodestatic = alfredinfo['static']
 			if 'hostname' in nodestatic: nodeinfo['hostname'] = nodestatic['hostname']
-			if 'network' in nodestatic and 'mac' in nodestatic['network']:
-				nodeinfo['mac']= nodestatic['network']['mac']
+			if 'network' in nodestatic:
+				if 'mac' in nodestatic['network']:
+					nodeinfo['mac'] = nodestatic['network']['mac']
+				if 'mesh_interfaces' in nodestatic['network']:
+					nodeinfo['macs'] = [ x for x in nodestatic['network']['mesh_interfaces'] ]
+				else:
+					nodeinfo['macs'] = []
 			if 'software' in nodestatic:
 				sw = nodestatic['software']
 

+ 1 - 1
status-daemon.py

@@ -54,7 +54,7 @@ with daemon_context:
 			logger.debug('Step 1/3: Fetching data ...')
 			alfreddata = a.fetch()
 			batmandata = b.fetch()
-			newdata = dict_merge(alfreddata, batmandata)
+			newdata = merge_alfred_batman(alfreddata, batmandata)
 			logger.info('Fetched data: {0} ALFRED with {1} BATMAN makes {2} total'.format(len(alfreddata), len(batmandata), len(newdata)))
 
 			logger.debug('Step 2/3: Pushing update data ...')