autoconf - init work on _get_static_services method

This commit is contained in:
bunkerity 2022-06-27 09:43:36 +02:00
parent a18d77aeee
commit b2758cea76
4 changed files with 78 additions and 1 deletions

View File

@ -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

View File

@ -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")

View File

@ -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"]

View File

@ -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 :