diff --git a/bench/commands/setup.py b/bench/commands/setup.py index a7fb886f..08e2d4f2 100755 --- a/bench/commands/setup.py +++ b/bench/commands/setup.py @@ -43,6 +43,7 @@ def reload_nginx(): @click.option("--user", help="optional user argument") @click.option("--yes", help="Yes to regeneration of supervisor config", is_flag=True, default=False) def setup_supervisor(user=None, yes=False): + bench.config.supervisor.update_supervisord_config(user=user, yes=yes) bench.config.supervisor.generate_supervisor_config(bench_path=".", user=user, yes=yes) diff --git a/bench/config/production_setup.py b/bench/config/production_setup.py index 4b5fc774..6809b733 100755 --- a/bench/config/production_setup.py +++ b/bench/config/production_setup.py @@ -1,13 +1,18 @@ # imports - standard imports import os +import logging import sys # imports - module imports +import bench from bench.config.common_site_config import get_config from bench.config.nginx import make_nginx_conf -from bench.config.supervisor import generate_supervisor_config +from bench.config.supervisor import generate_supervisor_config, update_supervisord_config from bench.config.systemd import generate_systemd_config -from bench.utils import CommandFailedError, exec_cmd, find_executable, fix_prod_setup_perms, get_bench_name, get_cmd_output +from bench.utils import CommandFailedError, exec_cmd, find_executable, fix_prod_setup_perms, get_bench_name, get_cmd_output, log + + +logger = logging.getLogger(bench.PROJECT_NAME) def setup_production_prerequisites(): @@ -23,14 +28,20 @@ def setup_production_prerequisites(): def setup_production(user, bench_path='.', yes=False): + print("Setting Up prerequisites...") setup_production_prerequisites() if get_config(bench_path).get('restart_supervisor_on_update') and get_config(bench_path).get('restart_systemd_on_update'): raise Exception("You cannot use supervisor and systemd at the same time. Modify your common_site_config accordingly." ) if get_config(bench_path).get('restart_systemd_on_update'): + print("Setting Up systemd...") generate_systemd_config(bench_path=bench_path, user=user, yes=yes) else: + print("Setting Up supervisor...") + update_supervisord_config(user=user, yes=yes) generate_supervisor_config(bench_path=bench_path, user=user, yes=yes) + + print("Setting Up NGINX...") make_nginx_conf(bench_path=bench_path, yes=yes) fix_prod_setup_perms(bench_path, frappe_user=user) remove_default_nginx_configs() @@ -38,6 +49,7 @@ def setup_production(user, bench_path='.', yes=False): bench_name = get_bench_name(bench_path) nginx_conf = '/etc/nginx/conf.d/{bench_name}.conf'.format(bench_name=bench_name) + print("Setting Up symlinks and reloading services...") if get_config(bench_path).get('restart_supervisor_on_update'): supervisor_conf_extn = "ini" if is_centos7() else "conf" supervisor_conf = os.path.join(get_supervisor_confdir(), '{bench_name}.{extn}'.format( @@ -100,7 +112,7 @@ def service(service_name, service_option): exec_cmd(service_manager_command) else: - raise Exception('No service manager found') + log("No service manager found: '{0} {1}' failed to execute".format(service_name, service_option), level=2) def get_supervisor_confdir(): diff --git a/bench/config/supervisor.py b/bench/config/supervisor.py index 9e9b7a89..8788757f 100644 --- a/bench/config/supervisor.py +++ b/bench/config/supervisor.py @@ -1,5 +1,6 @@ # imports - standard imports import getpass +import logging import os # imports - module imports @@ -13,13 +14,14 @@ import click from six.moves import configparser +logger = logging.getLogger(bench.PROJECT_NAME) + + def generate_supervisor_config(bench_path, user=None, yes=False): """Generate supervisor config for respective bench path""" if not user: user = getpass.getuser() - update_supervisord_conf(user=user) - template = bench.config.env.get_template('supervisor.conf') config = get_config(bench_path=bench_path) bench_dir = os.path.abspath(bench_path) @@ -64,14 +66,23 @@ def get_supervisord_conf(): return possibility -def update_supervisord_conf(user): - """From bench v5.0, we're moving to supervisor running as user""" +def update_supervisord_config(user=None, yes=False): + """From bench v5.x, we're moving to supervisor running as user""" from bench.config.production_setup import service + if not user: + user = getpass.getuser() + supervisord_conf = get_supervisord_conf() section = "unix_http_server" + updated_values = { + "chmod": "0760", + "chown": "{user}:{user}".format(user=user) + } + supervisord_conf_changes = "" if not supervisord_conf: + logger.log("supervisord.conf not found") return config = configparser.ConfigParser() @@ -79,12 +90,35 @@ def update_supervisord_conf(user): if section not in config.sections(): config.add_section(section) + action = "Section {0} Added".format(section) + logger.log(action) + supervisord_conf_changes += '\n' + action - config.set(section, "chmod", "0760") - config.set(section, "chown", "{user}:{user}".format(user=user)) + for key, value in updated_values.items(): + try: + current_value = config.get(section, key) + except configparser.NoOptionError: + current_value = "" - with open(supervisord_conf, "w") as f: - config.write(f) + if current_value.strip() != value: + config.set(section, key, value) + action = "Updated supervisord.conf: '{0}' changed from '{1}' to '{2}'".format(key, current_value, value) + logger.log(action) + supervisord_conf_changes += '\n' + action - # restart supervisor to take new changes into effect - service('supervisor', 'restart') + if not supervisord_conf_changes: + logger.log("supervisord.conf not updated") + return + + if not yes: + click.confirm("{0} will be updated with the following values:\n{1}\nDo you want to continue?".format(supervisord_conf, supervisord_conf_changes), abort=True) + + try: + with open(supervisord_conf, "w") as f: + config.write(f) + logger.log("Updated supervisord.conf at '{0}'".format(supervisord_conf)) + except Exception as e: + logger.log("Updating supervisord.conf failed due to '{0}'".format(e)) + + # Reread supervisor configuration, reload supervisord and supervisorctl, restart services that were started + service('supervisor', 'reload') diff --git a/bench/tests/test_setup_production.py b/bench/tests/test_setup_production.py index e0a60b17..5f983c71 100644 --- a/bench/tests/test_setup_production.py +++ b/bench/tests/test_setup_production.py @@ -19,7 +19,7 @@ class TestSetupProduction(TestBenchBase): for bench_name in ("test-bench-1", "test-bench-2"): bench_path = os.path.join(os.path.abspath(self.benches_path), bench_name) self.init_bench(bench_name) - bench.utils.exec_cmd("sudo bench setup production {0}".format(user), cwd=bench_path) + bench.utils.exec_cmd("sudo bench setup production {0} --yes".format(user), cwd=bench_path) self.assert_nginx_config(bench_name) self.assert_supervisor_config(bench_name) self.assert_supervisor_process(bench_name)