changeset 6555:213085032127

gearbox: make a make-config sub-command available again Drop the old kallithea-config command line tool and rework it to a replacement for the make-config paster command. Make-config was experimental in paste, it doesn't exist with gearbox, it was tied to pylons, and we already have the luxury problem of having two ways of doing almost the same thing. This is a good opportunity to get rid of one of them. This replacement tool is Kallithea specific and doesn't need to be told that it is Kallithea it has to create a config file for. The command should thus perhaps be given a Kallithea specific name instead of the very generic name ...
author Mads Kiilerich <madski@unity3d.com>
date Mon, 12 Sep 2016 17:50:11 +0200
parents 2c3d30095d5e
children a9e776515d8d
files MANIFEST.in docs/contributing.rst docs/dev/dbmigrations.rst docs/installation_win.rst docs/installation_win_old.rst docs/setup.rst docs/upgrade.rst kallithea/bin/kallithea_config.py kallithea/bin/template.ini.mako kallithea/config/deployment.ini_tmpl kallithea/lib/paster_commands/make_config.py kallithea/lib/paster_commands/template.ini.mako scripts/generate-ini.py scripts/manifest setup.py
diffstat 15 files changed, 766 insertions(+), 1393 deletions(-) [+]
line wrap: on
line diff
--- a/MANIFEST.in	Tue Oct 25 21:32:24 2016 +0200
+++ b/MANIFEST.in	Mon Sep 12 17:50:11 2016 +0200
@@ -11,7 +11,6 @@
 recursive-include kallithea/alembic *
 include           kallithea/bin/ldap_sync.conf
 include           kallithea/bin/template.ini.mako
-include           kallithea/config/deployment.ini_tmpl
 recursive-include kallithea/i18n *
 recursive-include kallithea/public *
 recursive-include kallithea/templates *
--- a/docs/contributing.rst	Tue Oct 25 21:32:24 2016 +0200
+++ b/docs/contributing.rst	Mon Sep 12 17:50:11 2016 +0200
@@ -36,7 +36,7 @@
         source ../kallithea-venv/bin/activate
         pip install --upgrade pip setuptools
         pip install -e .
-        TODO make-config Kallithea my.ini
+        gearbox make-config my.ini
         gearbox setup-db -c my.ini --user=user --email=user@example.com --password=password --repos=/tmp
         gearbox serve -c my.ini --reload &
         firefox http://127.0.0.1:5000/
--- a/docs/dev/dbmigrations.rst	Tue Oct 25 21:32:24 2016 +0200
+++ b/docs/dev/dbmigrations.rst	Mon Sep 12 17:50:11 2016 +0200
@@ -18,7 +18,7 @@
 2. Create a separate throwaway configuration for iterating on the actual
    database changes::
 
-    TODO make-config Kallithea temp.ini
+    gearbox make-config temp.ini
 
    Edit the file to change database settings. SQLite is typically fine,
    but make sure to change the path to e.g. ``temp.db``, to avoid
--- a/docs/installation_win.rst	Tue Oct 25 21:32:24 2016 +0200
+++ b/docs/installation_win.rst	Mon Sep 12 17:50:11 2016 +0200
@@ -166,7 +166,7 @@
 one). When ready, type::
 
   cd C:\Kallithea\Bin
-  TODO make-config Kallithea production.ini
+  gearbox make-config production.ini
 
 Then you must edit production.ini to fit your needs (IP address, IP
 port, mail settings, database, etc.). `NotePad++`__ or a similar text
--- a/docs/installation_win_old.rst	Tue Oct 25 21:32:24 2016 +0200
+++ b/docs/installation_win_old.rst	Mon Sep 12 17:50:11 2016 +0200
@@ -204,7 +204,7 @@
 "activate" one). When ready, just type::
 
   cd C:\Kallithea\Bin
-  TODO make-config Kallithea production.ini
+  gearbox make-config production.ini
 
 Then, you must edit production.ini to fit your needs (network address and
 port, mail settings, database, whatever). I recommend using NotePad++
--- a/docs/setup.rst	Tue Oct 25 21:32:24 2016 +0200
+++ b/docs/setup.rst	Mon Sep 12 17:50:11 2016 +0200
@@ -11,7 +11,7 @@
 First, you will need to create a Kallithea configuration file. Run the
 following command to do so::
 
-    TODO make-config Kallithea my.ini
+    gearbox make-config my.ini
 
 This will create the file ``my.ini`` in the current directory. This
 configuration file contains the various settings for Kallithea, e.g.
--- a/docs/upgrade.rst	Tue Oct 25 21:32:24 2016 +0200
+++ b/docs/upgrade.rst	Mon Sep 12 17:50:11 2016 +0200
@@ -91,13 +91,11 @@
 5. Upgrade your configuration
 -----------------------------
 
-Run the following command to upgrade your configuration (``.ini``) file::
-
-    TODO make-config Kallithea my.ini
+Run the following command to create a new configuration (``.ini``) file::
 
-This will display any changes made by the new version of Kallithea to your
-current configuration, and attempt an automatic merge. It is recommended
-that you check the contents after the merge.
+    gearbox make-config new.ini
+
+Then compare it with your old config file and see what changed.
 
 .. note::
     Please always make sure your ``.ini`` files are up to date. Errors
