# imports - standard imports import grp import os import pwd import shutil import sys # imports - module imports import bench from bench.utils import ( exec_cmd, get_process_manager, log, run_xhiveframework_cmd, sudoers_file, which, is_valid_xhiveframework_branch, ) from bench.utils.bench import build_assets, clone_apps_from from bench.utils.render import job @job(title="Initializing Bench {path}", success="Bench {path} initialized") def init( path, apps_path=None, no_procfile=False, no_backups=False, xhiveframework_path=None, xhiveframework_branch=None, verbose=False, clone_from=None, skip_redis_config_generation=False, clone_without_update=False, skip_assets=False, python="python3", install_app=None, dev=False, ): """Initialize a new bench directory * create a bench directory in the given path * setup logging for the bench * setup env for the bench * setup config (dir/pids/redis/procfile) for the bench * setup patches.txt for bench * clone & install xhiveframework * install python & node dependencies * build assets * setup backups crontab """ # Use print("\033c", end="") to clear entire screen after each step and re-render each list # another way => https://stackoverflow.com/a/44591228/10309266 import bench.cli from bench.app import get_app, install_apps_from_path from bench.bench import Bench verbose = bench.cli.verbose or verbose bench = Bench(path) bench.setup.dirs() bench.setup.logging() bench.setup.env(python=python) config = {} if dev: config["developer_mode"] = 1 bench.setup.config( redis=not skip_redis_config_generation, procfile=not no_procfile, additional_config=config, ) bench.setup.patches() # local apps if clone_from: clone_apps_from( bench_path=path, clone_from=clone_from, update_app=not clone_without_update ) # remote apps else: xhiveframework_path = xhiveframework_path or "https://lab.membtech.com/xhiveframework/xhiveframework15.git" is_valid_xhiveframework_branch(xhiveframework_path=xhiveframework_path, xhiveframework_branch=xhiveframework_branch) get_app( xhiveframework_path, branch=xhiveframework_branch, bench_path=path, skip_assets=True, verbose=verbose, resolve_deps=False, ) # fetch remote apps using config file - deprecate this! if apps_path: install_apps_from_path(apps_path, bench_path=path) # getting app on bench init using --install-app if install_app: get_app( install_app, branch=xhiveframework_branch, bench_path=path, skip_assets=True, verbose=verbose, resolve_deps=False, ) if not skip_assets: build_assets(bench_path=path) if not no_backups: bench.setup.backups() def setup_sudoers(user): from bench.config.lets_encrypt import get_certbot_path if not os.path.exists("/etc/sudoers.d"): os.makedirs("/etc/sudoers.d") set_permissions = not os.path.exists("/etc/sudoers") with open("/etc/sudoers", "a") as f: f.write("\n#includedir /etc/sudoers.d\n") if set_permissions: os.chmod("/etc/sudoers", 0o440) template = bench.config.env().get_template("xhiveframework_sudoers") xhiveframework_sudoers = template.render( **{ "user": user, "service": which("service"), "systemctl": which("systemctl"), "nginx": which("nginx"), "certbot": get_certbot_path(), } ) with open(sudoers_file, "w") as f: f.write(xhiveframework_sudoers) os.chmod(sudoers_file, 0o440) log(f"Sudoers was set up for user {user}", level=1) def start(no_dev=False, concurrency=None, procfile=None, no_prefix=False, procman=None): program = which(procman) if procman else get_process_manager() if not program: raise Exception("No process manager found") os.environ["PYTHONUNBUFFERED"] = "true" if not no_dev: os.environ["DEV_SERVER"] = "true" command = [program, "start"] if concurrency: command.extend(["-c", concurrency]) if procfile: command.extend(["-f", procfile]) if no_prefix: command.extend(["--no-prefix"]) os.execv(program, command) def migrate_site(site, bench_path="."): run_xhiveframework_cmd("--site", site, "migrate", bench_path=bench_path) def backup_site(site, bench_path="."): run_xhiveframework_cmd("--site", site, "backup", bench_path=bench_path) def backup_all_sites(bench_path="."): from bench.bench import Bench for site in Bench(bench_path).sites: backup_site(site, bench_path=bench_path) def fix_prod_setup_perms(bench_path=".", xhiveframework_user=None): from glob import glob from bench.bench import Bench xhiveframework_user = xhiveframework_user or Bench(bench_path).conf.get("xhiveframework_user") if not xhiveframework_user: print("xhiveframework user not set") sys.exit(1) globs = ["logs/*", "config/*"] for glob_name in globs: for path in glob(glob_name): uid = pwd.getpwnam(xhiveframework_user).pw_uid gid = grp.getgrnam(xhiveframework_user).gr_gid os.chown(path, uid, gid) def setup_fonts(): fonts_path = os.path.join("/tmp", "fonts") if os.path.exists("/etc/fonts_backup"): return exec_cmd("git clone https://lab.membtech.com/xhiveframework/fonts.git", cwd="/tmp") os.rename("/etc/fonts", "/etc/fonts_backup") os.rename("/usr/share/fonts", "/usr/share/fonts_backup") os.rename(os.path.join(fonts_path, "etc_fonts"), "/etc/fonts") os.rename(os.path.join(fonts_path, "usr_share_fonts"), "/usr/share/fonts") shutil.rmtree(fonts_path) exec_cmd("fc-cache -fv")