From c65dda3917bdf04f595bff776d4e397db1db1920 Mon Sep 17 00:00:00 2001 From: bunkerity Date: Fri, 21 May 2021 11:54:37 +0200 Subject: [PATCH] templating - init work on templating with jinja2 --- gen/Settings.py | 24 ++++++++++++++++-------- gen/Templates.py | 26 ++++++++++++++++++++++++++ gen/main.py | 5 +++++ gen/requirements.py | 1 + settings.json | 8 +++++--- 5 files changed, 53 insertions(+), 11 deletions(-) create mode 100644 gen/Templates.py create mode 100644 gen/requirements.py diff --git a/gen/Settings.py b/gen/Settings.py index e464c4f0..c7f03989 100644 --- a/gen/Settings.py +++ b/gen/Settings.py @@ -3,8 +3,8 @@ import json, re class Settings : def __init__(self) : - self.settings = {} - self.variables = {} + self.__settings = {} + self.__variables = {} def load_settings(self, path) : with open(path, "r") as f : @@ -16,20 +16,28 @@ class Settings : else : real_params = [param] for real_param in real_params : - self.settings[real_param["env"]] = real_param - self.settings[real_param["env"]]["category"] = cat + self.__settings[real_param["env"]] = real_param + self.__settings[real_param["env"]]["category"] = cat def load_variables(self, vars, multisite_only=False) : for var, value in vars.items() : if self.__check_var(var, value) : - self.variables[var] = value + self.__variables[var] = value else : print("Problem with " + var + "=" + value) + def get_config(self) : + config = {} + for setting in self.__settings : + config[setting] = self.__settings[setting]["default"] + for variable, value in self.__variables.items() : + config[variable] = value + return config + def __check_var(self, var, value, multisite_only=False) : real_var = "" - if var in self.settings : + if var in self.__settings : real_var = var - elif var[len(var.split("_")[0])+1:] in self.settings : + elif var[len(var.split("_")[0])+1:] in self.__settings : real_var = var[len(var.split("_")[0])+1:] - return real_var != "" and re.search(self.settings[real_var]["regex"], value) and (not multisite_only or self.settings[real_var]["context"] == "multisite") + return real_var != "" and re.search(self.__settings[real_var]["regex"], value) and (not multisite_only or self.__settings[real_var]["context"] == "multisite") diff --git a/gen/Templates.py b/gen/Templates.py new file mode 100644 index 00000000..a1017523 --- /dev/null +++ b/gen/Templates.py @@ -0,0 +1,26 @@ +import jinja2, glob, os, pathlib + +class Templates : + + def __init__(self, config, input_path) : + self.__config = config + self.__input_path = input_path + self.__template_env = jinja2.Environment(loader=jinja2.FileSystemLoader(searchpath=input_path)) + + def render_global(self, output_path) : + return self.__render("global", output_path) + + def render_site(self, output_path, server_name) : + return self.__render("site", output_path, server_name) + + def __render(self, type, output_path, server_name=None) : + for filename in glob.iglob(self.__input_path + "/" + type + "**/**", recursive=True) : + if os.path.isfile(filename) : + relative_filename = filename.replace(self.__input_path, "").replace(type + "/", "") + template = self.__template_env.get_template(type + "/" + relative_filename) + output = template.render(self.__config) + if "/" in relative_filename : + directory = relative_filename.replace(relative_filename.split("/")[-1], "") + pathlib.Path(output_path + "/" + directory).mkdir(parents=True, exist_ok=True) + with open(output_path + "/" + relative_filename, "w") as f : + f.write(output) diff --git a/gen/main.py b/gen/main.py index 9af9b5f4..4ecf4f88 100755 --- a/gen/main.py +++ b/gen/main.py @@ -1,6 +1,7 @@ #!/usr/bin/python3 from Settings import Settings +from Templates import Templates if __name__ == "__main__" : @@ -10,4 +11,8 @@ if __name__ == "__main__" : variables["MULTISITE"] = "yes" variables["BLOCK_PROXIES"] = "no" variables["omg"] = "lol" + variables["www.toto.com_BLOCK_PROXIES"] = "yes" my_settings.load_variables(variables) + print(my_settings.get_config()) + my_templates = Templates(my_settings.get_config(), "/tmp/input") + my_templates.render_global("/tmp/output") diff --git a/gen/requirements.py b/gen/requirements.py new file mode 100644 index 00000000..7f7afbf3 --- /dev/null +++ b/gen/requirements.py @@ -0,0 +1 @@ +jinja2 diff --git a/settings.json b/settings.json index 5ac1ca42..d947266f 100644 --- a/settings.json +++ b/settings.json @@ -495,7 +495,7 @@ "label": "Use crowdsec", "regex": "^(yes|no)$", "type": "checkbox" - } + }, { "context": "global", "default": "", @@ -1184,6 +1184,7 @@ "regex": "^\\S+$", "type": "text" } + ] }, "nginx": { "id": "nginx", @@ -1269,7 +1270,8 @@ "regex": "^[0-9]+$", "type": "text" } - } + ] + }, "Whitelist": { "id": "whitelist", "params": [ @@ -1333,7 +1335,7 @@ "env": "WHITELIST_URI", "id": "whitelist-uri", "label": "Whitelist URI", - "regex": "^(\S ?)*$", + "regex": "^(\\S ?)*$", "type": "text" } ]