diff options
author | Alexandre Flament <alex@al-f.net> | 2022-11-11 21:58:32 +0100 |
---|---|---|
committer | Alexandre Flament <alex@al-f.net> | 2022-12-10 09:26:38 +0100 |
commit | b971167ced9623c038188ae7bf5a8085147bc35d (patch) | |
tree | d82d7fb4bad9d67b048bce8985cc4a3f09268503 /searx/redisdb.py | |
parent | 34e260f88f561cf26454fe72a10a3a403faf2ff3 (diff) | |
download | searxng-b971167ced9623c038188ae7bf5a8085147bc35d.tar.gz searxng-b971167ced9623c038188ae7bf5a8085147bc35d.zip |
move searx.shared.redisdb to searx.redisdb
Diffstat (limited to 'searx/redisdb.py')
-rw-r--r-- | searx/redisdb.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/searx/redisdb.py b/searx/redisdb.py new file mode 100644 index 000000000..0544d697f --- /dev/null +++ b/searx/redisdb.py @@ -0,0 +1,70 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +# lint: pylint +"""Implementation of the redis client (redis-py_). + +.. _redis-py: https://github.com/redis/redis-py + +This implementation uses the :ref:`settings redis` setup from ``settings.yml``. +A redis DB connect can be tested by:: + + >>> from searx import redisdb + >>> redisdb.initialize() + True + >>> db = redisdb.client() + >>> db.set("foo", "bar") + True + >>> db.get("foo") + b'bar' + >>> + +""" + +import os +import pwd +import logging +import redis +from searx import get_setting + + +OLD_REDIS_URL_DEFAULT_URL = 'unix:///usr/local/searxng-redis/run/redis.sock?db=0' +"""This was the default Redis URL in settings.yml.""" + +_CLIENT = None +logger = logging.getLogger(__name__) + + +def client() -> redis.Redis: + return _CLIENT + + +def initialize(): + global _CLIENT # pylint: disable=global-statement + redis_url = get_setting('redis.url') + if not redis_url: + return False + try: + # create a client, but no connection is done + _CLIENT = redis.Redis.from_url(redis_url) + + # log the parameters as seen by the redis lib, without the password + kwargs = _CLIENT.get_connection_kwargs().copy() + kwargs.pop('password', None) + kwargs = ' '.join([f'{k}={v!r}' for k, v in kwargs.items()]) + logger.info("connecting to Redis %s", kwargs) + + # check the connection + _CLIENT.ping() + + # no error: the redis connection is working + logger.info("connected to Redis") + return True + except redis.exceptions.RedisError as e: + _CLIENT = None + _pw = pwd.getpwuid(os.getuid()) + logger.exception("[%s (%s)] can't connect redis DB ...", _pw.pw_name, _pw.pw_uid) + if redis_url == OLD_REDIS_URL_DEFAULT_URL and isinstance(e, redis.exceptions.ConnectionError): + logger.info( + "You can safely ignore the above Redis error if you don't use Redis. " + "You can remove this error by setting redis.url to false in your settings.yml." + ) + return False |