diff --git a/src/ui/main.py b/src/ui/main.py index e49ff64a6..cc4720259 100755 --- a/src/ui/main.py +++ b/src/ui/main.py @@ -61,7 +61,7 @@ from subprocess import PIPE, Popen, call from tarfile import CompressionError, HeaderError, ReadError, TarError, open as tar_open from threading import Thread from tempfile import NamedTemporaryFile -from time import time +from time import sleep, time from traceback import format_exc from typing import Optional from zipfile import BadZipFile, ZipFile @@ -187,6 +187,24 @@ elif integration == "Kubernetes": kubernetes_client = kube_client.CoreV1Api() db = Database(logger) + +while not db.is_initialized(): + logger.warning( + "Database is not initialized, retrying in 5s ...", + ) + sleep(5) + +env = db.get_config() +while not db.is_first_config_saved() or not env: + logger.warning( + "Database doesn't have any config saved yet, retrying in 5s ...", + ) + sleep(5) + env = db.get_config() + +logger.info("Database is ready") +Path("/var/tmp/bunkerweb/ui.healthy").write_text("ok") + with open("/usr/share/bunkerweb/VERSION", "r") as f: bw_version = f.read().strip() @@ -196,7 +214,7 @@ try: SECRET_KEY=vars["FLASK_SECRET"], ABSOLUTE_URI=vars["ABSOLUTE_URI"], INSTANCES=Instances(docker_client, kubernetes_client, integration), - CONFIG=Config(logger, db), + CONFIG=Config(db), CONFIGFILES=ConfigFiles(logger, db), SESSION_COOKIE_DOMAIN=vars["ABSOLUTE_URI"] .replace("http://", "") @@ -630,6 +648,8 @@ def configs(): operation = app.config["CONFIGFILES"].check_path(variables["path"]) + print(variables, flush=True) + if operation: flash(operation, "error") return redirect(url_for("loading", next=url_for("configs"))), 500 @@ -1231,9 +1251,7 @@ def custom_plugin(plugin): f"The actions.py file for the plugin {plugin} does not exist", "error", ) - return redirect( - url_for("loading", next=url_for("plugins", plugin_id=plugin)) - ) + return redirect(url_for("loading", next=url_for("plugins", plugin_id=plugin))) try: # Try to import the custom plugin @@ -1248,9 +1266,7 @@ def custom_plugin(plugin): f"An error occurred while importing the plugin {plugin}:
{format_exc()}", "error", ) - return redirect( - url_for("loading", next=url_for("plugins", plugin_id=plugin)) - ) + return redirect(url_for("loading", next=url_for("plugins", plugin_id=plugin))) error = False res = None diff --git a/src/ui/src/Config.py b/src/ui/src/Config.py index dd4670317..bec96184a 100644 --- a/src/ui/src/Config.py +++ b/src/ui/src/Config.py @@ -10,36 +10,17 @@ from pathlib import Path from re import search as re_search from subprocess import run, DEVNULL, STDOUT from tarfile import open as tar_open -from time import sleep from typing import List, Tuple from uuid import uuid4 class Config: - def __init__(self, logger, db) -> None: + def __init__(self, db) -> None: with open("/usr/share/bunkerweb/settings.json", "r") as f: self.__settings: dict = json_load(f) - self.__logger = logger self.__db = db - while not self.__db.is_initialized(): - self.__logger.warning( - "Database is not initialized, retrying in 5s ...", - ) - sleep(5) - - env = self.__db.get_config() - while not self.__db.is_first_config_saved() or not env: - self.__logger.warning( - "Database doesn't have any config saved yet, retrying in 5s ...", - ) - sleep(5) - env = self.__db.get_config() - - self.__logger.info("Database is ready") - Path("/var/tmp/bunkerweb/ui.healthy").write_text("ok") - def __env_to_dict(self, filename: str) -> dict: """Converts the content of an env file into a dict diff --git a/src/ui/src/ConfigFiles.py b/src/ui/src/ConfigFiles.py index 84a6f6619..a17aa6404 100644 --- a/src/ui/src/ConfigFiles.py +++ b/src/ui/src/ConfigFiles.py @@ -1,13 +1,29 @@ +from glob import glob from os import listdir, replace, walk from os.path import dirname, join from pathlib import Path from re import compile as re_compile from shutil import rmtree, move as shutil_move -from typing import Tuple +from typing import Any, Dict, List, Tuple from utils import path_to_dict +def generate_custom_configs( + custom_configs: List[Dict[str, Any]], + *, + original_path: str = "/data/configs", +): + Path(original_path).mkdir(parents=True, exist_ok=True) + for custom_config in custom_configs: + tmp_path = f"{original_path}/{custom_config['type'].replace('_', '-')}" + if custom_config["service_id"]: + tmp_path += f"/{custom_config['service_id']}" + tmp_path += f"/{custom_config['name']}.conf" + Path(dirname(tmp_path)).mkdir(parents=True, exist_ok=True) + Path(tmp_path).write_bytes(custom_config["data"]) + + class ConfigFiles: def __init__(self, logger, db): self.__name_regex = re_compile(r"^[a-zA-Z0-9_\-.]{1,64}$") @@ -19,6 +35,21 @@ class ConfigFiles: self.__logger = logger self.__db = db + if not Path("/usr/sbin/nginx").is_file(): + custom_configs = self.__db.get_custom_configs() + + if custom_configs: + self.__logger.info("Refreshing custom configs ...") + # Remove old custom configs files + for file in glob("/data/configs/*"): + if Path(file).is_symlink() or Path(file).is_file(): + Path(file).unlink() + elif Path(file).is_dir(): + rmtree(file, ignore_errors=False) + + generate_custom_configs(custom_configs) + self.__logger.info("Custom configs refreshed successfully") + def save_configs(self) -> str: custom_configs = [] root_dirs = listdir("/etc/bunkerweb/configs") @@ -109,8 +140,8 @@ class ConfigFiles: return f"The file {file_path} was successfully created", 0 def edit_folder(self, path: str, name: str, old_name: str) -> Tuple[str, int]: - new_folder_path = dirname(join(path, name)) - old_folder_path = dirname(join(path, old_name)) + new_folder_path = join(dirname(path), name) + old_folder_path = join(dirname(path), old_name) if old_folder_path == new_folder_path: return ( @@ -131,8 +162,8 @@ class ConfigFiles: def edit_file( self, path: str, name: str, old_name: str, content: str ) -> Tuple[str, int]: - new_path = dirname(join(path, name)) - old_path = dirname(join(path, old_name)) + new_path = join(dirname(path), name) + old_path = join(dirname(path), old_name) try: file_content = Path(old_path).read_text()