bunkerweb/autoconf/Config.py
2022-11-08 17:14:33 +01:00

95 lines
3.1 KiB
Python

from os import getenv
from time import sleep
from ConfigCaller import ConfigCaller
from Database import Database
from logger import setup_logger
class Config(ConfigCaller):
def __init__(self, ctrl_type, lock=None):
ConfigCaller.__init__(self)
self.__ctrl_type = ctrl_type
self.__lock = lock
self.__logger = setup_logger("Config", getenv("LOG_LEVEL", "INFO"))
self.__instances = []
self.__services = []
self.__configs = []
self.__config = {}
self._db = Database(self.__logger)
while not self._db.is_initialized():
self.__logger.warning(
"Database is not initialized, retrying in 5 seconds ...",
)
sleep(5)
def __get_full_env(self) -> dict:
env_instances = {}
for instance in self.__instances:
for variable, value in instance["env"].items():
env_instances[variable] = value
env_services = {}
if not "SERVER_NAME" in env_instances:
env_instances["SERVER_NAME"] = ""
for service in self.__services:
for variable, value in service.items():
env_services[
f"{service['SERVER_NAME'].split(' ')[0]}_{variable}"
] = value
if env_instances["SERVER_NAME"] != "":
env_instances["SERVER_NAME"] += " "
env_instances["SERVER_NAME"] += service["SERVER_NAME"].split(" ")[0]
return self._full_env(env_instances, env_services)
def update_needed(self, instances, services, configs=None) -> bool:
if instances != self.__instances:
return True
if services != self.__services:
return True
if not configs is None and configs != self.__configs:
return True
return False
def apply(self, instances, services, configs=None) -> bool:
success = True
# update values
self.__instances = instances
self.__services = services
self.__configs = configs
self.__config = self.__get_full_env()
custom_configs = []
for config_type in self.__configs:
for file, data in self.__configs[config_type].items():
exploded = file.split("/")
custom_configs.append(
{
"value": data,
"exploded": [
exploded[0],
config_type,
exploded[1].replace(".conf", ""),
],
}
)
# save config to database
ret = self._db.save_config(self.__config, "autoconf")
if ret:
success = False
self.__logger.error(
f"Can't save autoconf config in database: {ret}",
)
# save custom configs to database
ret = self._db.save_custom_configs(custom_configs, "autoconf")
if ret:
success = False
self.__logger.error(
f"Can't save autoconf custom configs in database: {ret}",
)
return success