__init__.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from copy import deepcopy
  2. from .alfred import AlfredParser
  3. from .batman import BatmanParser
  4. from .dashing import DashingClient
  5. from .graphite import GraphitePush
  6. from .storage import Storage
  7. __all__ = [
  8. 'AlfredParser', 'BatmanParser',
  9. 'DashingClient', 'GraphitePush',
  10. 'Storage',
  11. 'dict_merge', 'merge_alfred_batman', 'mac2id' ]
  12. def mac2id(mac):
  13. return mac.lower().replace(':', '')
  14. def dict_merge(a, b):
  15. '''recursively merges dict's. not just simple a['key'] = b['key'], if
  16. both a and bhave a key who's value is a dict then dict_merge is called
  17. on both values and the result stored in the returned dictionary.'''
  18. if not isinstance(b, dict):
  19. return b
  20. result = deepcopy(a)
  21. for k, v in b.iteritems():
  22. if k in result and isinstance(result[k], dict):
  23. result[k] = dict_merge(result[k], v)
  24. else:
  25. result[k] = deepcopy(v)
  26. return result
  27. def merge_alfred_batman(alfreddata, batmandata):
  28. merged = {}
  29. for nodeid in alfreddata:
  30. nodeinfo = alfreddata[nodeid]
  31. candidates = set()
  32. candidates.add(nodeid)
  33. if 'mac' in nodeinfo: candidates.add(mac2id(nodeinfo['mac']))
  34. if 'macs' in nodeinfo:
  35. for mac in nodeinfo['macs']:
  36. candidates.add(mac2id(mac))
  37. for candidate in candidates:
  38. if candidate in batmandata:
  39. nodeinfo = dict_merge(nodeinfo, batmandata[candidate])
  40. merged[nodeid] = nodeinfo
  41. return merged