redisstorage.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import json
  4. import logging
  5. import redis
  6. from .basestorage import BaseStorage
  7. class RedisStorage(BaseStorage):
  8. """Redis-backed storage"""
  9. FIELDSUFFIX_TYPE = '__TYPE'
  10. def __init__(self,
  11. redis_host='127.0.0.1', redis_port=6379, redis_password=None):
  12. self.logger = logging.getLogger('RedisStorage')
  13. self.logger.debug('Connecting to REDIS database at %s on port %d.',
  14. redis_host, redis_port)
  15. self.db = redis.StrictRedis(host=redis_host, port=redis_port,
  16. password=redis_password)
  17. self.logger.info('Connected to REDIS database with %d entries.',
  18. self.db.dbsize())
  19. def save(self):
  20. self.db.save()
  21. def get_node(self, id):
  22. return self.get_node_data(id)
  23. def get_all_nodes_raw(self):
  24. keys = self.db.keys('node_*')
  25. nodes = {}
  26. for key in keys:
  27. node_id = key[5:]
  28. node = self.get_node_data(node_id)
  29. nodes[node_id] = node
  30. return nodes
  31. def set_node_data(self, key, data):
  32. thedata = {}
  33. for item in data:
  34. payload = data[item]
  35. if isinstance(payload, basestring):
  36. thedata[item] = data[item]
  37. thedata[item + self.FIELDSUFFIX_TYPE] = 'str'
  38. elif isinstance(payload, int):
  39. thedata[item] = str(data[item])
  40. thedata[item + self.FIELDSUFFIX_TYPE] = 'int'
  41. elif isinstance(payload, float):
  42. thedata[item] = str(data[item])
  43. thedata[item + self.FIELDSUFFIX_TYPE] = 'float'
  44. else:
  45. thedata[item] = json.dumps(data[item])
  46. thedata[item + self.FIELDSUFFIX_TYPE] = 'json'
  47. self.db.hmset('node_' + key, thedata)
  48. def get_node_data(self, key):
  49. node = {}
  50. thedata = self.db.hgetall('node_' + key)
  51. if thedata is None:
  52. return None
  53. for item in thedata:
  54. if item.endswith(self.FIELDSUFFIX_TYPE):
  55. continue
  56. fieldtype = thedata.get(item + self.FIELDSUFFIX_TYPE, 'str')
  57. payload = thedata[item]
  58. if fieldtype == 'json':
  59. node[item] = json.loads(payload)
  60. elif fieldtype == 'int':
  61. node[item] = int(payload)
  62. elif fieldtype == 'float':
  63. node[item] = float(payload)
  64. else:
  65. node[item] = payload
  66. return node
  67. def get_vpn_keys(self):
  68. keys = [key[4:] for key in self.db.keys('vpn_*')]
  69. return keys
  70. def get_vpn_item(self, key, create=False):
  71. self.check_vpn_key(key)
  72. rawdata = self.db.get('vpn_' + key)
  73. if rawdata is None:
  74. if not create:
  75. return None
  76. self.store_vpn_item(key, {'active': {}, 'last': {}})
  77. rawdata = self.db.get('vpn_' + key)
  78. data = json.loads(rawdata)
  79. return data
  80. def store_vpn_item(self, key, data):
  81. self.check_vpn_key(key)
  82. self.db.set('vpn_' + key, json.dumps(data))