diff --git a/autoconf/Controller.py b/autoconf/Controller.py index e6d7ff2db..da7dc6f16 100644 --- a/autoconf/Controller.py +++ b/autoconf/Controller.py @@ -58,11 +58,17 @@ class Controller(ABC) : def _to_services(self, controller_service) : pass + @abstractmethod + def _get_static_services(self) : + pass + def get_services(self) : services = [] for controller_service in self._get_controller_services() : for service in self._to_services(controller_service) : services.append(service) + for static_service in self._get_static_services() : + services.append(static_service) return services @abstractmethod diff --git a/autoconf/DockerController.py b/autoconf/DockerController.py index e2d52cf55..b8df36a14 100644 --- a/autoconf/DockerController.py +++ b/autoconf/DockerController.py @@ -3,6 +3,7 @@ import traceback from docker import DockerClient from Controller import Controller +from ConfigCaller import ConfigCaller from logger import log class DockerController(Controller, ConfigCaller) : @@ -41,6 +42,28 @@ class DockerController(Controller, ConfigCaller) : service[real_variable] = value return [service] + def _get_static_services(self) : + services = [] + variables = {} + for instance in self.__client.containers.list(filters={"label" : "bunkerweb.AUTOCONF"}) : + for env in instance.attrs["Config"]["Env"] : + variable = env.split("=")[0] + value = env.replace(variable + "=", "", 1) + variables[variable] = value + server_names = [] + if "SERVER_NAME" in variables and variables["SERVER_NAME"] != "" : + server_names = variables["SERVER_NAME"].split(" ") + for server_name in server_names : + service = {} + service["SERVER_NAME"] = server_name + for variable, value in variables.items() : + prefix = variable.split("_")[0] + real_variable = variable.replace(prefix + "_", "", 1) + if prefix == server_name and self._is_multisite_setting(real_variable) : + service[real_variable] = value + services.append(service) + return services + def get_configs(self) : raise("get_configs is not supported with DockerController") diff --git a/autoconf/IngressController.py b/autoconf/IngressController.py index 1c2b6915e..92eb54427 100644 --- a/autoconf/IngressController.py +++ b/autoconf/IngressController.py @@ -110,6 +110,31 @@ class IngressController(Controller, ConfigCaller) : service[variable] = value return services + def _get_static_services(self) : + services = [] + variables = {} + for instance in self.__corev1.list_pod_for_all_namespaces(watch=False).items : + if instance.metadata.annotations is None or not "bunkerweb.io/AUTOCONF" in instance.metadata.annotations : + continue + for env in instance.spec.containers[0].env : + if env.value is None : + variables[env.name] = "" + else : + variables[env.name] = env.value + server_names = [] + if "SERVER_NAME" in variables and variables["SERVER_NAME"] != "" : + server_names = variables["SERVER_NAME"].split(" ") + for server_name in server_names : + service = {} + service["SERVER_NAME"] = server_name + for variable, value in variables.items() : + prefix = variable.split("_")[0] + real_variable = variable.replace(prefix + "_", "", 1) + if prefix == server_name and self._is_multisite_setting(real_variable) : + service[real_variable] = value + services.append(service) + return services + def get_configs(self) : configs = {} supported_config_types = ["http", "stream", "server-http", "server-stream", "default-server-http", "modsec", "modsec-crs"] diff --git a/autoconf/SwarmController.py b/autoconf/SwarmController.py index e918a9b26..39194eac6 100644 --- a/autoconf/SwarmController.py +++ b/autoconf/SwarmController.py @@ -5,6 +5,7 @@ from logger import log from base64 import b64decode from Controller import Controller +from ConfigCaller import ConfigCaller class SwarmController(Controller, ConfigCaller) : @@ -35,7 +36,7 @@ class SwarmController(Controller, ConfigCaller) : def _get_controller_services(self) : return self.__client.services.list(filters={"label" : "bunkerweb.SERVER_NAME"}) - + def _to_services(self, controller_service) : service = {} for variable, value in controller_service.attrs["Spec"]["Labels"].items() : @@ -47,6 +48,28 @@ class SwarmController(Controller, ConfigCaller) : service[real_variable] = value return [service] + def _get_static_services(self) : + services = [] + variables = {} + for instance in self.__client.services.list(filters={"label" : "bunkerweb.AUTOCONF"}) : + for env in instance.attrs["Spec"]["TaskTemplate"]["ContainerSpec"]["Env"] : + variable = env.split("=")[0] + value = env.replace(variable + "=", "", 1) + variables[variable] = value + server_names = [] + if "SERVER_NAME" in variables and variables["SERVER_NAME"] != "" : + server_names = variables["SERVER_NAME"].split(" ") + for server_name in server_names : + service = {} + service["SERVER_NAME"] = server_name + for variable, value in variables.items() : + prefix = variable.split("_")[0] + real_variable = variable.replace(prefix + "_", "", 1) + if prefix == server_name and self._is_multisite_setting(real_variable) : + service[real_variable] = value + services.append(service) + return services + def get_configs(self) : configs = {} for config_type in self._supported_config_types :