__init__.py 3.93 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
'''
searx is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

searx is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with searx. If not, see < http://www.gnu.org/licenses/ >.

(C) 2013- by Adam Tauber, <asciimoo@gmail.com>
'''

18
import certifi
Adam Tauber's avatar
Adam Tauber committed
19
import logging
20
from os import environ
21
from os.path import realpath, dirname, join, abspath, isfile
22
from io import open
23
from ssl import OPENSSL_VERSION_INFO, OPENSSL_VERSION
24
try:
Noémi Ványi's avatar
Noémi Ványi committed
25
    from yaml import safe_load
26 27 28 29 30
except:
    from sys import exit, stderr
    stderr.write('[E] install pyyaml\n')
    exit(2)

31
searx_dir = abspath(dirname(__file__))
32 33
engine_dir = dirname(realpath(__file__))

34 35 36 37 38 39 40

def check_settings_yml(file_name):
    if isfile(file_name):
        return file_name
    else:
        return None

41

42
# find location of settings.yml
43
if 'SEARX_SETTINGS_PATH' in environ:
44 45 46
    # if possible set path to settings using the
    # enviroment variable SEARX_SETTINGS_PATH
    settings_path = check_settings_yml(environ['SEARX_SETTINGS_PATH'])
47
else:
48 49 50 51 52
    # if not, get it from searx code base or last solution from /etc/searx
    settings_path = check_settings_yml(join(searx_dir, 'settings.yml')) or check_settings_yml('/etc/searx/settings.yml')

if not settings_path:
    raise Exception('settings.yml not found')
53

54
# load settings
55
with open(settings_path, 'r', encoding='utf-8') as settings_yaml:
Noémi Ványi's avatar
Noémi Ványi committed
56
    settings = safe_load(settings_yaml)
57

58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
'''
enable debug if
the environnement variable SEARX_DEBUG is 1 or true
(whatever the value in settings.yml)
or general.debug=True in settings.yml

disable debug if
the environnement variable SEARX_DEBUG is 0 or false
(whatever the value in settings.yml)
or general.debug=False in settings.yml
'''
searx_debug_env = environ.get('SEARX_DEBUG', '').lower()
if searx_debug_env == 'true' or searx_debug_env == '1':
    searx_debug = True
elif searx_debug_env == 'false' or searx_debug_env == '0':
    searx_debug = False
else:
    searx_debug = settings.get('general', {}).get('debug')

if searx_debug:
Adam Tauber's avatar
Adam Tauber committed
78 79 80 81
    logging.basicConfig(level=logging.DEBUG)
else:
    logging.basicConfig(level=logging.WARNING)

Nicolas Gelot's avatar
Nicolas Gelot committed
82 83 84 85 86 87 88 89
logger = logging.getLogger("searx")

if "GUNICORN_LOGGER" in environ:
    logger = logging.getLogger()
    gunicorn_logger = logging.getLogger("gunicorn.error")
    logger.handlers = gunicorn_logger.handlers
    logger.setLevel(environ.get("GUNICORN_LEVEL", "INFO"))

90
logger.debug('read configuration from %s', settings_path)
91 92 93
# Workaround for openssl versions <1.0.2
# https://github.com/certifi/python-certifi/issues/26
if OPENSSL_VERSION_INFO[0:3] < (1, 0, 2):
94 95
    if hasattr(certifi, 'old_where'):
        environ['REQUESTS_CA_BUNDLE'] = certifi.old_where()
96 97
    logger.warning('You are using an old openssl version({0}), please upgrade above 1.0.2!'.format(OPENSSL_VERSION))

Adam Tauber's avatar
Adam Tauber committed
98
logger.info('Initialisation done')
99 100 101

if 'SEARX_SECRET' in environ:
    settings['server']['secret_key'] = environ['SEARX_SECRET']
102 103
if 'SEARX_BIND_ADDRESS' in environ:
    settings['server']['bind_address'] = environ['SEARX_BIND_ADDRESS']
104 105 106 107
if 'SEARX_MORTY_URL' in environ:
    settings.setdefault('result_proxy', {})['url'] = environ['SEARX_MORTY_URL']
if 'SEARX_MORTY_KEY' in environ:
    settings.setdefault('result_proxy', {})['key'] = bytes(environ['SEARX_MORTY_KEY'], 'utf-8')
108 109 110 111
if 'SEARX_PROXY_HTTP' in environ:
    settings['outgoing'].setdefault('proxies', {})['http'] = environ['SEARX_PROXY_HTTP']
if 'SEARX_PROXY_HTTPS' in environ:
    settings['outgoing'].setdefault('proxies', {})['https'] = environ['SEARX_PROXY_HTTPS']
112 113
if 'SEARX_REDIS_HOST' in environ:
    settings['server']['redis_host'] = environ['SEARX_REDIS_HOST']