Changeset - bed1d9158eb4
[Not reviewed]
default
0 1 0
Mads Kiilerich - 8 years ago 2017-09-14 02:08:07
mads@kiilerich.com
make-config: use shared inifile library
1 file changed with 14 insertions and 26 deletions:
0 comments (0 inline, 0 general)
kallithea/lib/paster_commands/make_config.py
Show inline comments
 
@@ -6,108 +6,96 @@
 
#
 
# 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
 

	
 
import mako.exceptions
 
from mako.template import Template
 

	
 
TMPL = 'template.ini.mako'
 
here = os.path.dirname(os.path.abspath(__file__))
 

	
 
from kallithea.lib.paster_commands.common import BasePasterCommand
 
from kallithea.lib import inifile
 

	
 

	
 
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 for the config file')
 

	
 
        parser.add_argument('--show-defaults', action='store_true',
 
            help="Show the default values that can be overridden")
 

	
 
        return parser
 

	
 

	
 
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,
 
    }
 
    mako_variable_values = {}
 

	
 
    for parameter in args.custom:
 
        kv = parameter.split('=', 1)
 
        if len(kv) == 2:
 
            k, v = kv
 
            tmpl_stored_args[k] = v
 
        parts = parameter.split('=', 1)
 
        if len(parts) == 2:
 
            key, value = parts
 
            mako_variable_values[key] = value
 
        else:
 
            raise ValueError("Invalid name=value parameter %r" % parameter)
 

	
 
    if args.show_defaults:
 
        for k, v in tmpl_stored_args.iteritems():
 
            print '%s=%s' % (k, v)
 
        for key, value in inifile.default_variables.items():
 
            value = mako_variable_values.get(key, value)
 
            print '%s=%s' % (key, value)
 
        sys.exit(0)
 

	
 
    # use default that cannot be replaced
 
    tmpl_stored_args.update({
 
    mako_variable_values.update({
 
        'uuid': lambda: uuid.uuid4().hex,
 
    })
 
    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))
 
        config_file = os.path.abspath(args.config_file)
 
        inifile.create(config_file, mako_variable_values, {})
 
        print 'Wrote new config file in %s' % config_file
 

	
 
    except Exception:
 
        print mako.exceptions.text_error_template().render()
0 comments (0 inline, 0 general)