--- a/kallithea/bin/kallithea_config.py	Tue Oct 25 21:32:24 2016 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,160 +0,0 @@
-#!/usr/bin/env python2
-
-# -*- coding: utf-8 -*-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# 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 General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-"""
-kallithea.bin.kallithea_config
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-configuration generator for Kallithea
-
-This file was forked by the Kallithea project in July 2014.
-Original author and date, and relevant copyright and licensing information is below:
-:created_on: Jun 18, 2013
-:author: marcink
-:copyright: (c) 2013 RhodeCode GmbH, and others.
-:license: GPLv3, see LICENSE.md for more details.
-"""
-
-
-import os
-import sys
-import uuid
-import argparse
-from mako.template import Template
-TMPL = 'template.ini.mako'
-here = os.path.dirname(os.path.abspath(__file__))
-
-def argparser(argv):
-    usage = (
-      "kallithea-config [-h] [--filename=FILENAME] [--template=TEMPLATE] \n"
-      "VARS optional specify extra template variable that will be available in "
-      "template. Use comma separated key=val format eg.\n"
-      "key1=val1,port=5000,host=127.0.0.1,elements='a\,b\,c'\n"
-    )
-
-    parser = argparse.ArgumentParser(
-        description='Kallithea CONFIG generator with variable replacement',
-        usage=usage
-    )
-
-    ## config
-    group = parser.add_argument_group('CONFIG')
-    group.add_argument('--filename', help='Output ini filename.')
-    group.add_argument('--template', help='Mako template file to use instead of '
-                                          'the default builtin template')
-    group.add_argument('--raw', help='Store given mako template as raw without '
-                                     'parsing. Use this to create custom template '
-                                     'initially', action='store_true')
-    group.add_argument('--show-defaults', help='Show all default variables for '
-                                               'builtin template', action='store_true')
-    args, other = parser.parse_known_args()
-    return parser, args, other
-
-
-def _escape_split(text, sep):
-    """
-    Allows for escaping of the separator: e.g. arg='foo\, bar'
-
-    It should be noted that the way bash et. al. do command line parsing, those
-    single quotes are required. a shameless ripoff from fabric project.
-
-    """
-    escaped_sep = r'\%s' % sep
-
-    if escaped_sep not in text:
-        return text.split(sep)
-
-    before, _, after = text.partition(escaped_sep)
-    startlist = before.split(sep)  # a regular split is fine here
-    unfinished = startlist[-1]
-    startlist = startlist[:-1]
-
-    # recurse because there may be more escaped separators
-    endlist = _escape_split(after, sep)
-
-    # finish building the escaped value. we use endlist[0] because the first
-    # part of the string sent in recursion is the rest of the escaped value.
-    unfinished += sep + endlist[0]
-
-    return startlist + [unfinished] + endlist[1:]  # put together all the parts
-
-def _run(argv):
-    parser, args, other = argparser(argv)
-    if not len(sys.argv) > 1:
-        print parser.print_help()
-        sys.exit(0)
-    # defaults that can be overwritten by arguments
-    tmpl_stored_args = {
-        'http_server': 'waitress',
-        'lang': 'en',
-        'database_engine': 'sqlite',
-        'host': '127.0.0.1',
-        'port': 5000,
-        'error_aggregation_service': None,
-    }
-    if other:
-        # parse arguments, we assume only first is correct
-        kwargs = {}
-        for el in _escape_split(other[0], ','):
-            kv = _escape_split(el, '=')
-            if len(kv) == 2:
-                k, v = kv
-                kwargs[k] = v
-        # update our template stored args
-        tmpl_stored_args.update(kwargs)
-
-    # use default that cannot be replaced
-    tmpl_stored_args.update({
-        'uuid': lambda: uuid.uuid4().hex,
-        'here': os.path.abspath(os.curdir),
-    })
-    if args.show_defaults:
-        for k,v in tmpl_stored_args.iteritems():
-            print '%s=%s' % (k, v)
-        sys.exit(0)
-    try:
-        # built in template
-        tmpl_file = os.path.join(here, TMPL)
-        if args.template:
-            tmpl_file = args.template
-
-        with open(tmpl_file, 'rb') as f:
-            tmpl_data = f.read().decode('utf-8')
-            if args.raw:
-                tmpl = tmpl_data
-            else:
-                tmpl = Template(tmpl_data).render(**tmpl_stored_args)
-        with open(args.filename, 'wb') as f:
-            f.write(tmpl.encode('utf-8'))
-        print 'Wrote new config file in %s' % (os.path.abspath(args.filename))
-
-    except Exception:
-        from mako import exceptions
-        print exceptions.text_error_template().render()
-
-def main(argv=None):
-    """
-    Main execution function for cli
-
-    :param argv:
-    """
-    if argv is None:
-        argv = sys.argv
-
-    return _run(argv)
-
-
-if __name__ == '__main__':
-    sys.exit(main(sys.argv))
--- a/kallithea/bin/template.ini.mako	Tue Oct 25 21:32:24 2016 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,610 +0,0 @@
-## -*- coding: utf-8 -*-
-<%text>################################################################################</%text>
-<%text>################################################################################</%text>
-# Kallithea - config file generated with kallithea-config                      #
-<%text>################################################################################</%text>
-<%text>################################################################################</%text>
-
-[DEFAULT]
-debug = true
-pdebug = false
-
-<%text>################################################################################</%text>
-<%text>## Email settings                                                             ##</%text>
-<%text>##                                                                            ##</%text>
-<%text>## Refer to the documentation ("Email settings") for more details.            ##</%text>
-<%text>##                                                                            ##</%text>
-<%text>## It is recommended to use a valid sender address that passes access         ##</%text>
-<%text>## validation and spam filtering in mail servers.                             ##</%text>
-<%text>################################################################################</%text>
-
-<%text>## 'From' header for application emails. You can optionally add a name.</%text>
-<%text>## Default:</%text>
-#app_email_from = Kallithea
-<%text>## Examples:</%text>
-#app_email_from = Kallithea <kallithea-noreply@example.com>
-#app_email_from = kallithea-noreply@example.com
-
-<%text>## Subject prefix for application emails.</%text>
-<%text>## A space between this prefix and the real subject is automatically added.</%text>
-<%text>## Default:</%text>
-#email_prefix =
-<%text>## Example:</%text>
-#email_prefix = [Kallithea]
-
-<%text>## Recipients for error emails and fallback recipients of application mails.</%text>
-<%text>## Multiple addresses can be specified, space-separated.</%text>
-<%text>## Only addresses are allowed, do not add any name part.</%text>
-<%text>## Default:</%text>
-#email_to =
-<%text>## Examples:</%text>
-#email_to = admin@example.com
-#email_to = admin@example.com another_admin@example.com
-
-<%text>## 'From' header for error emails. You can optionally add a name.</%text>
-<%text>## Default:</%text>
-#error_email_from = pylons@yourapp.com
-<%text>## Examples:</%text>
-#error_email_from = Kallithea Errors <kallithea-noreply@example.com>
-#error_email_from = paste_error@example.com
-
-<%text>## SMTP server settings</%text>
-<%text>## If specifying credentials, make sure to use secure connections.</%text>
-<%text>## Default: Send unencrypted unauthenticated mails to the specified smtp_server.</%text>
-<%text>## For "SSL", use smtp_use_ssl = true and smtp_port = 465.</%text>
-<%text>## For "STARTTLS", use smtp_use_tls = true and smtp_port = 587.</%text>
-#smtp_server = smtp.example.com
-#smtp_username =
-#smtp_password =
-#smtp_port = 25
-#smtp_use_ssl = false
-#smtp_use_tls = false
-
-[server:main]
-%if http_server == 'gearbox':
-<%text>## Gearbox default web server ##</%text>
-use = egg:gearbox#wsgiref
-<%text>## nr of worker threads to spawn</%text>
-threadpool_workers = 1
-<%text>## max request before thread respawn</%text>
-threadpool_max_requests = 100
-<%text>## option to use threads of process</%text>
-use_threadpool = true
-
-%elif http_server == 'gevent':
-<%text>## Gearbox gevent web server ##</%text>
-use = egg:gearbox#gevent
-
-%elif http_server == 'waitress':
-<%text>## WAITRESS ##</%text>
-use = egg:waitress#main
-<%text>## number of worker threads</%text>
-threads = 1
-<%text>## MAX BODY SIZE 100GB</%text>
-max_request_body_size = 107374182400
-<%text>## use poll instead of select, fixes fd limits, may not work on old</%text>
-<%text>## windows systems.</%text>
-#asyncore_use_poll = True
-
-%elif http_server == 'gunicorn':
-<%text>## GUNICORN ##</%text>
-use = egg:gunicorn#main
-<%text>## number of process workers. You must set `instance_id = *` when this option</%text>
-<%text>## is set to more than one worker</%text>
-workers = 1
-<%text>## process name</%text>
-proc_name = kallithea
-<%text>## type of worker class, one of sync, eventlet, gevent, tornado</%text>
-<%text>## recommended for bigger setup is using of of other than sync one</%text>
-worker_class = sync
-max_requests = 1000
-<%text>## amount of time a worker can handle request before it gets killed and</%text>
-<%text>## restarted</%text>
-timeout = 3600
-
-%elif http_server == 'uwsgi':
-<%text>## UWSGI ##</%text>
-<%text>## run with uwsgi --ini-paste-logged <inifile.ini></%text>
-[uwsgi]
-socket = /tmp/uwsgi.sock
-master = true
-http = 127.0.0.1:5000
-
-<%text>## set as deamon and redirect all output to file</%text>
-#daemonize = ./uwsgi_kallithea.log
-
-<%text>## master process PID</%text>
-pidfile = ./uwsgi_kallithea.pid
-
-<%text>## stats server with workers statistics, use uwsgitop</%text>
-<%text>## for monitoring, `uwsgitop 127.0.0.1:1717`</%text>
-stats = 127.0.0.1:1717
-memory-report = true
-
-<%text>## log 5XX errors</%text>
-log-5xx = true
-
-<%text>## Set the socket listen queue size.</%text>
-listen = 256
-
-<%text>## Gracefully Reload workers after the specified amount of managed requests</%text>
-<%text>## (avoid memory leaks).</%text>
-max-requests = 1000
-
-<%text>## enable large buffers</%text>
-buffer-size = 65535
-
-<%text>## socket and http timeouts ##</%text>
-http-timeout = 3600
-socket-timeout = 3600
-
-<%text>## Log requests slower than the specified number of milliseconds.</%text>
-log-slow = 10
-
-<%text>## Exit if no app can be loaded.</%text>
-need-app = true
-
-<%text>## Set lazy mode (load apps in workers instead of master).</%text>
-lazy = true
-
-<%text>## scaling ##</%text>
-<%text>## set cheaper algorithm to use, if not set default will be used</%text>
-cheaper-algo = spare
-
-<%text>## minimum number of workers to keep at all times</%text>
-cheaper = 1
-
-<%text>## number of workers to spawn at startup</%text>
-cheaper-initial = 1
-
-<%text>## maximum number of workers that can be spawned</%text>
-workers = 4
-
-<%text>## how many workers should be spawned at a time</%text>
-cheaper-step = 1
-
-%endif
-<%text>## COMMON ##</%text>
-host = ${host}
-port = ${port}
-
-<%text>## middleware for hosting the WSGI application under a URL prefix</%text>
-#[filter:proxy-prefix]
-#use = egg:PasteDeploy#prefix
-#prefix = /<your-prefix>
-
-[app:main]
-use = egg:kallithea
-<%text>## enable proxy prefix middleware</%text>
-#filter-with = proxy-prefix
-
-full_stack = true
-static_files = true
-<%text>## Available Languages:</%text>
-<%text>## cs de fr hu ja nl_BE pl pt_BR ru sk zh_CN zh_TW</%text>
-lang =
-cache_dir = ${here}/data
-index_dir = ${here}/data/index
-
-<%text>## perform a full repository scan on each server start, this should be</%text>
-<%text>## set to false after first startup, to allow faster server restarts.</%text>
-initial_repo_scan = false
-
-<%text>## uncomment and set this path to use archive download cache</%text>
-archive_cache_dir = ${here}/tarballcache
-
-<%text>## change this to unique ID for security</%text>
-app_instance_uuid = ${uuid()}
-
-<%text>## cut off limit for large diffs (size in bytes)</%text>
-cut_off_limit = 256000
-
-<%text>## force https in Kallithea, fixes https redirects, assumes it's always https</%text>
-force_https = false
-
-<%text>## use Strict-Transport-Security headers</%text>
-use_htsts = false
-
-<%text>## number of commits stats will parse on each iteration</%text>
-commit_parse_limit = 25
-
-<%text>## path to git executable</%text>
-git_path = git
-
-<%text>## git rev filter option, --all is the default filter, if you need to</%text>
-<%text>## hide all refs in changelog switch this to --branches --tags</%text>
-#git_rev_filter = --branches --tags
-
-<%text>## RSS feed options</%text>
-rss_cut_off_limit = 256000
-rss_items_per_page = 10
-rss_include_diff = false
-
-<%text>## options for showing and identifying changesets</%text>
-show_sha_length = 12
-show_revision_number = false
-
-<%text>## Canonical URL to use when creating full URLs in UI and texts.</%text>
-<%text>## Useful when the site is available under different names or protocols.</%text>
-<%text>## Defaults to what is provided in the WSGI environment.</%text>
-#canonical_url = https://kallithea.example.com/repos
-
-<%text>## gist URL alias, used to create nicer urls for gist. This should be an</%text>
-<%text>## url that does rewrites to _admin/gists/<gistid>.</%text>
-<%text>## example: http://gist.example.com/{gistid}. Empty means use the internal</%text>
-<%text>## Kallithea url, ie. http[s]://kallithea.example.com/_admin/gists/<gistid></%text>
-gist_alias_url =
-
-<%text>## white list of API enabled controllers. This allows to add list of</%text>
-<%text>## controllers to which access will be enabled by api_key. eg: to enable</%text>
-<%text>## api access to raw_files put `FilesController:raw`, to enable access to patches</%text>
-<%text>## add `ChangesetController:changeset_patch`. This list should be "," separated</%text>
-<%text>## Syntax is <ControllerClass>:<function>. Check debug logs for generated names</%text>
-<%text>## Recommended settings below are commented out:</%text>
-api_access_controllers_whitelist =
-#    ChangesetController:changeset_patch,
-#    ChangesetController:changeset_raw,
-#    FilesController:raw,
-#    FilesController:archivefile
-
-<%text>## default encoding used to convert from and to unicode</%text>
-<%text>## can be also a comma separated list of encoding in case of mixed encodings</%text>
-default_encoding = utf8
-
-<%text>## issue tracker for Kallithea (leave blank to disable, absent for default)</%text>
-#bugtracker = https://bitbucket.org/conservancy/kallithea/issues
-
-<%text>## issue tracking mapping for commits messages</%text>
-<%text>## comment out issue_pat, issue_server, issue_prefix to enable</%text>
-
-<%text>## pattern to get the issues from commit messages</%text>
-<%text>## default one used here is #<numbers> with a regex passive group for `#`</%text>
-<%text>## {id} will be all groups matched from this pattern</%text>
-
-issue_pat = (?:\s*#)(\d+)
-
-<%text>## server url to the issue, each {id} will be replaced with match</%text>
-<%text>## fetched from the regex and {repo} is replaced with full repository name</%text>
-<%text>## including groups {repo_name} is replaced with just name of repo</%text>
-
-issue_server_link = https://issues.example.com/{repo}/issue/{id}
-
-<%text>## prefix to add to link to indicate it's an url</%text>
-<%text>## #314 will be replaced by <issue_prefix><id></%text>
-
-issue_prefix = #
-
-<%text>## issue_pat, issue_server_link, issue_prefix can have suffixes to specify</%text>
-<%text>## multiple patterns, to other issues server, wiki or others</%text>
-<%text>## below an example how to create a wiki pattern</%text>
-# wiki-some-id -> https://wiki.example.com/some-id
-
-#issue_pat_wiki = (?:wiki-)(.+)
-#issue_server_link_wiki = https://wiki.example.com/{id}
-#issue_prefix_wiki = WIKI-
-
-<%text>## alternative return HTTP header for failed authentication. Default HTTP</%text>
-<%text>## response is 401 HTTPUnauthorized. Currently Mercurial clients have trouble with</%text>
-<%text>## handling that. Set this variable to 403 to return HTTPForbidden</%text>
-auth_ret_code =
-
-<%text>## locking return code. When repository is locked return this HTTP code. 2XX</%text>
-<%text>## codes don't break the transactions while 4XX codes do</%text>
-lock_ret_code = 423
-
-<%text>## allows to change the repository location in settings page</%text>
-allow_repo_location_change = True
-
-<%text>## allows to setup custom hooks in settings page</%text>
-allow_custom_hooks_settings = True
-
-<%text>## extra extensions for indexing, space separated and without the leading '.'.</%text>
-# index.extensions =
-#    gemfile
-#    lock
-
-<%text>## extra filenames for indexing, space separated</%text>
-# index.filenames =
-#    .dockerignore
-#    .editorconfig
-#    INSTALL
-#    CHANGELOG
-
-<%text>####################################</%text>
-<%text>###        CELERY CONFIG        ####</%text>
-<%text>####################################</%text>
-
-use_celery = false
-
-<%text>## Example: connect to the virtual host 'rabbitmqhost' on localhost as rabbitmq:</%text>
-broker.url = amqp://rabbitmq:qewqew@localhost:5672/rabbitmqhost
-
-celery.imports = kallithea.lib.celerylib.tasks
-celery.accept.content = pickle
-celery.result.backend = amqp
-celery.result.dburi = amqp://
-celery.result.serialier = json
-
-#celery.send.task.error.emails = true
-#celery.amqp.task.result.expires = 18000
-
-celeryd.concurrency = 2
-celeryd.max.tasks.per.child = 1
-
-<%text>## If true, tasks will never be sent to the queue, but executed locally instead.</%text>
-celery.always.eager = false
-
-<%text>####################################</%text>
-<%text>###         BEAKER CACHE        ####</%text>
-<%text>####################################</%text>
-
-beaker.cache.data_dir = ${here}/data/cache/data
-beaker.cache.lock_dir = ${here}/data/cache/lock
-
-beaker.cache.regions = short_term,long_term,sql_cache_short
-
-beaker.cache.short_term.type = memory
-beaker.cache.short_term.expire = 60
-beaker.cache.short_term.key_length = 256
-
-beaker.cache.long_term.type = memory
-beaker.cache.long_term.expire = 36000
-beaker.cache.long_term.key_length = 256
-
-beaker.cache.sql_cache_short.type = memory
-beaker.cache.sql_cache_short.expire = 10
-beaker.cache.sql_cache_short.key_length = 256
-
-<%text>####################################</%text>
-<%text>###       BEAKER SESSION        ####</%text>
-<%text>####################################</%text>
-
-<%text>## Name of session cookie. Should be unique for a given host and path, even when running</%text>
-<%text>## on different ports. Otherwise, cookie sessions will be shared and messed up.</%text>
-beaker.session.key = kallithea
-<%text>## Sessions should always only be accessible by the browser, not directly by JavaScript.</%text>
-beaker.session.httponly = true
-<%text>## Session lifetime. 2592000 seconds is 30 days.</%text>
-beaker.session.timeout = 2592000
-
-<%text>## Server secret used with HMAC to ensure integrity of cookies.</%text>
-beaker.session.secret = ${uuid()}
-<%text>## Further, encrypt the data with AES.</%text>
-#beaker.session.encrypt_key = <key_for_encryption>
-#beaker.session.validate_key = <validation_key>
-
-<%text>## Type of storage used for the session, current types are</%text>
-<%text>## dbm, file, memcached, database, and memory.</%text>
-
-<%text>## File system storage of session data. (default)</%text>
-#beaker.session.type = file
-
-<%text>## Cookie only, store all session data inside the cookie. Requires secure secrets.</%text>
-#beaker.session.type = cookie
-
-<%text>## Database storage of session data.</%text>
-#beaker.session.type = ext:database
-#beaker.session.sa.url = postgresql://postgres:qwe@localhost/kallithea
-#beaker.session.table_name = db_session
-
-%if error_aggregation_service == 'appenlight':
-<%text>############################</%text>
-<%text>## ERROR HANDLING SYSTEMS ##</%text>
-<%text>############################</%text>
-
-<%text>####################</%text>
-<%text>### [appenlight] ###</%text>
-<%text>####################</%text>
-
-<%text>## AppEnlight is tailored to work with Kallithea, see</%text>
-<%text>## http://appenlight.com for details how to obtain an account</%text>
-<%text>## you must install python package `appenlight_client` to make it work</%text>
-
-<%text>## appenlight enabled</%text>
-appenlight = false
-
-appenlight.server_url = https://api.appenlight.com
-appenlight.api_key = YOUR_API_KEY
-
-<%text>## TWEAK AMOUNT OF INFO SENT HERE</%text>
-
-<%text>## enables 404 error logging (default False)</%text>
-appenlight.report_404 = false
-
-<%text>## time in seconds after request is considered being slow (default 1)</%text>
-appenlight.slow_request_time = 1
-
-<%text>## record slow requests in application</%text>
-<%text>## (needs to be enabled for slow datastore recording and time tracking)</%text>
-appenlight.slow_requests = true
-
-<%text>## enable hooking to application loggers</%text>
-#appenlight.logging = true
-
-<%text>## minimum log level for log capture</%text>
-#appenlight.logging.level = WARNING
-
-<%text>## send logs only from erroneous/slow requests</%text>
-<%text>## (saves API quota for intensive logging)</%text>
-appenlight.logging_on_error = false
-
-<%text>## list of additional keywords that should be grabbed from environ object</%text>
-<%text>## can be string with comma separated list of words in lowercase</%text>
-<%text>## (by default client will always send following info:</%text>
-<%text>## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that</%text>
-<%text>## start with HTTP* this list be extended with additional keywords here</%text>
-appenlight.environ_keys_whitelist =
-
-<%text>## list of keywords that should be blanked from request object</%text>
-<%text>## can be string with comma separated list of words in lowercase</%text>
-<%text>## (by default client will always blank keys that contain following words</%text>
-<%text>## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'</%text>
-<%text>## this list be extended with additional keywords set here</%text>
-appenlight.request_keys_blacklist =
-
-<%text>## list of namespaces that should be ignores when gathering log entries</%text>
-<%text>## can be string with comma separated list of namespaces</%text>
-<%text>## (by default the client ignores own entries: appenlight_client.client)</%text>
-appenlight.log_namespace_blacklist =
-
-%elif error_aggregation_service == 'sentry':
-<%text>################</%text>
-<%text>### [sentry] ###</%text>
-<%text>################</%text>
-
-<%text>## sentry is a alternative open source error aggregator</%text>
-<%text>## you must install python packages `sentry` and `raven` to enable</%text>
-
-sentry.dsn = YOUR_DNS
-sentry.servers =
-sentry.name =
-sentry.key =
-sentry.public_key =
-sentry.secret_key =
-sentry.project =
-sentry.site =
-sentry.include_paths =
-sentry.exclude_paths =
-
-%endif
-<%text>################################################################################</%text>
-<%text>## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*  ##</%text>
-<%text>## Debug mode will enable the interactive debugging tool, allowing ANYONE to  ##</%text>
-<%text>## execute malicious code after an exception is raised.                       ##</%text>
-<%text>################################################################################</%text>
-set debug = false
-
-<%text>##################################</%text>
-<%text>###       LOGVIEW CONFIG       ###</%text>
-<%text>##################################</%text>
-
-logview.sqlalchemy = #faa
-logview.pylons.templating = #bfb
-logview.pylons.util = #eee
-
-<%text>#########################################################</%text>
-<%text>### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG    ###</%text>
-<%text>#########################################################</%text>
-
-%if database_engine == 'sqlite':
-# SQLITE [default]
-sqlalchemy.url = sqlite:///${here}/kallithea.db?timeout=60
-
-%elif database_engine == 'postgres':
-# POSTGRESQL
-sqlalchemy.url = postgresql://user:pass@localhost/kallithea
-
-%elif database_engine == 'mysql':
-# MySQL
-sqlalchemy.url = mysql://user:pass@localhost/kallithea?charset=utf8
-
-%endif
-# see sqlalchemy docs for others
-
-sqlalchemy.echo = false
-sqlalchemy.pool_recycle = 3600
-
-<%text>################################</%text>
-<%text>### ALEMBIC CONFIGURATION   ####</%text>
-<%text>################################</%text>
-
-[alembic]
-script_location = kallithea:alembic
-
-<%text>################################</%text>
-<%text>### LOGGING CONFIGURATION   ####</%text>
-<%text>################################</%text>
-
-[loggers]
-keys = root, routes, kallithea, sqlalchemy, gearbox, beaker, templates, whoosh_indexer
-
-[handlers]
-keys = console, console_sql
-
-[formatters]
-keys = generic, color_formatter, color_formatter_sql
-
-<%text>#############</%text>
-<%text>## LOGGERS ##</%text>
-<%text>#############</%text>
-
-[logger_root]
-level = NOTSET
-handlers = console
-
-[logger_routes]
-level = DEBUG
-handlers =
-qualname = routes.middleware
-<%text>## "level = DEBUG" logs the route matched and routing variables.</%text>
-propagate = 1
-
-[logger_beaker]
-level = DEBUG
-handlers =
-qualname = beaker.container
-propagate = 1
-
-[logger_templates]
-level = INFO
-handlers =
-qualname = pylons.templating
-propagate = 1
-
-[logger_kallithea]
-level = DEBUG
-handlers =
-qualname = kallithea
-propagate = 1
-
-[logger_gearbox]
-level = DEBUG
-handlers =
-qualname = gearbox
-propagate = 1
-
-[logger_sqlalchemy]
-level = INFO
-handlers = console_sql
-qualname = sqlalchemy.engine
-propagate = 0
-
-[logger_whoosh_indexer]
-level = DEBUG
-handlers =
-qualname = whoosh_indexer
-propagate = 1
-
-<%text>##############</%text>
-<%text>## HANDLERS ##</%text>
-<%text>##############</%text>
-
-[handler_console]
-class = StreamHandler
-args = (sys.stderr,)
-level = INFO
-formatter = generic
-
-[handler_console_sql]
-class = StreamHandler
-args = (sys.stderr,)
-level = WARN
-formatter = generic
-
-<%text>################</%text>
-<%text>## FORMATTERS ##</%text>
-<%text>################</%text>
-
-[formatter_generic]
-format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
-datefmt = %Y-%m-%d %H:%M:%S
-
-[formatter_color_formatter]
-class = kallithea.lib.colored_formatter.ColorFormatter
-format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
-datefmt = %Y-%m-%d %H:%M:%S
-
-[formatter_color_formatter_sql]
-class = kallithea.lib.colored_formatter.ColorFormatterSql
-format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
-datefmt = %Y-%m-%d %H:%M:%S
--- a/kallithea/config/deployment.ini_tmpl	Tue Oct 25 21:32:24 2016 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,598 +0,0 @@
-################################################################################
-################################################################################
-# Kallithea - Example config                                                   #
-#                                                                              #
-# The %(here)s variable will be replaced with the parent directory of this file#
-################################################################################
-################################################################################
-
-[DEFAULT]
-debug = true
-pdebug = false
-
-################################################################################
-## Email settings                                                             ##
-##                                                                            ##
-## Refer to the documentation ("Email settings") for more details.            ##
-##                                                                            ##
-## It is recommended to use a valid sender address that passes access         ##
-## validation and spam filtering in mail servers.                             ##
-################################################################################
-
-## 'From' header for application emails. You can optionally add a name.
-## Default:
-#app_email_from = Kallithea
-## Examples:
-#app_email_from = Kallithea <kallithea-noreply@example.com>
-#app_email_from = kallithea-noreply@example.com
-
-## Subject prefix for application emails.
-## A space between this prefix and the real subject is automatically added.
-## Default:
-#email_prefix =
-## Example:
-#email_prefix = [Kallithea]
-
-## Recipients for error emails and fallback recipients of application mails.
-## Multiple addresses can be specified, space-separated.
-## Only addresses are allowed, do not add any name part.
-## Default:
-#email_to =
-## Examples:
-#email_to = admin@example.com
-#email_to = admin@example.com another_admin@example.com
-
-## 'From' header for error emails. You can optionally add a name.
-## Default:
-#error_email_from = pylons@yourapp.com
-## Examples:
-#error_email_from = Kallithea Errors <kallithea-noreply@example.com>
-#error_email_from = paste_error@example.com
-
-## SMTP server settings
-## If specifying credentials, make sure to use secure connections.
-## Default: Send unencrypted unauthenticated mails to the specified smtp_server.
-## For "SSL", use smtp_use_ssl = true and smtp_port = 465.
-## For "STARTTLS", use smtp_use_tls = true and smtp_port = 587.
-#smtp_server = smtp.example.com
-#smtp_username =
-#smtp_password =
-#smtp_port = 25
-#smtp_use_ssl = false
-#smtp_use_tls = false
-
-[server:main]
-## Gearbox default web server ##
-#use = egg:gearbox#wsgiref
-## nr of worker threads to spawn
-#threadpool_workers = 1
-## max request before thread respawn
-#threadpool_max_requests = 100
-## option to use threads of process
-#use_threadpool = true
-
-## Gearbox gevent web server ##
-#use = egg:gearbox#gevent
-
-## WAITRESS ##
-use = egg:waitress#main
-## number of worker threads
-threads = 1
-## MAX BODY SIZE 100GB
-max_request_body_size = 107374182400
-## use poll instead of select, fixes fd limits, may not work on old
-## windows systems.
-#asyncore_use_poll = True
-
-## GUNICORN ##
-#use = egg:gunicorn#main
-## number of process workers. You must set `instance_id = *` when this option
-## is set to more than one worker
-#workers = 1
-## process name
-#proc_name = kallithea
-## type of worker class, one of sync, eventlet, gevent, tornado
-## recommended for bigger setup is using of of other than sync one
-#worker_class = sync
-#max_requests = 1000
-## amount of time a worker can handle request before it gets killed and
-## restarted
-#timeout = 3600
-
-## UWSGI ##
-## run with uwsgi --ini-paste-logged <inifile.ini>
-#[uwsgi]
-#socket = /tmp/uwsgi.sock
-#master = true
-#http = 127.0.0.1:5000
-
-## set as deamon and redirect all output to file
-#daemonize = ./uwsgi_kallithea.log
-
-## master process PID
-#pidfile = ./uwsgi_kallithea.pid
-
-## stats server with workers statistics, use uwsgitop
-## for monitoring, `uwsgitop 127.0.0.1:1717`
-#stats = 127.0.0.1:1717
-#memory-report = true
-
-## log 5XX errors
-#log-5xx = true
-
-## Set the socket listen queue size.
-#listen = 256
-
-## Gracefully Reload workers after the specified amount of managed requests
-## (avoid memory leaks).
-#max-requests = 1000
-
-## enable large buffers
-#buffer-size = 65535
-
-## socket and http timeouts ##
-#http-timeout = 3600
-#socket-timeout = 3600
-
-## Log requests slower than the specified number of milliseconds.
-#log-slow = 10
-
-## Exit if no app can be loaded.
-#need-app = true
-
-## Set lazy mode (load apps in workers instead of master).
-#lazy = true
-
-## scaling ##
-## set cheaper algorithm to use, if not set default will be used
-#cheaper-algo = spare
-
-## minimum number of workers to keep at all times
-#cheaper = 1
-
-## number of workers to spawn at startup
-#cheaper-initial = 1
-
-## maximum number of workers that can be spawned
-#workers = 4
-
-## how many workers should be spawned at a time
-#cheaper-step = 1
-
-## COMMON ##
-host = 127.0.0.1
-port = 5000
-
-## middleware for hosting the WSGI application under a URL prefix
-#[filter:proxy-prefix]
-#use = egg:PasteDeploy#prefix
-#prefix = /<your-prefix>
-
-[app:main]
-use = egg:kallithea
-## enable proxy prefix middleware
-#filter-with = proxy-prefix
-
-full_stack = true
-static_files = true
-## Available Languages:
-## cs de fr hu ja nl_BE pl pt_BR ru sk zh_CN zh_TW
-lang =
-cache_dir = %(here)s/data
-index_dir = %(here)s/data/index
-
-## perform a full repository scan on each server start, this should be
-## set to false after first startup, to allow faster server restarts.
-initial_repo_scan = false
-
-## uncomment and set this path to use archive download cache
-archive_cache_dir = %(here)s/tarballcache
-
-## change this to unique ID for security
-app_instance_uuid = ${app_instance_uuid}
-
-## cut off limit for large diffs (size in bytes)
-cut_off_limit = 256000
-
-## force https in Kallithea, fixes https redirects, assumes it's always https
-force_https = false
-
-## use Strict-Transport-Security headers
-use_htsts = false
-
-## number of commits stats will parse on each iteration
-commit_parse_limit = 25
-
-## path to git executable
-git_path = git
-
-## git rev filter option, --all is the default filter, if you need to
-## hide all refs in changelog switch this to --branches --tags
-#git_rev_filter = --branches --tags
-
-## RSS feed options
-rss_cut_off_limit = 256000
-rss_items_per_page = 10
-rss_include_diff = false
-
-## options for showing and identifying changesets
-show_sha_length = 12
-show_revision_number = false
-
-## Canonical URL to use when creating full URLs in UI and texts.
-## Useful when the site is available under different names or protocols.
-## Defaults to what is provided in the WSGI environment.
-#canonical_url = https://kallithea.example.com/repos
-
-## gist URL alias, used to create nicer urls for gist. This should be an
-## url that does rewrites to _admin/gists/<gistid>.
-## example: http://gist.example.com/{gistid}. Empty means use the internal
-## Kallithea url, ie. http[s]://kallithea.example.com/_admin/gists/<gistid>
-gist_alias_url =
-
-## white list of API enabled controllers. This allows to add list of
-## controllers to which access will be enabled by api_key. eg: to enable
-## api access to raw_files put `FilesController:raw`, to enable access to patches
-## add `ChangesetController:changeset_patch`. This list should be "," separated
-## Syntax is <ControllerClass>:<function>. Check debug logs for generated names
-## Recommended settings below are commented out:
-api_access_controllers_whitelist =
-#    ChangesetController:changeset_patch,
-#    ChangesetController:changeset_raw,
-#    FilesController:raw,
-#    FilesController:archivefile
-
-## default encoding used to convert from and to unicode
-## can be also a comma separated list of encoding in case of mixed encodings
-default_encoding = utf8
-
-## issue tracker for Kallithea (leave blank to disable, absent for default)
-#bugtracker = https://bitbucket.org/conservancy/kallithea/issues
-
-## issue tracking mapping for commits messages
-## comment out issue_pat, issue_server, issue_prefix to enable
-
-## pattern to get the issues from commit messages
-## default one used here is #<numbers> with a regex passive group for `#`
-## {id} will be all groups matched from this pattern
-
-issue_pat = (?:\s*#)(\d+)
-
-## server url to the issue, each {id} will be replaced with match
-## fetched from the regex and {repo} is replaced with full repository name
-## including groups {repo_name} is replaced with just name of repo
-
-issue_server_link = https://issues.example.com/{repo}/issue/{id}
-
-## prefix to add to link to indicate it's an url
-## #314 will be replaced by <issue_prefix><id>
-
-issue_prefix = #
-
-## issue_pat, issue_server_link, issue_prefix can have suffixes to specify
-## multiple patterns, to other issues server, wiki or others
-## below an example how to create a wiki pattern
-# wiki-some-id -> https://wiki.example.com/some-id
-
-#issue_pat_wiki = (?:wiki-)(.+)
-#issue_server_link_wiki = https://wiki.example.com/{id}
-#issue_prefix_wiki = WIKI-
-
-## alternative return HTTP header for failed authentication. Default HTTP
-## response is 401 HTTPUnauthorized. Currently Mercurial clients have trouble with
-## handling that. Set this variable to 403 to return HTTPForbidden
-auth_ret_code =
-
-## locking return code. When repository is locked return this HTTP code. 2XX
-## codes don't break the transactions while 4XX codes do
-lock_ret_code = 423
-
-## allows to change the repository location in settings page
-allow_repo_location_change = True
-
-## allows to setup custom hooks in settings page
-allow_custom_hooks_settings = True
-
-## extra extensions for indexing, space separated and without the leading '.'.
-# index.extensions =
-#    gemfile
-#    lock
-
-## extra filenames for indexing, space separated
-# index.filenames =
-#    .dockerignore
-#    .editorconfig
-#    INSTALL
-#    CHANGELOG
-
-####################################
-###        CELERY CONFIG        ####
-####################################
-
-use_celery = false
-
-## Example: connect to the virtual host 'rabbitmqhost' on localhost as rabbitmq:
-broker.url = amqp://rabbitmq:qewqew@localhost:5672/rabbitmqhost
-
-celery.imports = kallithea.lib.celerylib.tasks
-celery.accept.content = pickle
-celery.result.backend = amqp
-celery.result.dburi = amqp://
-celery.result.serialier = json
-
-#celery.send.task.error.emails = true
-#celery.amqp.task.result.expires = 18000
-
-celeryd.concurrency = 2
-celeryd.max.tasks.per.child = 1
-
-## If true, tasks will never be sent to the queue, but executed locally instead.
-celery.always.eager = false
-
-####################################
-###         BEAKER CACHE        ####
-####################################
-
-beaker.cache.data_dir = %(here)s/data/cache/data
-beaker.cache.lock_dir = %(here)s/data/cache/lock
-
-beaker.cache.regions = short_term,long_term,sql_cache_short
-
-beaker.cache.short_term.type = memory
-beaker.cache.short_term.expire = 60
-beaker.cache.short_term.key_length = 256
-
-beaker.cache.long_term.type = memory
-beaker.cache.long_term.expire = 36000
-beaker.cache.long_term.key_length = 256
-
-beaker.cache.sql_cache_short.type = memory
-beaker.cache.sql_cache_short.expire = 10
-beaker.cache.sql_cache_short.key_length = 256
-
-####################################
-###       BEAKER SESSION        ####
-####################################
-
-## Name of session cookie. Should be unique for a given host and path, even when running
-## on different ports. Otherwise, cookie sessions will be shared and messed up.
-beaker.session.key = kallithea
-## Sessions should always only be accessible by the browser, not directly by JavaScript.
-beaker.session.httponly = true
-## Session lifetime. 2592000 seconds is 30 days.
-beaker.session.timeout = 2592000
-
-## Server secret used with HMAC to ensure integrity of cookies.
-beaker.session.secret = ${app_instance_uuid}
-## Further, encrypt the data with AES.
-#beaker.session.encrypt_key = <key_for_encryption>
-#beaker.session.validate_key = <validation_key>
-
-## Type of storage used for the session, current types are
-## dbm, file, memcached, database, and memory.
-
-## File system storage of session data. (default)
-#beaker.session.type = file
-
-## Cookie only, store all session data inside the cookie. Requires secure secrets.
-#beaker.session.type = cookie
-
-## Database storage of session data.
-#beaker.session.type = ext:database
-#beaker.session.sa.url = postgresql://postgres:qwe@localhost/kallithea
-#beaker.session.table_name = db_session
-
-############################
-## ERROR HANDLING SYSTEMS ##
-############################
-
-####################
-### [appenlight] ###
-####################
-
-## AppEnlight is tailored to work with Kallithea, see
-## http://appenlight.com for details how to obtain an account
-## you must install python package `appenlight_client` to make it work
-
-## appenlight enabled
-appenlight = false
-
-appenlight.server_url = https://api.appenlight.com
-appenlight.api_key = YOUR_API_KEY
-
-## TWEAK AMOUNT OF INFO SENT HERE
-
-## enables 404 error logging (default False)
-appenlight.report_404 = false
-
-## time in seconds after request is considered being slow (default 1)
-appenlight.slow_request_time = 1
-
-## record slow requests in application
-## (needs to be enabled for slow datastore recording and time tracking)
-appenlight.slow_requests = true
-
-## enable hooking to application loggers
-#appenlight.logging = true
-
-## minimum log level for log capture
-#appenlight.logging.level = WARNING
-
-## send logs only from erroneous/slow requests
-## (saves API quota for intensive logging)
-appenlight.logging_on_error = false
-
-## list of additional keywords that should be grabbed from environ object
-## can be string with comma separated list of words in lowercase
-## (by default client will always send following info:
-## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that
-## start with HTTP* this list be extended with additional keywords here
-appenlight.environ_keys_whitelist =
-
-## list of keywords that should be blanked from request object
-## can be string with comma separated list of words in lowercase
-## (by default client will always blank keys that contain following words
-## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'
-## this list be extended with additional keywords set here
-appenlight.request_keys_blacklist =
-
-## list of namespaces that should be ignores when gathering log entries
-## can be string with comma separated list of namespaces
-## (by default the client ignores own entries: appenlight_client.client)
-appenlight.log_namespace_blacklist =
-
-################
-### [sentry] ###
-################
-
-## sentry is a alternative open source error aggregator
-## you must install python packages `sentry` and `raven` to enable
-
-sentry.dsn = YOUR_DNS
-sentry.servers =
-sentry.name =
-sentry.key =
-sentry.public_key =
-sentry.secret_key =
-sentry.project =
-sentry.site =
-sentry.include_paths =
-sentry.exclude_paths =
-
-################################################################################
-## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*  ##
-## Debug mode will enable the interactive debugging tool, allowing ANYONE to  ##
-## execute malicious code after an exception is raised.                       ##
-################################################################################
-set debug = false
-
-##################################
-###       LOGVIEW CONFIG       ###
-##################################
-
-logview.sqlalchemy = #faa
-logview.pylons.templating = #bfb
-logview.pylons.util = #eee
-
-#########################################################
-### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG    ###
-#########################################################
-
-# SQLITE [default]
-sqlalchemy.url = sqlite:///%(here)s/kallithea.db?timeout=60
-
-# POSTGRESQL
-#sqlalchemy.url = postgresql://user:pass@localhost/kallithea
-
-# MySQL
-#sqlalchemy.url = mysql://user:pass@localhost/kallithea?charset=utf8
-
-# see sqlalchemy docs for others
-
-sqlalchemy.echo = false
-sqlalchemy.pool_recycle = 3600
-
-################################
-### ALEMBIC CONFIGURATION   ####
-################################
-
-[alembic]
-script_location = kallithea:alembic
-
-################################
-### LOGGING CONFIGURATION   ####
-################################
-
-[loggers]
-keys = root, routes, kallithea, sqlalchemy, gearbox, beaker, templates, whoosh_indexer
-
-[handlers]
-keys = console, console_sql
-
-[formatters]
-keys = generic, color_formatter, color_formatter_sql
-
-#############
-## LOGGERS ##
-#############
-
-[logger_root]
-level = NOTSET
-handlers = console
-
-[logger_routes]
-level = DEBUG
-handlers =
-qualname = routes.middleware
-## "level = DEBUG" logs the route matched and routing variables.
-propagate = 1
-
-[logger_beaker]
-level = DEBUG
-handlers =
-qualname = beaker.container
-propagate = 1
-
-[logger_templates]
-level = INFO
-handlers =
-qualname = pylons.templating
-propagate = 1
-
-[logger_kallithea]
-level = DEBUG
-handlers =
-qualname = kallithea
-propagate = 1
-
-[logger_gearbox]
-level = DEBUG
-handlers =
-qualname = gearbox
-propagate = 1
-
-[logger_sqlalchemy]
-level = INFO
-handlers = console_sql
-qualname = sqlalchemy.engine
-propagate = 0
-
-[logger_whoosh_indexer]
-level = DEBUG
-handlers =
-qualname = whoosh_indexer
-propagate = 1
-
-##############
-## HANDLERS ##
-##############
-
-[handler_console]
-class = StreamHandler
-args = (sys.stderr,)
-level = INFO
-formatter = generic
-
-[handler_console_sql]
-class = StreamHandler
-args = (sys.stderr,)
-level = WARN
-formatter = generic
-
-################
-## FORMATTERS ##
-################
-
-[formatter_generic]
-format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
-datefmt = %Y-%m-%d %H:%M:%S
-
-[formatter_color_formatter]
-class = kallithea.lib.colored_formatter.ColorFormatter
-format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
-datefmt = %Y-%m-%d %H:%M:%S
-
-[formatter_color_formatter_sql]
-class = kallithea.lib.colored_formatter.ColorFormatterSql
-format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
-datefmt = %Y-%m-%d %H:%M:%S
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/lib/paster_commands/make_config.py	Mon Sep 12 17:50:11 2016 +0200
@@ -0,0 +1,143 @@
+# -*- coding: utf-8 -*-
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# 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 General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+kallithea.lib.paster_commands.make_config
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+make-config gearbox command for Kallithea
+
+:license: GPLv3, see LICENSE.md for more details.
+"""
+
+
+import os
+import sys
+import uuid
+import argparse
+from mako.template import Template
+TMPL = 'template.ini.mako'
+here = os.path.dirname(os.path.abspath(__file__))
+
+from kallithea.lib.paster_commands.common import ask_ok, BasePasterCommand
+
+
+class Command(BasePasterCommand):
+    """Kallithea: Create a new config file
+
+    make-config is part of a two-phase installation process (the
+    second phase is setup-app). make-config creates a bare configuration
+    file (possibly filling in defaults from the extra
+    variables you give).
+    """
+
+    takes_config_file = False # at least not an existing one ...
+
+    def take_action(self, args):
+        _run(args)
+
+    def get_parser(self, prog_name):
+        parser = super(Command, self).get_parser(prog_name)
+
+        parser.add_argument('config_file', nargs='?',
+            help='application config file to write')
+
+        parser.add_argument('custom', nargs=argparse.REMAINDER,
+            help='custom values to write to config file')
+
+        parser.add_argument('--show-defaults', action='store_true',
+            help="Show the default values that can be overridden")
+
+        return parser
+
+
+def _escape_split(text, sep):
+    """
+    Allows for escaping of the separator: e.g. arg='foo\, bar'
+
+    It should be noted that the way bash et. al. do command line parsing, those
+    single quotes are required. a shameless ripoff from fabric project.
+
+    """
+    escaped_sep = r'\%s' % sep
+
+    if escaped_sep not in text:
+        return text.split(sep)
+
+    before, _, after = text.partition(escaped_sep)
+    startlist = before.split(sep)  # a regular split is fine here
+    unfinished = startlist[-1]
+    startlist = startlist[:-1]
+
+    # recurse because there may be more escaped separators
+    endlist = _escape_split(after, sep)
+
+    # finish building the escaped value. we use endlist[0] because the first
+    # part of the string sent in recursion is the rest of the escaped value.
+    unfinished += sep + endlist[0]
+
+    return startlist + [unfinished] + endlist[1:]  # put together all the parts
+
+
+def _run(args):
+    if args.config_file is None:
+        if not args.show_defaults:
+            raise ValueError("Missing argument: config_file")
+    else:
+        if args.show_defaults:
+            raise ValueError("Can't specify both config_file and --show_defaults")
+
+    # defaults that can be overwritten by arguments
+    tmpl_stored_args = {
+        'http_server': 'waitress',
+        'lang': 'en',
+        'database_engine': 'sqlite',
+        'host': '127.0.0.1',
+        'port': 5000,
+        'error_aggregation_service': None,
+    }
+    for custom in args.custom:
+        # parse arguments
+        kwargs = {}
+        for el in _escape_split(custom, ','):
+            kv = _escape_split(el, '=')
+            if len(kv) == 2:
+                k, v = kv
+                kwargs[k] = v
+        # update our template stored args
+        tmpl_stored_args.update(kwargs)
+
+    if args.show_defaults:
+        for k,v in tmpl_stored_args.iteritems():
+            print '%s=%s' % (k, v)
+        sys.exit(0)
+
+    # use default that cannot be replaced
+    tmpl_stored_args.update({
+        'uuid': lambda: uuid.uuid4().hex,
+        'here': os.path.dirname(os.path.abspath(args.config_file)),
+    })
+    try:
+        # built in template
+        tmpl_file = os.path.join(here, TMPL)
+
+        with open(tmpl_file, 'rb') as f:
+            tmpl_data = f.read().decode('utf-8')
+            tmpl = Template(tmpl_data).render(**tmpl_stored_args)
+        with open(args.config_file, 'wb') as f:
+            f.write(tmpl.encode('utf-8'))
+        print 'Wrote new config file in %s' % (os.path.abspath(args.config_file))
+
+    except Exception:
+        from mako import exceptions
+        print exceptions.text_error_template().render()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kallithea/lib/paster_commands/template.ini.mako	Mon Sep 12 17:50:11 2016 +0200
@@ -0,0 +1,610 @@
+## -*- coding: utf-8 -*-
+<%text>################################################################################</%text>
+<%text>################################################################################</%text>
+# Kallithea - config file generated with kallithea-config                      #
+<%text>################################################################################</%text>
+<%text>################################################################################</%text>
+
+[DEFAULT]
+debug = true
+pdebug = false
+
+<%text>################################################################################</%text>
+<%text>## Email settings                                                             ##</%text>
+<%text>##                                                                            ##</%text>
+<%text>## Refer to the documentation ("Email settings") for more details.            ##</%text>
+<%text>##                                                                            ##</%text>
+<%text>## It is recommended to use a valid sender address that passes access         ##</%text>
+<%text>## validation and spam filtering in mail servers.                             ##</%text>
+<%text>################################################################################</%text>
+
+<%text>## 'From' header for application emails. You can optionally add a name.</%text>
+<%text>## Default:</%text>
+#app_email_from = Kallithea
+<%text>## Examples:</%text>
+#app_email_from = Kallithea <kallithea-noreply@example.com>
+#app_email_from = kallithea-noreply@example.com
+
+<%text>## Subject prefix for application emails.</%text>
+<%text>## A space between this prefix and the real subject is automatically added.</%text>
+<%text>## Default:</%text>
+#email_prefix =
+<%text>## Example:</%text>
+#email_prefix = [Kallithea]
+
+<%text>## Recipients for error emails and fallback recipients of application mails.</%text>
+<%text>## Multiple addresses can be specified, space-separated.</%text>
+<%text>## Only addresses are allowed, do not add any name part.</%text>
+<%text>## Default:</%text>
+#email_to =
+<%text>## Examples:</%text>
+#email_to = admin@example.com
+#email_to = admin@example.com another_admin@example.com
+
+<%text>## 'From' header for error emails. You can optionally add a name.</%text>
+<%text>## Default:</%text>
+#error_email_from = pylons@yourapp.com
+<%text>## Examples:</%text>
+#error_email_from = Kallithea Errors <kallithea-noreply@example.com>
+#error_email_from = paste_error@example.com
+
+<%text>## SMTP server settings</%text>
+<%text>## If specifying credentials, make sure to use secure connections.</%text>
+<%text>## Default: Send unencrypted unauthenticated mails to the specified smtp_server.</%text>
+<%text>## For "SSL", use smtp_use_ssl = true and smtp_port = 465.</%text>
+<%text>## For "STARTTLS", use smtp_use_tls = true and smtp_port = 587.</%text>
+#smtp_server = smtp.example.com
+#smtp_username =
+#smtp_password =
+#smtp_port = 25
+#smtp_use_ssl = false
+#smtp_use_tls = false
+
+[server:main]
+%if http_server == 'gearbox':
+<%text>## Gearbox default web server ##</%text>
+use = egg:gearbox#wsgiref
+<%text>## nr of worker threads to spawn</%text>
+threadpool_workers = 1
+<%text>## max request before thread respawn</%text>
+threadpool_max_requests = 100
+<%text>## option to use threads of process</%text>
+use_threadpool = true
+
+%elif http_server == 'gevent':
+<%text>## Gearbox gevent web server ##</%text>
+use = egg:gearbox#gevent
+
+%elif http_server == 'waitress':
+<%text>## WAITRESS ##</%text>
+use = egg:waitress#main
+<%text>## number of worker threads</%text>
+threads = 1
+<%text>## MAX BODY SIZE 100GB</%text>
+max_request_body_size = 107374182400
+<%text>## use poll instead of select, fixes fd limits, may not work on old</%text>
+<%text>## windows systems.</%text>
+#asyncore_use_poll = True
+
+%elif http_server == 'gunicorn':
+<%text>## GUNICORN ##</%text>
+use = egg:gunicorn#main
+<%text>## number of process workers. You must set `instance_id = *` when this option</%text>
+<%text>## is set to more than one worker</%text>
+workers = 1
+<%text>## process name</%text>
+proc_name = kallithea
+<%text>## type of worker class, one of sync, eventlet, gevent, tornado</%text>
+<%text>## recommended for bigger setup is using of of other than sync one</%text>
+worker_class = sync
+max_requests = 1000
+<%text>## amount of time a worker can handle request before it gets killed and</%text>
+<%text>## restarted</%text>
+timeout = 3600
+
+%elif http_server == 'uwsgi':
+<%text>## UWSGI ##</%text>
+<%text>## run with uwsgi --ini-paste-logged <inifile.ini></%text>
+[uwsgi]
+socket = /tmp/uwsgi.sock
+master = true
+http = 127.0.0.1:5000
+
+<%text>## set as deamon and redirect all output to file</%text>
+#daemonize = ./uwsgi_kallithea.log
+
+<%text>## master process PID</%text>
+pidfile = ./uwsgi_kallithea.pid
+
+<%text>## stats server with workers statistics, use uwsgitop</%text>
+<%text>## for monitoring, `uwsgitop 127.0.0.1:1717`</%text>
+stats = 127.0.0.1:1717
+memory-report = true
+
+<%text>## log 5XX errors</%text>
+log-5xx = true
+
+<%text>## Set the socket listen queue size.</%text>
+listen = 256
+
+<%text>## Gracefully Reload workers after the specified amount of managed requests</%text>
+<%text>## (avoid memory leaks).</%text>
+max-requests = 1000
+
+<%text>## enable large buffers</%text>
+buffer-size = 65535
+
+<%text>## socket and http timeouts ##</%text>
+http-timeout = 3600
+socket-timeout = 3600
+
+<%text>## Log requests slower than the specified number of milliseconds.</%text>
+log-slow = 10
+
+<%text>## Exit if no app can be loaded.</%text>
+need-app = true
+
+<%text>## Set lazy mode (load apps in workers instead of master).</%text>
+lazy = true
+
+<%text>## scaling ##</%text>
+<%text>## set cheaper algorithm to use, if not set default will be used</%text>
+cheaper-algo = spare
+
+<%text>## minimum number of workers to keep at all times</%text>
+cheaper = 1
+
+<%text>## number of workers to spawn at startup</%text>
+cheaper-initial = 1
+
+<%text>## maximum number of workers that can be spawned</%text>
+workers = 4
+
+<%text>## how many workers should be spawned at a time</%text>
+cheaper-step = 1
+
+%endif
+<%text>## COMMON ##</%text>
+host = ${host}
+port = ${port}
+
+<%text>## middleware for hosting the WSGI application under a URL prefix</%text>
+#[filter:proxy-prefix]
+#use = egg:PasteDeploy#prefix
+#prefix = /<your-prefix>
+
+[app:main]
+use = egg:kallithea
+<%text>## enable proxy prefix middleware</%text>
+#filter-with = proxy-prefix
+
+full_stack = true
+static_files = true
+<%text>## Available Languages:</%text>
+<%text>## cs de fr hu ja nl_BE pl pt_BR ru sk zh_CN zh_TW</%text>
+lang =
+cache_dir = ${here}/data
+index_dir = ${here}/data/index
+
+<%text>## perform a full repository scan on each server start, this should be</%text>
+<%text>## set to false after first startup, to allow faster server restarts.</%text>
+initial_repo_scan = false
+
+<%text>## uncomment and set this path to use archive download cache</%text>
+archive_cache_dir = ${here}/tarballcache
+
+<%text>## change this to unique ID for security</%text>
+app_instance_uuid = ${uuid()}
+
+<%text>## cut off limit for large diffs (size in bytes)</%text>
+cut_off_limit = 256000
+
+<%text>## force https in Kallithea, fixes https redirects, assumes it's always https</%text>
+force_https = false
+
+<%text>## use Strict-Transport-Security headers</%text>
+use_htsts = false
+
+<%text>## number of commits stats will parse on each iteration</%text>
+commit_parse_limit = 25
+
+<%text>## path to git executable</%text>
+git_path = git
+
+<%text>## git rev filter option, --all is the default filter, if you need to</%text>
+<%text>## hide all refs in changelog switch this to --branches --tags</%text>
+#git_rev_filter = --branches --tags
+
+<%text>## RSS feed options</%text>
+rss_cut_off_limit = 256000
+rss_items_per_page = 10
+rss_include_diff = false
+
+<%text>## options for showing and identifying changesets</%text>
+show_sha_length = 12
+show_revision_number = false
+
+<%text>## Canonical URL to use when creating full URLs in UI and texts.</%text>
+<%text>## Useful when the site is available under different names or protocols.</%text>
+<%text>## Defaults to what is provided in the WSGI environment.</%text>
+#canonical_url = https://kallithea.example.com/repos
+
+<%text>## gist URL alias, used to create nicer urls for gist. This should be an</%text>
+<%text>## url that does rewrites to _admin/gists/<gistid>.</%text>
+<%text>## example: http://gist.example.com/{gistid}. Empty means use the internal</%text>
+<%text>## Kallithea url, ie. http[s]://kallithea.example.com/_admin/gists/<gistid></%text>
+gist_alias_url =
+
+<%text>## white list of API enabled controllers. This allows to add list of</%text>
+<%text>## controllers to which access will be enabled by api_key. eg: to enable</%text>
+<%text>## api access to raw_files put `FilesController:raw`, to enable access to patches</%text>
+<%text>## add `ChangesetController:changeset_patch`. This list should be "," separated</%text>
+<%text>## Syntax is <ControllerClass>:<function>. Check debug logs for generated names</%text>
+<%text>## Recommended settings below are commented out:</%text>
+api_access_controllers_whitelist =
+#    ChangesetController:changeset_patch,
+#    ChangesetController:changeset_raw,
+#    FilesController:raw,
+#    FilesController:archivefile
+
+<%text>## default encoding used to convert from and to unicode</%text>
+<%text>## can be also a comma separated list of encoding in case of mixed encodings</%text>
+default_encoding = utf8
+
+<%text>## issue tracker for Kallithea (leave blank to disable, absent for default)</%text>
+#bugtracker = https://bitbucket.org/conservancy/kallithea/issues
+
+<%text>## issue tracking mapping for commits messages</%text>
+<%text>## comment out issue_pat, issue_server, issue_prefix to enable</%text>
+
+<%text>## pattern to get the issues from commit messages</%text>
+<%text>## default one used here is #<numbers> with a regex passive group for `#`</%text>
+<%text>## {id} will be all groups matched from this pattern</%text>
+
+issue_pat = (?:\s*#)(\d+)
+
+<%text>## server url to the issue, each {id} will be replaced with match</%text>
+<%text>## fetched from the regex and {repo} is replaced with full repository name</%text>
+<%text>## including groups {repo_name} is replaced with just name of repo</%text>
+
+issue_server_link = https://issues.example.com/{repo}/issue/{id}
+
+<%text>## prefix to add to link to indicate it's an url</%text>
+<%text>## #314 will be replaced by <issue_prefix><id></%text>
+
+issue_prefix = #
+
+<%text>## issue_pat, issue_server_link, issue_prefix can have suffixes to specify</%text>
+<%text>## multiple patterns, to other issues server, wiki or others</%text>
+<%text>## below an example how to create a wiki pattern</%text>
+# wiki-some-id -> https://wiki.example.com/some-id
+
+#issue_pat_wiki = (?:wiki-)(.+)
+#issue_server_link_wiki = https://wiki.example.com/{id}
+#issue_prefix_wiki = WIKI-
+
+<%text>## alternative return HTTP header for failed authentication. Default HTTP</%text>
+<%text>## response is 401 HTTPUnauthorized. Currently Mercurial clients have trouble with</%text>
+<%text>## handling that. Set this variable to 403 to return HTTPForbidden</%text>
+auth_ret_code =
+
+<%text>## locking return code. When repository is locked return this HTTP code. 2XX</%text>
+<%text>## codes don't break the transactions while 4XX codes do</%text>
+lock_ret_code = 423
+
+<%text>## allows to change the repository location in settings page</%text>
+allow_repo_location_change = True
+
+<%text>## allows to setup custom hooks in settings page</%text>
+allow_custom_hooks_settings = True
+
+<%text>## extra extensions for indexing, space separated and without the leading '.'.</%text>
+# index.extensions =
+#    gemfile
+#    lock
+
+<%text>## extra filenames for indexing, space separated</%text>
+# index.filenames =
+#    .dockerignore
+#    .editorconfig
+#    INSTALL
+#    CHANGELOG
+
+<%text>####################################</%text>
+<%text>###        CELERY CONFIG        ####</%text>
+<%text>####################################</%text>
+
+use_celery = false
+
+<%text>## Example: connect to the virtual host 'rabbitmqhost' on localhost as rabbitmq:</%text>
+broker.url = amqp://rabbitmq:qewqew@localhost:5672/rabbitmqhost
+
+celery.imports = kallithea.lib.celerylib.tasks
+celery.accept.content = pickle
+celery.result.backend = amqp
+celery.result.dburi = amqp://
+celery.result.serialier = json
+
+#celery.send.task.error.emails = true
+#celery.amqp.task.result.expires = 18000
+
+celeryd.concurrency = 2
+celeryd.max.tasks.per.child = 1
+
+<%text>## If true, tasks will never be sent to the queue, but executed locally instead.</%text>
+celery.always.eager = false
+
+<%text>####################################</%text>
+<%text>###         BEAKER CACHE        ####</%text>
+<%text>####################################</%text>
+
+beaker.cache.data_dir = ${here}/data/cache/data
+beaker.cache.lock_dir = ${here}/data/cache/lock
+
+beaker.cache.regions = short_term,long_term,sql_cache_short
+
+beaker.cache.short_term.type = memory
+beaker.cache.short_term.expire = 60
+beaker.cache.short_term.key_length = 256
+
+beaker.cache.long_term.type = memory
+beaker.cache.long_term.expire = 36000
+beaker.cache.long_term.key_length = 256
+
+beaker.cache.sql_cache_short.type = memory
+beaker.cache.sql_cache_short.expire = 10
+beaker.cache.sql_cache_short.key_length = 256
+
+<%text>####################################</%text>
+<%text>###       BEAKER SESSION        ####</%text>
+<%text>####################################</%text>
+
+<%text>## Name of session cookie. Should be unique for a given host and path, even when running</%text>
+<%text>## on different ports. Otherwise, cookie sessions will be shared and messed up.</%text>
+beaker.session.key = kallithea
+<%text>## Sessions should always only be accessible by the browser, not directly by JavaScript.</%text>
+beaker.session.httponly = true
+<%text>## Session lifetime. 2592000 seconds is 30 days.</%text>
+beaker.session.timeout = 2592000
+
+<%text>## Server secret used with HMAC to ensure integrity of cookies.</%text>
+beaker.session.secret = ${uuid()}
+<%text>## Further, encrypt the data with AES.</%text>
+#beaker.session.encrypt_key = <key_for_encryption>
+#beaker.session.validate_key = <validation_key>
+
+<%text>## Type of storage used for the session, current types are</%text>
+<%text>## dbm, file, memcached, database, and memory.</%text>
+
+<%text>## File system storage of session data. (default)</%text>
+#beaker.session.type = file
+
+<%text>## Cookie only, store all session data inside the cookie. Requires secure secrets.</%text>
+#beaker.session.type = cookie
+
+<%text>## Database storage of session data.</%text>
+#beaker.session.type = ext:database
+#beaker.session.sa.url = postgresql://postgres:qwe@localhost/kallithea
+#beaker.session.table_name = db_session
+
+%if error_aggregation_service == 'appenlight':
+<%text>############################</%text>
+<%text>## ERROR HANDLING SYSTEMS ##</%text>
+<%text>############################</%text>
+
+<%text>####################</%text>
+<%text>### [appenlight] ###</%text>
+<%text>####################</%text>
+
+<%text>## AppEnlight is tailored to work with Kallithea, see</%text>
+<%text>## http://appenlight.com for details how to obtain an account</%text>
+<%text>## you must install python package `appenlight_client` to make it work</%text>
+
+<%text>## appenlight enabled</%text>
+appenlight = false
+
+appenlight.server_url = https://api.appenlight.com
+appenlight.api_key = YOUR_API_KEY
+
+<%text>## TWEAK AMOUNT OF INFO SENT HERE</%text>
+
+<%text>## enables 404 error logging (default False)</%text>
+appenlight.report_404 = false
+
+<%text>## time in seconds after request is considered being slow (default 1)</%text>
+appenlight.slow_request_time = 1
+
+<%text>## record slow requests in application</%text>
+<%text>## (needs to be enabled for slow datastore recording and time tracking)</%text>
+appenlight.slow_requests = true
+
+<%text>## enable hooking to application loggers</%text>
+#appenlight.logging = true
+
+<%text>## minimum log level for log capture</%text>
+#appenlight.logging.level = WARNING
+
+<%text>## send logs only from erroneous/slow requests</%text>
+<%text>## (saves API quota for intensive logging)</%text>
+appenlight.logging_on_error = false
+
+<%text>## list of additional keywords that should be grabbed from environ object</%text>
+<%text>## can be string with comma separated list of words in lowercase</%text>
+<%text>## (by default client will always send following info:</%text>
+<%text>## 'REMOTE_USER', 'REMOTE_ADDR', 'SERVER_NAME', 'CONTENT_TYPE' + all keys that</%text>
+<%text>## start with HTTP* this list be extended with additional keywords here</%text>
+appenlight.environ_keys_whitelist =
+
+<%text>## list of keywords that should be blanked from request object</%text>
+<%text>## can be string with comma separated list of words in lowercase</%text>
+<%text>## (by default client will always blank keys that contain following words</%text>
+<%text>## 'password', 'passwd', 'pwd', 'auth_tkt', 'secret', 'csrf'</%text>
+<%text>## this list be extended with additional keywords set here</%text>
+appenlight.request_keys_blacklist =
+
+<%text>## list of namespaces that should be ignores when gathering log entries</%text>
+<%text>## can be string with comma separated list of namespaces</%text>
+<%text>## (by default the client ignores own entries: appenlight_client.client)</%text>
+appenlight.log_namespace_blacklist =
+
+%elif error_aggregation_service == 'sentry':
+<%text>################</%text>
+<%text>### [sentry] ###</%text>
+<%text>################</%text>
+
+<%text>## sentry is a alternative open source error aggregator</%text>
+<%text>## you must install python packages `sentry` and `raven` to enable</%text>
+
+sentry.dsn = YOUR_DNS
+sentry.servers =
+sentry.name =
+sentry.key =
+sentry.public_key =
+sentry.secret_key =
+sentry.project =
+sentry.site =
+sentry.include_paths =
+sentry.exclude_paths =
+
+%endif
+<%text>################################################################################</%text>
+<%text>## WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*  ##</%text>
+<%text>## Debug mode will enable the interactive debugging tool, allowing ANYONE to  ##</%text>
+<%text>## execute malicious code after an exception is raised.                       ##</%text>
+<%text>################################################################################</%text>
+set debug = false
+
+<%text>##################################</%text>
+<%text>###       LOGVIEW CONFIG       ###</%text>
+<%text>##################################</%text>
+
+logview.sqlalchemy = #faa
+logview.pylons.templating = #bfb
+logview.pylons.util = #eee
+
+<%text>#########################################################</%text>
+<%text>### DB CONFIGS - EACH DB WILL HAVE IT'S OWN CONFIG    ###</%text>
+<%text>#########################################################</%text>
+
+%if database_engine == 'sqlite':
+# SQLITE [default]
+sqlalchemy.url = sqlite:///${here}/kallithea.db?timeout=60
+
+%elif database_engine == 'postgres':
+# POSTGRESQL
+sqlalchemy.url = postgresql://user:pass@localhost/kallithea
+
+%elif database_engine == 'mysql':
+# MySQL
+sqlalchemy.url = mysql://user:pass@localhost/kallithea?charset=utf8
+
+%endif
+# see sqlalchemy docs for others
+
+sqlalchemy.echo = false
+sqlalchemy.pool_recycle = 3600
+
+<%text>################################</%text>
+<%text>### ALEMBIC CONFIGURATION   ####</%text>
+<%text>################################</%text>
+
+[alembic]
+script_location = kallithea:alembic
+
+<%text>################################</%text>
+<%text>### LOGGING CONFIGURATION   ####</%text>
+<%text>################################</%text>
+
+[loggers]
+keys = root, routes, kallithea, sqlalchemy, gearbox, beaker, templates, whoosh_indexer
+
+[handlers]
+keys = console, console_sql
+
+[formatters]
+keys = generic, color_formatter, color_formatter_sql
+
+<%text>#############</%text>
+<%text>## LOGGERS ##</%text>
+<%text>#############</%text>
+
+[logger_root]
+level = NOTSET
+handlers = console
+
+[logger_routes]
+level = DEBUG
+handlers =
+qualname = routes.middleware
+<%text>## "level = DEBUG" logs the route matched and routing variables.</%text>
+propagate = 1
+
+[logger_beaker]
+level = DEBUG
+handlers =
+qualname = beaker.container
+propagate = 1
+
+[logger_templates]
+level = INFO
+handlers =
+qualname = pylons.templating
+propagate = 1
+
+[logger_kallithea]
+level = DEBUG
+handlers =
+qualname = kallithea
+propagate = 1
+
+[logger_gearbox]
+level = DEBUG
+handlers =
+qualname = gearbox
+propagate = 1
+
+[logger_sqlalchemy]
+level = INFO
+handlers = console_sql
+qualname = sqlalchemy.engine
+propagate = 0
+
+[logger_whoosh_indexer]
+level = DEBUG
+handlers =
+qualname = whoosh_indexer
+propagate = 1
+
+<%text>##############</%text>
+<%text>## HANDLERS ##</%text>
+<%text>##############</%text>
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = INFO
+formatter = generic
+
+[handler_console_sql]
+class = StreamHandler
+args = (sys.stderr,)
+level = WARN
+formatter = generic
+
+<%text>################</%text>
+<%text>## FORMATTERS ##</%text>
+<%text>################</%text>
+
+[formatter_generic]
+format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %Y-%m-%d %H:%M:%S
+
+[formatter_color_formatter]
+class = kallithea.lib.colored_formatter.ColorFormatter
+format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %Y-%m-%d %H:%M:%S
+
+[formatter_color_formatter_sql]
+class = kallithea.lib.colored_formatter.ColorFormatterSql
+format = %(asctime)s.%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %Y-%m-%d %H:%M:%S
--- a/scripts/generate-ini.py	Tue Oct 25 21:32:24 2016 +0200
+++ b/scripts/generate-ini.py	Mon Sep 12 17:50:11 2016 +0200
@@ -1,14 +1,13 @@
 #!/usr/bin/env python2
 """
-Based on kallithea/bin/template.ini.mako, generate
-  kallithea/config/deployment.ini_tmpl
+Based on kallithea/lib/paster_commands/template.ini.mako, generate
   development.ini
   kallithea/tests/test.ini
 """
 
 import re
 
-makofile = 'kallithea/bin/template.ini.mako'
+makofile = 'kallithea/lib/paster_commands/template.ini.mako'
 
 # the mako conditionals used in all other ini files and templates
 selected_mako_conditionals = set([
@@ -28,14 +27,6 @@
 
 # files to be generated from the mako template
 ini_files = [
-    ('kallithea/config/deployment.ini_tmpl',
-        '''
-        Kallithea - Example config
-
-        The %(here)s variable will be replaced with the parent directory of this file
-        ''',
-        {}, # exactly the same settings as template.ini.mako
-    ),
     ('kallithea/tests/test.ini',
         '''
         Kallithea - config for tests:
--- a/scripts/manifest	Tue Oct 25 21:32:24 2016 +0200
+++ b/scripts/manifest	Mon Sep 12 17:50:11 2016 +0200
@@ -75,11 +75,9 @@
 kallithea/bin/ldap_sync.conf
 kallithea/bin/ldap_sync.py
 kallithea/bin/rebranddb.py
-kallithea/bin/template.ini.mako
 kallithea/config/
 kallithea/config/__init__.py
 kallithea/config/conf.py
-kallithea/config/deployment.ini_tmpl
 kallithea/config/environment.py
 kallithea/config/middleware.py
 kallithea/config/post_receive_tmpl.py
@@ -355,6 +353,7 @@
 kallithea/lib/paster_commands/make_rcextensions.py
 kallithea/lib/paster_commands/repo_scan.py
 kallithea/lib/paster_commands/setup_db.py
+kallithea/lib/paster_commands/template.ini.mako
 kallithea/lib/paster_commands/update_repoinfo.py
 kallithea/lib/pidlock.py
 kallithea/lib/profiler.py
--- a/setup.py	Tue Oct 25 21:32:24 2016 +0200
+++ b/setup.py	Mon Sep 12 17:50:11 2016 +0200
@@ -155,6 +155,7 @@
     main = pylons.util:PylonsInstaller
 
     [gearbox.commands]
+    make-config=kallithea.lib.paster_commands.make_config:Command
     setup-db=kallithea.lib.paster_commands.setup_db:Command
     cleanup-repos=kallithea.lib.paster_commands.cleanup:Command
     update-repoinfo=kallithea.lib.paster_commands.update_repoinfo:Command