__init__.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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. __all__ = [
  7. 'AlfredParser', 'BatmanParser',
  8. 'DashingClient', 'GraphitePush',
  9. 'dict_merge', 'merge_alfred_batman', 'mac2id' ]
  10. def mac2id(mac):
  11. return mac.lower().replace(':', '')
  12. def dict_merge(a, b):
  13. '''recursively merges dict's. not just simple a['key'] = b['key'], if
  14. both a and bhave a key who's value is a dict then dict_merge is called
  15. on both values and the result stored in the returned dictionary.'''
  16. if not isinstance(b, dict):
  17. return b
  18. result = deepcopy(a)
  19. for k, v in b.iteritems():
  20. if k in result and isinstance(result[k], dict):
  21. result[k] = dict_merge(result[k], v)
  22. else:
  23. result[k] = deepcopy(v)
  24. return result
  25. def merge_alfred_batman(alfreddata, batmandata):
  26. merged = {}
  27. for nodeid in alfreddata:
  28. nodeinfo = alfreddata[nodeid]
  29. candidates = set()
  30. candidates.add(nodeid)
  31. if 'mac' in nodeinfo: candidates.add(mac2id(nodeinfo['mac']))
  32. if 'macs' in nodeinfo:
  33. for mac in nodeinfo['macs']:
  34. candidates.add(mac2id(mac))
  35. for candidate in candidates:
  36. if candidate in batmandata:
  37. nodeinfo = dict_merge(nodeinfo, batmandata[candidate])
  38. merged[nodeid] = nodeinfo
  39. return merged