config_maker.py
222 lines
| 10.8 KiB
| text/x-python
|
PythonLexer
r5325 | # Copyright (C) 2010-2023 RhodeCode GmbH | |||
# | ||||
# This program is free software: you can redistribute it and/or modify | ||||
# it under the terms of the GNU Affero General Public License, version 3 | ||||
# (only), as published by the Free Software Foundation. | ||||
# | ||||
# This program 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 General Public License for more details. | ||||
# | ||||
# You should have received a copy of the GNU Affero General Public License | ||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
# | ||||
# This program is dual-licensed. If you wish to learn more about the | ||||
# RhodeCode Enterprise Edition, including its added features, Support services, | ||||
# and proprietary license terms, please see https://rhodecode.com/licenses/ | ||||
import os | ||||
import tempfile | ||||
import logging | ||||
from pyramid.settings import asbool | ||||
from rhodecode.config.settings_maker import SettingsMaker | ||||
from rhodecode.config import utils as config_utils | ||||
log = logging.getLogger(__name__) | ||||
def sanitize_settings_and_apply_defaults(global_config, settings): | ||||
""" | ||||
Applies settings defaults and does all type conversion. | ||||
We would move all settings parsing and preparation into this place, so that | ||||
we have only one place left which deals with this part. The remaining parts | ||||
of the application would start to rely fully on well-prepared settings. | ||||
This piece would later be split up per topic to avoid a big fat monster | ||||
function. | ||||
""" | ||||
jn = os.path.join | ||||
global_settings_maker = SettingsMaker(global_config) | ||||
global_settings_maker.make_setting('debug', default=False, parser='bool') | ||||
debug_enabled = asbool(global_config.get('debug')) | ||||
settings_maker = SettingsMaker(settings) | ||||
settings_maker.make_setting( | ||||
'logging.autoconfigure', | ||||
default=False, | ||||
parser='bool') | ||||
logging_conf = jn(os.path.dirname(global_config.get('__file__')), 'logging.ini') | ||||
settings_maker.enable_logging(logging_conf, level='INFO' if debug_enabled else 'DEBUG') | ||||
# Default includes, possible to change as a user | ||||
pyramid_includes = settings_maker.make_setting('pyramid.includes', [], parser='list:newline') | ||||
log.debug( | ||||
"Using the following pyramid.includes: %s", | ||||
pyramid_includes) | ||||
settings_maker.make_setting('rhodecode.edition', 'Community Edition') | ||||
settings_maker.make_setting('rhodecode.edition_id', 'CE') | ||||
if 'mako.default_filters' not in settings: | ||||
# set custom default filters if we don't have it defined | ||||
settings['mako.imports'] = 'from rhodecode.lib.base import h_filter' | ||||
settings['mako.default_filters'] = 'h_filter' | ||||
if 'mako.directories' not in settings: | ||||
mako_directories = settings.setdefault('mako.directories', [ | ||||
# Base templates of the original application | ||||
'rhodecode:templates', | ||||
]) | ||||
log.debug( | ||||
"Using the following Mako template directories: %s", | ||||
mako_directories) | ||||
# NOTE(marcink): fix redis requirement for schema of connection since 3.X | ||||
if 'beaker.session.type' in settings and settings['beaker.session.type'] == 'ext:redis': | ||||
raw_url = settings['beaker.session.url'] | ||||
if not raw_url.startswith(('redis://', 'rediss://', 'unix://')): | ||||
settings['beaker.session.url'] = 'redis://' + raw_url | ||||
settings_maker.make_setting('__file__', global_config.get('__file__')) | ||||
# TODO: johbo: Re-think this, usually the call to config.include | ||||
# should allow to pass in a prefix. | ||||
settings_maker.make_setting('rhodecode.api.url', '/_admin/api') | ||||
# Sanitize generic settings. | ||||
settings_maker.make_setting('default_encoding', 'UTF-8', parser='list') | ||||
settings_maker.make_setting('gzip_responses', False, parser='bool') | ||||
r5357 | settings_maker.make_setting('startup.import_repos', 'false', parser='bool') | |||
r5325 | ||||
# statsd | ||||
settings_maker.make_setting('statsd.enabled', False, parser='bool') | ||||
settings_maker.make_setting('statsd.statsd_host', 'statsd-exporter', parser='string') | ||||
settings_maker.make_setting('statsd.statsd_port', 9125, parser='int') | ||||
settings_maker.make_setting('statsd.statsd_prefix', '') | ||||
settings_maker.make_setting('statsd.statsd_ipv6', False, parser='bool') | ||||
settings_maker.make_setting('vcs.svn.compatible_version', '') | ||||
r5357 | settings_maker.make_setting('vcs.svn.proxy.enabled', True, parser='bool') | |||
settings_maker.make_setting('vcs.svn.proxy.host', 'http://svn:8090', parser='string') | ||||
r5325 | settings_maker.make_setting('vcs.hooks.protocol', 'http') | |||
settings_maker.make_setting('vcs.hooks.host', '*') | ||||
settings_maker.make_setting('vcs.scm_app_implementation', 'http') | ||||
settings_maker.make_setting('vcs.server', '') | ||||
settings_maker.make_setting('vcs.server.protocol', 'http') | ||||
settings_maker.make_setting('vcs.server.enable', 'true', parser='bool') | ||||
settings_maker.make_setting('vcs.hooks.direct_calls', 'false', parser='bool') | ||||
settings_maker.make_setting('vcs.start_server', 'false', parser='bool') | ||||
settings_maker.make_setting('vcs.backends', 'hg, git, svn', parser='list') | ||||
settings_maker.make_setting('vcs.connection_timeout', 3600, parser='int') | ||||
settings_maker.make_setting('vcs.methods.cache', True, parser='bool') | ||||
r5356 | # repo_store path | |||
settings_maker.make_setting('repo_store.path', '/var/opt/rhodecode_repo_store') | ||||
r5325 | # Support legacy values of vcs.scm_app_implementation. Legacy | |||
# configurations may use 'rhodecode.lib.middleware.utils.scm_app_http', or | ||||
# disabled since 4.13 'vcsserver.scm_app' which is now mapped to 'http'. | ||||
scm_app_impl = settings['vcs.scm_app_implementation'] | ||||
if scm_app_impl in ['rhodecode.lib.middleware.utils.scm_app_http', 'vcsserver.scm_app']: | ||||
settings['vcs.scm_app_implementation'] = 'http' | ||||
settings_maker.make_setting('appenlight', False, parser='bool') | ||||
temp_store = tempfile.gettempdir() | ||||
tmp_cache_dir = jn(temp_store, 'rc_cache') | ||||
# save default, cache dir, and use it for all backends later. | ||||
default_cache_dir = settings_maker.make_setting( | ||||
'cache_dir', | ||||
default=tmp_cache_dir, default_when_empty=True, | ||||
parser='dir:ensured') | ||||
# exception store cache | ||||
settings_maker.make_setting( | ||||
'exception_tracker.store_path', | ||||
default=jn(default_cache_dir, 'exc_store'), default_when_empty=True, | ||||
parser='dir:ensured' | ||||
) | ||||
settings_maker.make_setting( | ||||
'celerybeat-schedule.path', | ||||
default=jn(default_cache_dir, 'celerybeat_schedule', 'celerybeat-schedule.db'), default_when_empty=True, | ||||
parser='file:ensured' | ||||
) | ||||
settings_maker.make_setting('exception_tracker.send_email', False, parser='bool') | ||||
settings_maker.make_setting('exception_tracker.email_prefix', '[RHODECODE ERROR]', default_when_empty=True) | ||||
# sessions, ensure file since no-value is memory | ||||
settings_maker.make_setting('beaker.session.type', 'file') | ||||
settings_maker.make_setting('beaker.session.data_dir', jn(default_cache_dir, 'session_data')) | ||||
# cache_general | ||||
settings_maker.make_setting('rc_cache.cache_general.backend', 'dogpile.cache.rc.file_namespace') | ||||
settings_maker.make_setting('rc_cache.cache_general.expiration_time', 60 * 60 * 12, parser='int') | ||||
settings_maker.make_setting('rc_cache.cache_general.arguments.filename', jn(default_cache_dir, 'rhodecode_cache_general.db')) | ||||
# cache_perms | ||||
settings_maker.make_setting('rc_cache.cache_perms.backend', 'dogpile.cache.rc.file_namespace') | ||||
settings_maker.make_setting('rc_cache.cache_perms.expiration_time', 60 * 60, parser='int') | ||||
settings_maker.make_setting('rc_cache.cache_perms.arguments.filename', jn(default_cache_dir, 'rhodecode_cache_perms_db')) | ||||
# cache_repo | ||||
settings_maker.make_setting('rc_cache.cache_repo.backend', 'dogpile.cache.rc.file_namespace') | ||||
settings_maker.make_setting('rc_cache.cache_repo.expiration_time', 60 * 60 * 24 * 30, parser='int') | ||||
settings_maker.make_setting('rc_cache.cache_repo.arguments.filename', jn(default_cache_dir, 'rhodecode_cache_repo_db')) | ||||
# cache_license | ||||
settings_maker.make_setting('rc_cache.cache_license.backend', 'dogpile.cache.rc.file_namespace') | ||||
settings_maker.make_setting('rc_cache.cache_license.expiration_time', 60 * 5, parser='int') | ||||
settings_maker.make_setting('rc_cache.cache_license.arguments.filename', jn(default_cache_dir, 'rhodecode_cache_license_db')) | ||||
# cache_repo_longterm memory, 96H | ||||
settings_maker.make_setting('rc_cache.cache_repo_longterm.backend', 'dogpile.cache.rc.memory_lru') | ||||
settings_maker.make_setting('rc_cache.cache_repo_longterm.expiration_time', 345600, parser='int') | ||||
settings_maker.make_setting('rc_cache.cache_repo_longterm.max_size', 10000, parser='int') | ||||
# sql_cache_short | ||||
settings_maker.make_setting('rc_cache.sql_cache_short.backend', 'dogpile.cache.rc.memory_lru') | ||||
settings_maker.make_setting('rc_cache.sql_cache_short.expiration_time', 30, parser='int') | ||||
settings_maker.make_setting('rc_cache.sql_cache_short.max_size', 10000, parser='int') | ||||
# archive_cache | ||||
r5420 | settings_maker.make_setting('archive_cache.locking.url', 'redis://redis:6379/1') | |||
settings_maker.make_setting('archive_cache.backend.type', 'filesystem') | ||||
settings_maker.make_setting('archive_cache.filesystem.store_dir', jn(default_cache_dir, 'archive_cache'), default_when_empty=True,) | ||||
r5433 | settings_maker.make_setting('archive_cache.filesystem.cache_shards', 8, parser='int') | |||
r5420 | settings_maker.make_setting('archive_cache.filesystem.cache_size_gb', 10, parser='float') | |||
settings_maker.make_setting('archive_cache.filesystem.eviction_policy', 'least-recently-stored') | ||||
r5325 | ||||
r5433 | settings_maker.make_setting('archive_cache.filesystem.retry', False, parser='bool') | |||
settings_maker.make_setting('archive_cache.filesystem.retry_backoff', 1, parser='int') | ||||
settings_maker.make_setting('archive_cache.filesystem.retry_attempts', 10, parser='int') | ||||
settings_maker.make_setting('archive_cache.objectstore.url', jn(default_cache_dir, 'archive_cache'), default_when_empty=True,) | ||||
settings_maker.make_setting('archive_cache.objectstore.key', '') | ||||
settings_maker.make_setting('archive_cache.objectstore.secret', '') | ||||
r5447 | settings_maker.make_setting('archive_cache.objectstore.bucket', 'rhodecode-archive-cache', default_when_empty=True,) | |||
r5433 | settings_maker.make_setting('archive_cache.objectstore.bucket_shards', 8, parser='int') | |||
settings_maker.make_setting('archive_cache.objectstore.cache_size_gb', 10, parser='float') | ||||
settings_maker.make_setting('archive_cache.objectstore.eviction_policy', 'least-recently-stored') | ||||
settings_maker.make_setting('archive_cache.objectstore.retry', False, parser='bool') | ||||
settings_maker.make_setting('archive_cache.objectstore.retry_backoff', 1, parser='int') | ||||
settings_maker.make_setting('archive_cache.objectstore.retry_attempts', 10, parser='int') | ||||
r5325 | settings_maker.env_expand() | |||
# configure instance id | ||||
config_utils.set_instance_id(settings) | ||||
return settings | ||||