diff --git a/LibreNMS/__init__.py b/LibreNMS/__init__.py index 0d4905fdff..691f943c0c 100644 --- a/LibreNMS/__init__.py +++ b/LibreNMS/__init__.py @@ -231,8 +231,16 @@ class ThreadingLock(Lock): class RedisLock(Lock): def __init__(self, namespace='lock', **redis_kwargs): import redis + from redis.sentinel import Sentinel redis_kwargs['decode_responses'] = True - self._redis = redis.Redis(**redis_kwargs) + if redis_kwargs.get('sentinel') and redis_kwargs.get('sentinel_service'): + sentinels = [tuple(l.split(':')) for l in redis_kwargs.pop('sentinel').split(',')] + sentinel_service = redis_kwargs.pop('sentinel_service') + kwargs = {k: v for k, v in redis_kwargs.items() if k in ["decode_responses", "password", "db"]} + self._redis = Sentinel(sentinels, **kwargs).master_for(sentinel_service) + else: + kwargs = {k: v for k, v in redis_kwargs.items() if "sentinel" not in k} + self._redis = redis.Redis(**kwargs) self._redis.ping() self._namespace = namespace @@ -284,8 +292,16 @@ class RedisLock(Lock): class RedisUniqueQueue(object): def __init__(self, name, namespace='queue', **redis_kwargs): import redis + from redis.sentinel import Sentinel redis_kwargs['decode_responses'] = True - self._redis = redis.Redis(**redis_kwargs) + if redis_kwargs.get('sentinel') and redis_kwargs.get('sentinel_service'): + sentinels = [tuple(l.split(':')) for l in redis_kwargs.pop('sentinel').split(',')] + sentinel_service = redis_kwargs.pop('sentinel_service') + kwargs = {k: v for k, v in redis_kwargs.items() if k in ["decode_responses", "password", "db"]} + self._redis = Sentinel(sentinels, **kwargs).master_for(sentinel_service) + else: + kwargs = {k: v for k, v in redis_kwargs.items() if "sentinel" not in k} + self._redis = redis.Redis(**kwargs) self._redis.ping() self.key = "{}:{}".format(namespace, name) diff --git a/LibreNMS/queuemanager.py b/LibreNMS/queuemanager.py index 2ca0cbb5fc..c6f1b9a4c5 100644 --- a/LibreNMS/queuemanager.py +++ b/LibreNMS/queuemanager.py @@ -165,8 +165,10 @@ class QueueManager: port=self.config.redis_port, db=self.config.redis_db, password=self.config.redis_pass, - unix_socket_path=self.config.redis_socket - ) + unix_socket_path=self.config.redis_socket, + sentinel=self.config.redis_sentinel, + sentinel_service=self.config.redis_sentinel_service) + except ImportError: if self.config.distributed: critical("ERROR: Redis connection required for distributed polling") diff --git a/LibreNMS/service.py b/LibreNMS/service.py index 93e6f23c4b..6a42e4b8a8 100644 --- a/LibreNMS/service.py +++ b/LibreNMS/service.py @@ -71,6 +71,8 @@ class ServiceConfig: redis_db = 0 redis_pass = None redis_socket = None + redis_sentinel = None + redis_sentinel_service = None db_host = 'localhost' db_port = 0 @@ -122,6 +124,10 @@ class ServiceConfig: self.redis_pass = os.getenv('REDIS_PASSWORD', config.get('redis_pass', ServiceConfig.redis_pass)) self.redis_port = int(os.getenv('REDIS_PORT', config.get('redis_port', ServiceConfig.redis_port))) self.redis_socket = os.getenv('REDIS_SOCKET', config.get('redis_socket', ServiceConfig.redis_socket)) + self.redis_sentinel = os.getenv('REDIS_SENTINEL', config.get('redis_sentinel', ServiceConfig.redis_sentinel)) + self.redis_sentinel_service = os.getenv('REDIS_SENTINEL_SERVICE', + config.get('redis_sentinel_service', + ServiceConfig.redis_sentinel_service)) self.db_host = os.getenv('DB_HOST', config.get('db_host', ServiceConfig.db_host)) self.db_name = os.getenv('DB_DATABASE', config.get('db_name', ServiceConfig.db_name)) @@ -363,7 +369,9 @@ class Service: port=self.config.redis_port, db=self.config.redis_db, password=self.config.redis_pass, - unix_socket_path=self.config.redis_socket) + unix_socket_path=self.config.redis_socket, + sentinel=self.config.redis_sentinel, + sentinel_service=self.config.redis_sentinel_service) except ImportError: if self.config.distributed: critical("ERROR: Redis connection required for distributed polling") diff --git a/doc/Extensions/Dispatcher-Service.md b/doc/Extensions/Dispatcher-Service.md index 5a1b691820..00b72d5fc1 100644 --- a/doc/Extensions/Dispatcher-Service.md +++ b/doc/Extensions/Dispatcher-Service.md @@ -82,9 +82,13 @@ Once you have your Redis database set up, configure it in the .env file on each ```dotenv REDIS_HOST=127.0.0.1 -#REDIS_DB=0 +REDIS_PORT=6379 +# OR +REDIS_SENTINEL=192.0.2.1:26379 +REDIS_SENTINEL_SERVICE=myservice + +REDIS_DB=0 #REDIS_PASSWORD= -#REDIS_PORT=6379 ``` ## Basic Configuration