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()