def create_configuration(): local_user_dir = os.path.expanduser("~/.mwdb-core") message = textwrap.dedent(f""" Where do you want to place MWDB local files? 1) Global directories (/var/lib/mwdb-core, /etc/mwdb-core) 2) Local user directory ({local_user_dir}) 3) Current directory """) options = { "1": ("/var/lib/mwdb-core", "/etc/mwdb-core"), "2": (local_user_dir, local_user_dir), "3": (".", "."), } data_dir, config_dir = options[click.prompt(message, type=click.Choice( ["1", "2", "3"]))] os.makedirs(data_dir, exist_ok=True) os.makedirs(config_dir, exist_ok=True) default_postgres_uri = "postgresql://localhost/mwdb" postgres_uri = click.prompt("PostgreSQL database connection string", default=default_postgres_uri) default_uploads__dir = os.path.join(data_dir, "uploads") uploads_dir = click.prompt("Uploads storage path", default=default_uploads__dir, type=click.Path()) os.makedirs(uploads_dir, exist_ok=True) default_base_url = "http://127.0.0.1" base_url = click.prompt("Base public URL of MWDB service", default=default_base_url) web_dir = os.path.join(data_dir, "web") local_plugins_dir = os.path.join(data_dir, "plugins") mail_templates_dir = os.path.join(data_dir, "mail_templates") configuration = generate_config( postgres_uri=postgres_uri, uploads_folder=uploads_dir, base_url=base_url, web_folder=web_dir, local_plugins_folder=local_plugins_dir, mail_templates_folder=mail_templates_dir, secret_key=token_hex(16), ) configuration_path = os.path.join(config_dir, "mwdb.ini") with open(configuration_path, "w") as f: f.write(configuration) logger.info("Configuration stored in %s file.", configuration_path) # Reload configuration including provided admin password reload_config()
def configure_database(): upgrade() if _is_database_initialized(): logger.info("Database already initialized... skipping") return if app_config.mwdb.admin_password: admin_password = app_config.mwdb.admin_password else: while True: admin_password = click.prompt( "Provide password for MWDB 'admin' account", hide_input=True) admin_repeat_password = click.prompt("Repeat password", hide_input=True) if admin_password == admin_repeat_password: break click.echo("[!] Passwords doesn't match", err=True) _initialize(admin_password)
def npm_build_web(target_dir): config_paths = [ "./package.json", "./package-lock.json", "./config-overrides.js", "./public", "./src", ] with tempfile.TemporaryDirectory() as context_dirname: # Copy files to context directory logger.info("Creating build context...") for path in config_paths: src = os.path.join(web_package_dir, path) dst = os.path.join(context_dirname, path) if os.path.isfile(src): shutil.copy(src, dst) elif os.path.isdir(src): shutil.copytree(src, dst) else: raise RuntimeError( "Critical error: expected file {} doesn't exist".format(path) ) # Run npm install for web core logger.info("Installing dependencies") if subprocess.call("npm install", shell=True, cwd=context_dirname): raise BuildWebError("'npm install' command failed") # Run npm install for plugins for plugin, web_plugin_path in discover_web_plugins(): logger.info("Installing web plugin '%s'", plugin) if subprocess.call( f"npm install {web_plugin_path}", shell=True, cwd=context_dirname ): raise BuildWebError(f"'npm install {web_plugin_path}' command failed") # Run npm run build logger.info("Building web application") if subprocess.call("npm run build", shell=True, cwd=context_dirname): raise BuildWebError("'npm run build' command failed") if os.path.exists(target_dir): logger.info("Target %s exists, removing", target_dir) shutil.rmtree(target_dir) logger.info("Collecting artifacts to %s", target_dir) shutil.move(os.path.join(context_dirname, "build"), target_dir) logger.info("Web application built successfully!")