| 
									
										
										
										
											2022-01-03 17:43:20 +01:00
										 |  |  | # SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | """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:: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-11 21:58:32 +01:00
										 |  |  |   >>> from searx import redisdb | 
					
						
							|  |  |  |   >>> redisdb.initialize() | 
					
						
							| 
									
										
										
										
											2022-01-03 17:43:20 +01:00
										 |  |  |   True | 
					
						
							|  |  |  |   >>> db = redisdb.client() | 
					
						
							|  |  |  |   >>> db.set("foo", "bar") | 
					
						
							|  |  |  |   True | 
					
						
							|  |  |  |   >>> db.get("foo") | 
					
						
							|  |  |  |   b'bar' | 
					
						
							|  |  |  |   >>> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-27 18:43:14 +02:00
										 |  |  | import os | 
					
						
							|  |  |  | import pwd | 
					
						
							| 
									
										
										
										
											2022-01-03 17:43:20 +01:00
										 |  |  | import logging | 
					
						
							| 
									
										
										
										
											2022-01-17 17:19:41 +01:00
										 |  |  | import redis | 
					
						
							| 
									
										
										
										
											2022-01-03 17:43:20 +01:00
										 |  |  | from searx import get_setting | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-27 18:43:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-14 15:27:07 +02:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2022-11-11 21:58:32 +01:00
										 |  |  | logger = logging.getLogger(__name__) | 
					
						
							| 
									
										
										
										
											2022-01-03 17:43:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-15 18:38:32 +02:00
										 |  |  | def client() -> redis.Redis: | 
					
						
							| 
									
										
										
										
											2022-10-14 15:27:07 +02:00
										 |  |  |     return _CLIENT | 
					
						
							| 
									
										
										
										
											2022-01-03 17:43:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-15 18:38:32 +02:00
										 |  |  | def initialize(): | 
					
						
							| 
									
										
										
										
											2022-10-14 15:27:07 +02:00
										 |  |  |     global _CLIENT  # pylint: disable=global-statement | 
					
						
							|  |  |  |     redis_url = get_setting('redis.url') | 
					
						
							| 
									
										
										
										
											2022-11-07 22:20:48 +01:00
										 |  |  |     if not redis_url: | 
					
						
							|  |  |  |         return False | 
					
						
							| 
									
										
										
										
											2022-01-03 17:43:20 +01:00
										 |  |  |     try: | 
					
						
							| 
									
										
										
										
											2022-11-07 22:20:48 +01:00
										 |  |  |         # 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 | 
					
						
							| 
									
										
										
										
											2022-11-29 13:15:18 +01:00
										 |  |  |         kwargs = _CLIENT.get_connection_kwargs().copy() | 
					
						
							| 
									
										
										
										
											2022-11-07 22:20:48 +01:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											2022-05-27 18:43:14 +02:00
										 |  |  |         _pw = pwd.getpwuid(os.getuid()) | 
					
						
							| 
									
										
										
										
											2022-10-14 15:27:07 +02:00
										 |  |  |         logger.exception("[%s (%s)] can't connect redis DB ...", _pw.pw_name, _pw.pw_uid) | 
					
						
							| 
									
										
										
										
											2022-11-07 22:20:48 +01:00
										 |  |  |         if redis_url == OLD_REDIS_URL_DEFAULT_URL and isinstance(e, redis.exceptions.ConnectionError): | 
					
						
							| 
									
										
										
										
											2022-10-14 15:27:07 +02:00
										 |  |  |             logger.info( | 
					
						
							| 
									
										
										
										
											2022-11-07 22:20:48 +01:00
										 |  |  |                 "You can safely ignore the above Redis error if you don't use Redis. " | 
					
						
							| 
									
										
										
										
											2022-10-14 15:27:07 +02:00
										 |  |  |                 "You can remove this error by setting redis.url to false in your settings.yml." | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |     return False |