##// END OF EJS Templates
file-nodes: added streaming remote attributes for vcsserver....
file-nodes: added streaming remote attributes for vcsserver. - this will enable doing a streaming raw content or raw downloads of large files without transfering them over to enterprise for pack & repack using msgpack - msgpack has a limit of 4gb and generally pack+repack for 2gb is very slow

File last commit:

r3874:e2b5c030 default
r3895:2b1d7e0d default
Show More
middleware.py
750 lines | 25.0 KiB | text/x-python | PythonLexer
project: added all source files and assets
r1 # -*- coding: utf-8 -*-
docs: updated copyrights to 2019
r3363 # Copyright (C) 2010-2019 RhodeCode GmbH
project: added all source files and assets
r1 #
# 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/
configuration: Allows to use format style "{ENV_NAME}" placeholders in the configuration.
r2818 import os
exceptions: added new exception tracking capability....
r2907 import sys
project: added all source files and assets
r1 import logging
core: code refactor and cleanups for easier pylons porting.
r2321 import collections
caches: rewrite of auth/permission caches to dogpile.
r2845 import tempfile
application: re-organize imports for pyramid to prepare code for speedup optimization.
r3238 import time
project: added all source files and assets
r1
from paste.gzipper import make_gzip_middleware
security: update lastactivity when on audit logs....
r2930 import pyramid.events
pylons: remove pylons as dependency...
r2351 from pyramid.wsgi import wsgiapp
project: added all source files and assets
r1 from pyramid.authorization import ACLAuthorizationPolicy
from pyramid.config import Configurator
from pyramid.settings import asbool, aslist
Martin Bornhold
wsgi-stack: Use the pylons error handling middleware.
r945 from pyramid.httpexceptions import (
pylons: remove pylons as dependency...
r2351 HTTPException, HTTPError, HTTPInternalServerError, HTTPFound, HTTPNotFound)
Martin Bornhold
config: Move appenlight wrapping from pylons to pyramid.
r595 from pyramid.renderers import render_to_response
repo-summary: re-implemented summary view as pyramid....
r1785
dan
db: move Session.remove to outer wsgi layer and also add it...
r669 from rhodecode.model import meta
db: Move db setup code to seperate function.
r121 from rhodecode.config import patches
users: ported controllers from pylons into pyramid views.
r2114 from rhodecode.config import utils as config_utils
pylons: remove pylons as dependency...
r2351 from rhodecode.config.environment import load_pyramid_environment
repo-summary: re-implemented summary view as pyramid....
r1785
security: update lastactivity when on audit logs....
r2930 import rhodecode.events
pylons: remove pylons as dependency...
r2351 from rhodecode.lib.middleware.vcs import VCSMiddleware
debug: add new custom logging to track unique requests across systems.
r2794 from rhodecode.lib.request import Request
repo-summary: re-implemented summary view as pyramid....
r1785 from rhodecode.lib.vcs import VCSCommunicationError
from rhodecode.lib.exceptions import VCSServerUnavailable
project: added all source files and assets
r1 from rhodecode.lib.middleware.appenlight import wrap_in_appenlight_if_enabled
from rhodecode.lib.middleware.https_fixup import HttpsFixup
celery: celery 4.X support. Fixes #4169...
r2359 from rhodecode.lib.celerylib.loader import configure_celery
project: added all source files and assets
r1 from rhodecode.lib.plugins.utils import register_rhodecode_plugin
repo-summary: re-implemented summary view as pyramid....
r1785 from rhodecode.lib.utils2 import aslist as rhodecode_aslist, AttributeDict
exceptions: added new exception tracking capability....
r2907 from rhodecode.lib.exc_tracking import store_exception
core: added metadata for control upgrades.
r1392 from rhodecode.subscribers import (
core: remove writing of largeobject dirs on AppStartup....
r1680 scan_repositories_if_enabled, write_js_routes_if_enabled,
users: ported controllers from pylons into pyramid views.
r2114 write_metadata_if_needed, inject_app_settings)
project: added all source files and assets
r1
log = logging.getLogger(__name__)
pylons: remove pylons as dependency...
r2351 def is_http_error(response):
# error which should have traceback
return response.status_code > 499
project: added all source files and assets
r1
app: disconect auth plugin loading from authentication registry....
r3241 def should_load_all():
"""
Returns if all application components should be loaded. In some cases it's
desired to skip apps loading for faster shell script execution
"""
return True
project: added all source files and assets
r1 def make_pyramid_app(global_config, **settings):
"""
pylons: remove pylons as dependency...
r2351 Constructs the WSGI application based on Pyramid.
project: added all source files and assets
r1
Specials:
* The application can also be integrated like a plugin via the call to
`includeme`. This is accompanied with the other utility functions which
are called. Changing this should be done with great care to not break
cases when these fragments are assembled from another place.
"""
configuration: Allows to use format style "{ENV_NAME}" placeholders in the configuration.
r2818
# Allows to use format style "{ENV_NAME}" placeholders in the configuration. It
# will be replaced by the value of the environment variable "NAME" in this case.
application: re-organize imports for pyramid to prepare code for speedup optimization.
r3238 start_time = time.time()
application: add debug mode that switches logging to debug....
r3270 debug = asbool(global_config.get('debug'))
if debug:
enable_debug()
application: re-organize imports for pyramid to prepare code for speedup optimization.
r3238 environ = {'ENV_{}'.format(key): value for key, value in os.environ.items()}
configuration: Allows to use format style "{ENV_NAME}" placeholders in the configuration.
r2818
global_config = _substitute_values(global_config, environ)
settings = _substitute_values(settings, environ)
configuration: expose the config file location to the pyramid settings.
r3431 sanitize_settings_and_apply_defaults(global_config, settings)
users: ported controllers from pylons into pyramid views.
r2114
project: added all source files and assets
r1 config = Configurator(settings=settings)
users: ported controllers from pylons into pyramid views.
r2114
pylons: remove pylons as dependency...
r2351 # Apply compatibility patches
patches.inspect_getargspec()
load_pyramid_environment(global_config, settings)
db: Move initialization of test environment up to pyramid layer.
r116
settings: removed not used supervisor views/models....
r2325 # Static file view comes first
dan
assets: skip RoutesMiddleware matching on certain urls to avoid...
r463 includeme_first(config)
settings: removed not used supervisor views/models....
r2325
project: added all source files and assets
r1 includeme(config)
files: ported repository files controllers to pyramid views.
r1927
project: added all source files and assets
r1 pyramid_app = config.make_wsgi_app()
pyramid_app = wrap_app_in_wsgi_middlewares(pyramid_app, config)
dan
pyramid: add config to make_pyramid_app for inspection afterwards
r619 pyramid_app.config = config
dan
db: move Session.remove to outer wsgi layer and also add it...
r669
celery: celery 4.X support. Fixes #4169...
r2359 config.configure_celery(global_config['__file__'])
dan
db: move Session.remove to outer wsgi layer and also add it...
r669 # creating the app uses a connection - return it after we are done
meta.Session.remove()
application: re-organize imports for pyramid to prepare code for speedup optimization.
r3238 total_time = time.time() - start_time
core: change from homebrew plugin system into pyramid machinery....
r3240 log.info('Pyramid app `%s` created and configured in %.2fs',
pyramid_app.func_name, total_time)
application: add debug mode that switches logging to debug....
r3270
project: added all source files and assets
r1 return pyramid_app
pylons: remove pylons as dependency...
r2351 def not_found_view(request):
Martin Bornhold
vcs: Move VCSMiddleware up to pyramid layer as wrapper around pylons app....
r581 """
Martin Bornhold
config: Move appenlight wrapping from pylons to pyramid.
r595 This creates the view which should be registered as not-found-view to
pylons: remove pylons as dependency...
r2351 pyramid.
Martin Bornhold
vcs: Move VCSMiddleware up to pyramid layer as wrapper around pylons app....
r581 """
pylons: remove pylons as dependency...
r2351 if not getattr(request, 'vcs_call', None):
# handle like regular case with our error_handler
return error_handler(HTTPNotFound(), request)
Martin Bornhold
config: Move appenlight wrapping from pylons to pyramid.
r595
pylons: remove pylons as dependency...
r2351 # handle not found view as a vcs call
settings = request.registry.settings
ae_client = getattr(request, 'ae_client', None)
vcs_app = VCSMiddleware(
HTTPNotFound(), request.registry, settings,
appenlight_client=ae_client)
Martin Bornhold
vcs: Use response header to decide if error handling is needed.
r609
pylons: remove pylons as dependency...
r2351 return wsgiapp(vcs_app)(None, request)
project: added all source files and assets
r1
dan
errorpages: add appenlight to pyramid layer
r194 def error_handler(exception, request):
error-middleware: read title from cached rhodecode object....
r1496 import rhodecode
error-document: make sure the error document has registered helpers,...
r1748 from rhodecode.lib import helpers
dan
pyramid: make responses/exceptions from pyramid/pylons work
r187
error-middleware: read title from cached rhodecode object....
r1496 rhodecode_title = rhodecode.CONFIG.get('rhodecode_title') or 'RhodeCode'
dan
pyramid: make responses/exceptions from pyramid/pylons work
r187
dan
errorpages: add appenlight to pyramid layer
r194 base_response = HTTPInternalServerError()
# prefer original exception for the response since it may have headers set
core: properly handle new redirections set in decorators....
r1499 if isinstance(exception, HTTPException):
dan
errorpages: add appenlight to pyramid layer
r194 base_response = exception
repo-summary: re-implemented summary view as pyramid....
r1785 elif isinstance(exception, VCSCommunicationError):
base_response = VCSServerUnavailable()
dan
errorpages: add appenlight to pyramid layer
r194
error-handling: show tracebacks only for error code 500 and above.
r1314 if is_http_error(base_response):
log.exception(
'error occurred handling this request for path: %s', request.path)
auth: because we use 404 for access denied too. Show proper message about it in error page
r2115 error_explanation = base_response.explanation or str(base_response)
if base_response.status_code == 404:
error-pages: update message to more proper.
r3321 error_explanation += " Optionally you don't have permission to access this page."
dan
pyramid: make responses/exceptions from pyramid/pylons work
r187 c = AttributeDict()
dan
errorpages: add appenlight to pyramid layer
r194 c.error_message = base_response.status
auth: because we use 404 for access denied too. Show proper message about it in error page
r2115 c.error_explanation = error_explanation
dan
pyramid: make responses/exceptions from pyramid/pylons work
r187 c.visual = AttributeDict()
c.visual.rhodecode_support_url = (
request.registry.settings.get('rhodecode_support_url') or
request.route_url('rhodecode_support')
)
c.redirect_time = 0
error-middleware: read title from cached rhodecode object....
r1496 c.rhodecode_name = rhodecode_title
dan
pyramid: make responses/exceptions from pyramid/pylons work
r187 if not c.rhodecode_name:
c.rhodecode_name = 'Rhodecode'
dan
ux: show list of causes for vcs unavailable error page
r683 c.causes = []
error-page: use custom causes for 500+ errors
r2116 if is_http_error(base_response):
c.causes.append('Server is overloaded.')
c.causes.append('Server database connection is lost.')
c.causes.append('Server expected unhandled error.')
dan
ux: show list of causes for vcs unavailable error page
r683 if hasattr(base_response, 'causes'):
c.causes = base_response.causes
error-page: use custom causes for 500+ errors
r2116
pyramid: changes for pyramid migration.
r1908 c.messages = helpers.flash.pop_messages(request=request)
exceptions: added new exception tracking capability....
r2907
exc_info = sys.exc_info()
c.exception_id = id(exc_info)
c.show_exception_id = isinstance(base_response, VCSServerUnavailable) \
or base_response.status_code > 499
c.exception_id_url = request.route_url(
'admin_settings_exception_tracker_show', exception_id=c.exception_id)
if c.show_exception_id:
store_exception(c.exception_id, exc_info)
dan
pyramid: make responses/exceptions from pyramid/pylons work
r187 response = render_to_response(
error-document: make sure the error document has registered helpers,...
r1748 '/errors/error_document.mako', {'c': c, 'h': helpers}, request=request,
dan
errorpages: use original http status for rendered error page
r190 response=base_response)
dan
pyramid: make responses/exceptions from pyramid/pylons work
r187 return response
middleware: code restructure
r2326 def includeme_first(config):
# redirect automatic browser favicon.ico requests to correct place
def favicon_redirect(context, request):
return HTTPFound(
request.static_path('rhodecode:public/images/favicon.ico'))
config.add_view(favicon_redirect, route_name='favicon')
config.add_route('favicon', '/favicon.ico')
def robots_redirect(context, request):
return HTTPFound(
request.static_path('rhodecode:public/robots.txt'))
config.add_view(robots_redirect, route_name='robots')
config.add_route('robots', '/robots.txt')
config.add_static_view(
'_static/deform', 'deform:static')
config.add_static_view(
'_static/rhodecode', path='rhodecode:public', cache_max_age=3600 * 24)
project: added all source files and assets
r1 def includeme(config):
application: re-organize imports for pyramid to prepare code for speedup optimization.
r3238 log.debug('Initializing main includeme from %s', os.path.basename(__file__))
project: added all source files and assets
r1 settings = config.registry.settings
debug: add new custom logging to track unique requests across systems.
r2794 config.set_request_factory(Request)
project: added all source files and assets
r1
middleware: add the register plugin directive further up the config stack
r470 # plugin information
core: code refactor and cleanups for easier pylons porting.
r2321 config.registry.rhodecode_plugins = collections.OrderedDict()
middleware: add the register plugin directive further up the config stack
r470
config.add_directive(
'register_rhodecode_plugin', register_rhodecode_plugin)
celery: celery 4.X support. Fixes #4169...
r2359 config.add_directive('configure_celery', configure_celery)
dan
errorpages: add appenlight to pyramid layer
r194 if asbool(settings.get('appenlight', 'false')):
config.include('appenlight_client.ext.pyramid_tween')
app: disconect auth plugin loading from authentication registry....
r3241 load_all = should_load_all()
project: added all source files and assets
r1 # Includes which are required. The application would fail without them.
config.include('pyramid_mako')
session: moved pyramid_beaker internally to apply some patches required for better session handling
r3748 config.include('rhodecode.lib.rc_beaker')
caches: rewrite of auth/permission caches to dogpile.
r2845 config.include('rhodecode.lib.rc_cache')
admin: moved admin pyramid into apps.
r1503
application: re-organize imports for pyramid to prepare code for speedup optimization.
r3238 config.include('rhodecode.apps._base.navigation')
config.include('rhodecode.apps._base.subscribers')
config.include('rhodecode.tweens')
core: change from homebrew plugin system into pyramid machinery....
r3240 config.include('rhodecode.integrations')
config.include('rhodecode.authentication')
app: disconect auth plugin loading from authentication registry....
r3241 if load_all:
from rhodecode.authentication import discover_legacy_plugins
# load CE authentication plugins
config.include('rhodecode.authentication.plugins.auth_crowd')
config.include('rhodecode.authentication.plugins.auth_headers')
config.include('rhodecode.authentication.plugins.auth_jasig_cas')
config.include('rhodecode.authentication.plugins.auth_ldap')
config.include('rhodecode.authentication.plugins.auth_pam')
config.include('rhodecode.authentication.plugins.auth_rhodecode')
config.include('rhodecode.authentication.plugins.auth_token')
# Auto discover authentication plugins and include their configuration.
discover_legacy_plugins(config)
user-profile: migrated to pyramid views.
r1502 # apps
core: added supports of repo based views via pyramid.
r1554 config.include('rhodecode.apps._base')
app: disconect auth plugin loading from authentication registry....
r3241
if load_all:
config.include('rhodecode.apps.ops')
config.include('rhodecode.apps.admin')
config.include('rhodecode.apps.channelstream')
file-store: rename module from upload_store to file_store.
r3453 config.include('rhodecode.apps.file_store')
app: disconect auth plugin loading from authentication registry....
r3241 config.include('rhodecode.apps.login')
config.include('rhodecode.apps.home')
config.include('rhodecode.apps.journal')
config.include('rhodecode.apps.repository')
config.include('rhodecode.apps.repo_group')
config.include('rhodecode.apps.user_group')
config.include('rhodecode.apps.search')
config.include('rhodecode.apps.user_profile')
config.include('rhodecode.apps.user_group_profile')
config.include('rhodecode.apps.my_account')
config.include('rhodecode.apps.svn_support')
config.include('rhodecode.apps.ssh_support')
config.include('rhodecode.apps.gist')
config.include('rhodecode.apps.debug_style')
config.include('rhodecode.api')
admin: moved admin pyramid into apps.
r1503
application: re-organize imports for pyramid to prepare code for speedup optimization.
r3238 config.add_route('rhodecode_support', 'https://rhodecode.com/help/', static=True)
i18n: enable translation defaults for pyramid views.
r1303 config.add_translation_dirs('rhodecode:i18n/')
settings['default_locale_name'] = settings.get('lang', 'en')
Martin Bornhold
config: Move initial repo scan up to the pyramid layer....
r580 # Add subscribers.
security: update lastactivity when on audit logs....
r2930 config.add_subscriber(inject_app_settings,
pyramid.events.ApplicationCreated)
config.add_subscriber(scan_repositories_if_enabled,
pyramid.events.ApplicationCreated)
config.add_subscriber(write_metadata_if_needed,
pyramid.events.ApplicationCreated)
config.add_subscriber(write_js_routes_if_enabled,
pyramid.events.ApplicationCreated)
events: re-organizate events handling....
r1789
middleware: code restructure
r2326 # request custom methods
config.add_request_method(
'rhodecode.lib.partial_renderer.get_partial_renderer',
'get_partial_renderer')
request-wrapper: add request counters
r3874 config.add_request_method(
'rhodecode.lib.request_counter.get_request_counter',
'request_count')
project: added all source files and assets
r1 # Set the authorization policy.
authz_policy = ACLAuthorizationPolicy()
config.set_authorization_policy(authz_policy)
# Set the default renderer for HTML templates to mako.
config.add_mako_renderer('.html')
core: added ext_json as custom renderer using our ext_json lib for pyramid.
r1664 config.add_renderer(
name='json_ext',
factory='rhodecode.lib.ext_json_renderer.pyramid_ext_json')
project: added all source files and assets
r1 # include RhodeCode plugins
includes = aslist(settings.get('rhodecode.includes', []))
for inc in includes:
config.include(inc)
pylons: remove pylons as dependency...
r2351 # custom not found view, if our pyramid app doesn't know how to handle
# the request pass it to potential VCS handling ap
config.add_notfound_view(not_found_view)
dan
errorpages: fix case when a pyramid httperror was not being rendered...
r449 if not settings.get('debugtoolbar.enabled', False):
pyramid: allows easier turning off the pylons components.
r1912 # disabled debugtoolbar handle all exceptions via the error_handlers
dan
errorpages: fix case when a pyramid httperror was not being rendered...
r449 config.add_view(error_handler, context=Exception)
pylons: remove pylons as dependency...
r2351 # all errors including 403/404/50X
dan
errorpages: fix case when a pyramid httperror was not being rendered...
r449 config.add_view(error_handler, context=HTTPError)
project: added all source files and assets
r1
def wrap_app_in_wsgi_middlewares(pyramid_app, config):
"""
Apply outer WSGI middlewares around the application.
"""
events: use a distinction between RhodeCodeEvent which is a base class and it used by all events, and...
r2921 registry = config.registry
settings = registry.settings
project: added all source files and assets
r1
config: Move HttpsFixup middleware up...
r181 # enable https redirects based on HTTP_X_URL_SCHEME set by proxy
pyramid_app = HttpsFixup(pyramid_app, settings)
pylons: remove pylons as dependency...
r2351 pyramid_app, _ae_client = wrap_in_appenlight_if_enabled(
pyramid_app, settings)
events: use a distinction between RhodeCodeEvent which is a base class and it used by all events, and...
r2921 registry.ae_client = _ae_client
dan
errorpages: add appenlight to pyramid layer
r194
Martin Bornhold
config: Sanitize 'appenlight' and 'gzip_responses' settings.
r598 if settings['gzip_responses']:
project: added all source files and assets
r1 pyramid_app = make_gzip_middleware(
pyramid_app, settings, compress_level=1)
dan
db: move Session.remove to outer wsgi layer and also add it...
r669 # this should be the outer most middleware in the wsgi stack since
# middleware like Routes make database calls
def pyramid_app_with_cleanup(environ, start_response):
try:
return pyramid_app(environ, start_response)
finally:
# Dispose current database session and rollback uncommitted
# transactions.
meta.Session.remove()
# In a single threaded mode server, on non sqlite db we should have
# '0 Current Checked out connections' at the end of a request,
# if not, then something, somewhere is leaving a connection open
pool = meta.Base.metadata.bind.engine.pool
log.debug('sa pool status: %s', pool.status())
middleware: use finalizing log to inidicate we finished ALL operations.
r2922 log.debug('Request processing finalized')
dan
db: move Session.remove to outer wsgi layer and also add it...
r669
return pyramid_app_with_cleanup
project: added all source files and assets
r1
configuration: expose the config file location to the pyramid settings.
r3431 def sanitize_settings_and_apply_defaults(global_config, settings):
project: added all source files and assets
r1 """
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.
"""
core: cleanup settings cleanups on pyramid app.
r2316 settings.setdefault('rhodecode.edition', 'Community Edition')
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)
project: added all source files and assets
r1
redis: fixed new redis url schema requirement for connection string
r3867 # 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
project: added all source files and assets
r1 # Default includes, possible to change as a user
pyramid_includes = settings.setdefault('pyramid.includes', [
'rhodecode.lib.middleware.request_wrapper',
])
log.debug(
"Using the following pyramid.includes: %s",
pyramid_includes)
# TODO: johbo: Re-think this, usually the call to config.include
# should allow to pass in a prefix.
settings.setdefault('rhodecode.api.url', '/_admin/api')
configuration: expose the config file location to the pyramid settings.
r3431 settings.setdefault('__file__', global_config.get('__file__'))
project: added all source files and assets
r1
Martin Bornhold
config: Sanitize 'appenlight' and 'gzip_responses' settings.
r598 # Sanitize generic settings.
Martin Bornhold
config: Sanitize 'default encoding' setting.
r586 _list_setting(settings, 'default_encoding', 'UTF-8')
db: Set `rhodecode.is_test` in `make_pyramid_app` instead of `make_app`...
r118 _bool_setting(settings, 'is_test', 'false')
Martin Bornhold
config: Sanitize 'appenlight' and 'gzip_responses' settings.
r598 _bool_setting(settings, 'gzip_responses', 'false')
project: added all source files and assets
r1
Martin Bornhold
config: Sanitize vcs realted settings during pyramid app init.
r585 # Call split out functions that sanitize settings for each topic.
Martin Bornhold
config: Sanitize 'appenlight' and 'gzip_responses' settings.
r598 _sanitize_appenlight_settings(settings)
Martin Bornhold
config: Sanitize vcs realted settings during pyramid app init.
r585 _sanitize_vcs_settings(settings)
caches: rewrite of auth/permission caches to dogpile.
r2845 _sanitize_cache_settings(settings)
Martin Bornhold
config: Sanitize vcs realted settings during pyramid app init.
r585
users: ported controllers from pylons into pyramid views.
r2114 # configure instance id
config_utils.set_instance_id(settings)
project: added all source files and assets
r1 return settings
application: add debug mode that switches logging to debug....
r3270 def enable_debug():
"""
Helper to enable debug on running instance
:return:
"""
import tempfile
import textwrap
import logging.config
ini_template = textwrap.dedent("""
#####################################
### DEBUG LOGGING CONFIGURATION ####
#####################################
[loggers]
keys = root, sqlalchemy, beaker, celery, rhodecode, ssh_wrapper
[handlers]
keys = console, console_sql
[formatters]
keys = generic, color_formatter, color_formatter_sql
#############
## LOGGERS ##
#############
[logger_root]
level = NOTSET
handlers = console
[logger_sqlalchemy]
level = INFO
handlers = console_sql
qualname = sqlalchemy.engine
propagate = 0
[logger_beaker]
level = DEBUG
handlers =
qualname = beaker.container
propagate = 1
[logger_rhodecode]
level = DEBUG
handlers =
qualname = rhodecode
propagate = 1
[logger_ssh_wrapper]
level = DEBUG
handlers =
qualname = ssh_wrapper
propagate = 1
[logger_celery]
level = DEBUG
handlers =
qualname = celery
##############
## HANDLERS ##
##############
[handler_console]
class = StreamHandler
args = (sys.stderr, )
level = DEBUG
formatter = color_formatter
[handler_console_sql]
# "level = DEBUG" logs SQL queries and results.
# "level = INFO" logs SQL queries.
# "level = WARN" logs neither. (Recommended for production systems.)
class = StreamHandler
args = (sys.stderr, )
level = WARN
formatter = color_formatter_sql
################
## FORMATTERS ##
################
[formatter_generic]
class = rhodecode.lib.logging_formatter.ExceptionAwareFormatter
format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s | %(req_id)s
datefmt = %Y-%m-%d %H:%M:%S
[formatter_color_formatter]
class = rhodecode.lib.logging_formatter.ColorRequestTrackingFormatter
format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s | %(req_id)s
datefmt = %Y-%m-%d %H:%M:%S
[formatter_color_formatter_sql]
class = rhodecode.lib.logging_formatter.ColorFormatterSql
format = %(asctime)s.%(msecs)03d [%(process)d] %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %Y-%m-%d %H:%M:%S
""")
with tempfile.NamedTemporaryFile(prefix='rc_debug_logging_', suffix='.ini',
delete=False) as f:
log.info('Saved Temporary DEBUG config at %s', f.name)
f.write(ini_template)
logging.config.fileConfig(f.name)
log.debug('DEBUG MODE ON')
os.remove(f.name)
Martin Bornhold
config: Sanitize 'appenlight' and 'gzip_responses' settings.
r598 def _sanitize_appenlight_settings(settings):
_bool_setting(settings, 'appenlight', 'false')
Martin Bornhold
config: Sanitize vcs realted settings during pyramid app init.
r585 def _sanitize_vcs_settings(settings):
"""
Applies settings defaults and does type conversion for all VCS related
settings.
"""
_string_setting(settings, 'vcs.svn.compatible_version', '')
_string_setting(settings, 'git_rev_filter', '--all')
Martin Bornhold
http: Use http as default setting when sanitize config values. Part of #4237
r958 _string_setting(settings, 'vcs.hooks.protocol', 'http')
hooks: made the callback host configurable....
r2833 _string_setting(settings, 'vcs.hooks.host', '127.0.0.1')
Martin Bornhold
http: Use http as default setting when sanitize config values. Part of #4237
r958 _string_setting(settings, 'vcs.scm_app_implementation', 'http')
Martin Bornhold
config: Sanitize vcs realted settings during pyramid app init.
r585 _string_setting(settings, 'vcs.server', '')
_string_setting(settings, 'vcs.server.log_level', 'debug')
Martin Bornhold
http: Use http as default setting when sanitize config values. Part of #4237
r958 _string_setting(settings, 'vcs.server.protocol', 'http')
Martin Bornhold
config: Sanitize vcs realted settings during pyramid app init.
r585 _bool_setting(settings, 'startup.import_repos', 'false')
_bool_setting(settings, 'vcs.hooks.direct_calls', 'false')
_bool_setting(settings, 'vcs.server.enable', 'true')
_bool_setting(settings, 'vcs.start_server', 'false')
_list_setting(settings, 'vcs.backends', 'hg, git, svn')
Martin Bornhold
config: Sanitize 'vcs.connection_timeout' setting in pyramid app init.
r623 _int_setting(settings, 'vcs.connection_timeout', 3600)
Martin Bornhold
vcs: Map legacy setting value 'rhodecode.lib.middleware.utils.scm_app_http' -> 'http' to support legacy configs.
r963 # Support legacy values of vcs.scm_app_implementation. Legacy
backend: don't support vcsserver.scm_app anymore
r2958 # configurations may use 'rhodecode.lib.middleware.utils.scm_app_http', or
# disabled since 4.13 'vcsserver.scm_app' which is now mapped to 'http'.
Martin Bornhold
vcs: Map legacy setting value 'rhodecode.lib.middleware.utils.scm_app_http' -> 'http' to support legacy configs.
r963 scm_app_impl = settings['vcs.scm_app_implementation']
backend: don't support vcsserver.scm_app anymore
r2958 if scm_app_impl in ['rhodecode.lib.middleware.utils.scm_app_http', 'vcsserver.scm_app']:
Martin Bornhold
vcs: Map legacy setting value 'rhodecode.lib.middleware.utils.scm_app_http' -> 'http' to support legacy configs.
r963 settings['vcs.scm_app_implementation'] = 'http'
Martin Bornhold
config: Sanitize 'vcs.connection_timeout' setting in pyramid app init.
r623
caches: rewrite of auth/permission caches to dogpile.
r2845 def _sanitize_cache_settings(settings):
exception_tracker: use a default value of exception store that is working across all instances e.g vcsserver and enterprise.
r3028 temp_store = tempfile.gettempdir()
default_cache_dir = os.path.join(temp_store, 'rc_cache')
caches: use single default cache dir for all backends....
r3008
# save default, cache dir, and use it for all backends later.
default_cache_dir = _string_setting(
settings,
'cache_dir',
default_cache_dir, lower=False, default_when_empty=True)
# ensure we have our dir created
if not os.path.isdir(default_cache_dir):
code: fixed deprecated octal calls for py3 compat.
r3268 os.makedirs(default_cache_dir, mode=0o755)
caches: use single default cache dir for all backends....
r3008
exc_tracker: allow setting custom store via .ini file...
r3019 # exception store cache
_string_setting(
settings,
exception_store: rename .ini option for future
r3024 'exception_tracker.store_path',
exception_tracker: use a default value of exception store that is working across all instances e.g vcsserver and enterprise.
r3028 temp_store, lower=False, default_when_empty=True)
exc_tracker: allow setting custom store via .ini file...
r3019
caches: use dogpile for sql_cache_short region.
r2883 # cache_perms
_string_setting(
settings,
'rc_cache.cache_perms.backend',
caches: use single default cache dir for all backends....
r3008 'dogpile.cache.rc.file_namespace', lower=False)
caches: use dogpile for sql_cache_short region.
r2883 _int_setting(
settings,
'rc_cache.cache_perms.expiration_time',
60)
_string_setting(
settings,
'rc_cache.cache_perms.arguments.filename',
caches: use single default cache dir for all backends....
r3008 os.path.join(default_cache_dir, 'rc_cache_1'), lower=False)
caches: rewrite of auth/permission caches to dogpile.
r2845
caches: use dogpile for sql_cache_short region.
r2883 # cache_repo
_string_setting(
settings,
'rc_cache.cache_repo.backend',
caches: use single default cache dir for all backends....
r3008 'dogpile.cache.rc.file_namespace', lower=False)
caches: use dogpile for sql_cache_short region.
r2883 _int_setting(
settings,
'rc_cache.cache_repo.expiration_time',
60)
_string_setting(
settings,
'rc_cache.cache_repo.arguments.filename',
caches: use single default cache dir for all backends....
r3008 os.path.join(default_cache_dir, 'rc_cache_2'), lower=False)
caches: rewrite of auth/permission caches to dogpile.
r2845
caches: configure license cache to some default settings.
r2959 # cache_license
_string_setting(
settings,
'rc_cache.cache_license.backend',
caches: use single default cache dir for all backends....
r3008 'dogpile.cache.rc.file_namespace', lower=False)
caches: configure license cache to some default settings.
r2959 _int_setting(
settings,
'rc_cache.cache_license.expiration_time',
5*60)
_string_setting(
settings,
'rc_cache.cache_license.arguments.filename',
caches: use single default cache dir for all backends....
r3008 os.path.join(default_cache_dir, 'rc_cache_3'), lower=False)
caches: configure license cache to some default settings.
r2959
caches: new cache context managers....
r2932 # cache_repo_longterm memory, 96H
_string_setting(
settings,
'rc_cache.cache_repo_longterm.backend',
caches: use single default cache dir for all backends....
r3008 'dogpile.cache.rc.memory_lru', lower=False)
caches: new cache context managers....
r2932 _int_setting(
settings,
'rc_cache.cache_repo_longterm.expiration_time',
345600)
_int_setting(
settings,
'rc_cache.cache_repo_longterm.max_size',
10000)
caches: use dogpile for sql_cache_short region.
r2883 # sql_cache_short
_string_setting(
settings,
'rc_cache.sql_cache_short.backend',
caches: use single default cache dir for all backends....
r3008 'dogpile.cache.rc.memory_lru', lower=False)
caches: use dogpile for sql_cache_short region.
r2883 _int_setting(
settings,
'rc_cache.sql_cache_short.expiration_time',
30)
_int_setting(
settings,
'rc_cache.sql_cache_short.max_size',
10000)
caches: don't use beaker for file caches anymore
r2846
caches: rewrite of auth/permission caches to dogpile.
r2845
Martin Bornhold
config: Sanitize 'vcs.connection_timeout' setting in pyramid app init.
r623 def _int_setting(settings, name, default):
settings[name] = int(settings.get(name, default))
caches: use single default cache dir for all backends....
r3008 return settings[name]
Martin Bornhold
config: Sanitize vcs realted settings during pyramid app init.
r585
project: added all source files and assets
r1 def _bool_setting(settings, name, default):
pylons: remove pylons as dependency...
r2351 input_val = settings.get(name, default)
if isinstance(input_val, unicode):
input_val = input_val.encode('utf8')
settings[name] = asbool(input_val)
caches: use single default cache dir for all backends....
r3008 return settings[name]
Martin Bornhold
config: Add method to sanitize list values from ini file.
r583
def _list_setting(settings, name, default):
raw_value = settings.get(name, default)
Martin Bornhold
config: Use rhodecode aslist if commas included in list settings otherwise pyramids aslist.
r604 old_separator = ','
if old_separator in raw_value:
# If we get a comma separated list, pass it to our own function.
settings[name] = rhodecode_aslist(raw_value, sep=old_separator)
else:
# Otherwise we assume it uses pyramids space/newline separation.
settings[name] = aslist(raw_value)
caches: use single default cache dir for all backends....
r3008 return settings[name]
Martin Bornhold
config: Add method to sanitize string values from ini file.
r584
caches: use single default cache dir for all backends....
r3008 def _string_setting(settings, name, default, lower=True, default_when_empty=False):
Martin Bornhold
config: Add argument to convert settings to lowercase or not....
r1003 value = settings.get(name, default)
caches: use single default cache dir for all backends....
r3008
if default_when_empty and not value:
# use default value when value is empty
value = default
Martin Bornhold
config: Add argument to convert settings to lowercase or not....
r1003 if lower:
value = value.lower()
settings[name] = value
caches: use single default cache dir for all backends....
r3008 return settings[name]
configuration: Allows to use format style "{ENV_NAME}" placeholders in the configuration.
r2818
def _substitute_values(mapping, substitutions):
dan
env-vars: provide better feedback when formatting an env variable fails.
r3366 result = {}
configurations: update attached configuration INI files with the ENV_ substitution infomation....
r2986
try:
dan
env-vars: provide better feedback when formatting an env variable fails.
r3366 for key, value in mapping.items():
# initialize without substitution first
result[key] = value
configurations: update attached configuration INI files with the ENV_ substitution infomation....
r2986 # Note: Cannot use regular replacements, since they would clash
# with the implementation of ConfigParser. Using "format" instead.
dan
env-vars: provide better feedback when formatting an env variable fails.
r3366 try:
result[key] = value.format(**substitutions)
except KeyError as e:
env_var = '{}'.format(e.args[0])
msg = 'Failed to substitute: `{key}={{{var}}}` with environment entry. ' \
'Make sure your environment has {var} set, or remove this ' \
'variable from config file'.format(key=key, var=env_var)
if env_var.startswith('ENV_'):
raise ValueError(msg)
else:
log.warning(msg)
env-variables: make it safer if there's a syntax problem inside .ini file....
r3237 except ValueError as e:
log.warning('Failed to substitute ENV variable: %s', e)
result = mapping
configurations: update attached configuration INI files with the ENV_ substitution infomation....
r2986
configuration: Allows to use format style "{ENV_NAME}" placeholders in the configuration.
r2818 return result