# -*- coding: utf-8 -*- # Copyright (C) 2010-2016 RhodeCode GmbH # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License, version 3 # (only), as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # # This program is dual-licensed. If you wish to learn more about the # RhodeCode Enterprise Edition, including its added features, Support services, # and proprietary license terms, please see https://rhodecode.com/licenses/ import os import sys from paste.script.appinstall import AbstractInstallCommand from paste.script.command import BadCommand from paste.deploy import appconfig # fix rhodecode import from os.path import dirname as dn rc_path = dn(dn(dn(os.path.realpath(__file__)))) sys.path.append(rc_path) class Command(AbstractInstallCommand): default_verbosity = 1 max_args = 1 min_args = 1 summary = "Setup an application, given a config file" usage = "CONFIG_FILE" group_name = "RhodeCode" description = """\ Setup RhodeCode according to its configuration file. This is the second part of a two-phase web application installation process (the first phase is prepare-app). The setup process consist of things like setting up databases, creating super user """ parser = AbstractInstallCommand.standard_parser( simulate=True, quiet=True, interactive=True) parser.add_option( '--user', action='store', dest='username', default=None, help='Admin Username') parser.add_option( '--email', action='store', dest='email', default=None, help='Admin Email') parser.add_option( '--password', action='store', dest='password', default=None, help='Admin password min 6 chars') parser.add_option( '--api-key', action='store', dest='api_key', help='Initial API key for the admin user') parser.add_option( '--repos', action='store', dest='repos_location', default=None, help='Absolute path to repositories location') parser.add_option( '--name', action='store', dest='section_name', default=None, help='The name of the section to set up (default: app:main)') parser.add_option( '--force-yes', action='store_true', dest='force_ask', default=None, help='Force yes to every question') parser.add_option( '--force-no', action='store_false', dest='force_ask', default=None, help='Force no to every question') parser.add_option( '--public-access', action='store_true', dest='public_access', default=None, help='Enable public access on this installation (default)') parser.add_option( '--no-public-access', action='store_false', dest='public_access', default=None, help='Disable public access on this installation ') def command(self): config_spec = self.args[0] section = self.options.section_name if section is None: if '#' in config_spec: config_spec, section = config_spec.split('#', 1) else: section = 'main' if ':' not in section: plain_section = section section = 'app:' + section else: plain_section = section.split(':', 1)[0] if not config_spec.startswith('config:'): config_spec = 'config:' + config_spec if plain_section != 'main': config_spec += '#' + plain_section config_file = config_spec[len('config:'):].split('#', 1)[0] config_file = os.path.join(os.getcwd(), config_file) self.logging_file_config(config_file) conf = appconfig(config_spec, relative_to=os.getcwd()) ep_name = conf.context.entry_point_name ep_group = conf.context.protocol dist = conf.context.distribution if dist is None: raise BadCommand( "The section %r is not the application (probably a filter). " "You should add #section_name, where section_name is the " "section that configures your application" % plain_section) installer = self.get_installer(dist, ep_group, ep_name) installer.setup_config( self, config_file, section, self.sysconfig_install_vars(installer)) self.call_sysconfig_functions( 'post_setup_hook', installer, config_file)