templating - started integration into autoconf
This commit is contained in:
parent
4a73ae8197
commit
f950abdc24
@ -1,3 +1,5 @@
|
|||||||
|
# TODO : hard tests, jobs, check state when generating env, ...
|
||||||
|
|
||||||
from Config import Config
|
from Config import Config
|
||||||
import utils
|
import utils
|
||||||
import os
|
import os
|
||||||
@ -7,7 +9,7 @@ class AutoConf :
|
|||||||
self.__swarm = swarm
|
self.__swarm = swarm
|
||||||
self.__servers = {}
|
self.__servers = {}
|
||||||
self.__instances = {}
|
self.__instances = {}
|
||||||
self.__sites = {}
|
self.__env = {}
|
||||||
self.__config = Config(self.__swarm, api)
|
self.__config = Config(self.__swarm, api)
|
||||||
|
|
||||||
def get_server(self, id) :
|
def get_server(self, id) :
|
||||||
@ -18,6 +20,21 @@ class AutoConf :
|
|||||||
def reload(self) :
|
def reload(self) :
|
||||||
return self.__config.reload(self.__instances)
|
return self.__config.reload(self.__instances)
|
||||||
|
|
||||||
|
def __gen_env(self) :
|
||||||
|
self.__env.clear()
|
||||||
|
# TODO : check actual state (e.g. : running ?)
|
||||||
|
for instance in self.__instances :
|
||||||
|
(id, name, labels) = self.__get_infos(self.__instances[instance])
|
||||||
|
for label in labels :
|
||||||
|
if label.startswith("bunkerized-nginx.") :
|
||||||
|
self.__env[label.replace("bunkerized-nginx.", "", 1)] = labels[label]
|
||||||
|
for server in self.__servers :
|
||||||
|
(id, name, labels) = self.__get_infos(self.__servers[server])
|
||||||
|
first_server = labels["bunkerized-nginx.SERVER_NAME"].split(" ")[0]
|
||||||
|
for label in labels :
|
||||||
|
if label.startswith("bunkerized-nginx.") :
|
||||||
|
self.__env[first_server + "_" + label.replace("bunkerized-nginx.", "", 1)] = labels[label]
|
||||||
|
|
||||||
def pre_process(self, objs) :
|
def pre_process(self, objs) :
|
||||||
for instance in objs :
|
for instance in objs :
|
||||||
(id, name, labels) = self.__get_infos(instance)
|
(id, name, labels) = self.__get_infos(instance)
|
||||||
@ -60,22 +77,32 @@ class AutoConf :
|
|||||||
return (id, name, labels)
|
return (id, name, labels)
|
||||||
|
|
||||||
def __process_instance(self, instance, event, id, name, labels) :
|
def __process_instance(self, instance, event, id, name, labels) :
|
||||||
|
|
||||||
if event == "create" :
|
if event == "create" :
|
||||||
self.__instances[id] = instance
|
self.__instances[id] = instance
|
||||||
|
self.__gen_env()
|
||||||
if self.__swarm and len(self.__instances) == 1 :
|
if self.__swarm and len(self.__instances) == 1 :
|
||||||
if self.__config.initconf(self.__instances) :
|
if self.__config.generate(self.__env) :
|
||||||
utils.log("[*] Initial config succeeded")
|
utils.log("[*] Initial config succeeded")
|
||||||
|
with open("/etc/nginx/autoconf", "w") as f :
|
||||||
|
f.write("ok")
|
||||||
else :
|
else :
|
||||||
utils.log("[!] Initial config failed")
|
utils.log("[!] Initial config failed")
|
||||||
utils.log("[*] bunkerized-nginx instance created : " + name + " / " + id)
|
utils.log("[*] bunkerized-nginx instance created : " + name + " / " + id)
|
||||||
|
|
||||||
elif event == "start" :
|
elif event == "start" :
|
||||||
self.__instances[id].reload()
|
self.__instances[id].reload()
|
||||||
|
self.__gen_env()
|
||||||
utils.log("[*] bunkerized-nginx instance started : " + name + " / " + id)
|
utils.log("[*] bunkerized-nginx instance started : " + name + " / " + id)
|
||||||
|
|
||||||
elif event == "die" :
|
elif event == "die" :
|
||||||
self.__instances[id].reload()
|
self.__instances[id].reload()
|
||||||
|
self.__gen_env()
|
||||||
utils.log("[*] bunkerized-nginx instance stopped : " + name + " / " + id)
|
utils.log("[*] bunkerized-nginx instance stopped : " + name + " / " + id)
|
||||||
|
|
||||||
elif event == "destroy" or event == "remove" :
|
elif event == "destroy" or event == "remove" :
|
||||||
del self.__instances[id]
|
del self.__instances[id]
|
||||||
|
self.__gen_env()
|
||||||
if self.__swarm and len(self.__instances) == 0 :
|
if self.__swarm and len(self.__instances) == 0 :
|
||||||
with open("/etc/crontabs/nginx", "w") as f :
|
with open("/etc/crontabs/nginx", "w") as f :
|
||||||
f.write("")
|
f.write("")
|
||||||
@ -84,47 +111,59 @@ class AutoConf :
|
|||||||
utils.log("[*] bunkerized-nginx instance removed : " + name + " / " + id)
|
utils.log("[*] bunkerized-nginx instance removed : " + name + " / " + id)
|
||||||
|
|
||||||
def __process_server(self, instance, event, id, name, labels) :
|
def __process_server(self, instance, event, id, name, labels) :
|
||||||
|
|
||||||
vars = { k.replace("bunkerized-nginx.", "", 1) : v for k, v in labels.items() if k.startswith("bunkerized-nginx.")}
|
vars = { k.replace("bunkerized-nginx.", "", 1) : v for k, v in labels.items() if k.startswith("bunkerized-nginx.")}
|
||||||
|
|
||||||
if event == "create" :
|
if event == "create" :
|
||||||
utils.log("[*] Generating config for " + vars["SERVER_NAME"] + " ...")
|
utils.log("[*] Generating config for " + vars["SERVER_NAME"] + " ...")
|
||||||
if self.__config.generate(self.__instances, vars) :
|
self.__servers[id] = instance
|
||||||
|
self.__gen_env()
|
||||||
|
if self.__config.generate(self.__env) :
|
||||||
utils.log("[*] Generated config for " + vars["SERVER_NAME"])
|
utils.log("[*] Generated config for " + vars["SERVER_NAME"])
|
||||||
self.__servers[id] = instance
|
|
||||||
if self.__swarm :
|
if self.__swarm :
|
||||||
utils.log("[*] Activating config for " + vars["SERVER_NAME"] + " ...")
|
utils.log("[*] Activating config for " + vars["SERVER_NAME"] + " ...")
|
||||||
if self.__config.activate(self.__instances, vars) :
|
if self.__config.reload(self.__instances) :
|
||||||
utils.log("[*] Activated config for " + vars["SERVER_NAME"])
|
utils.log("[*] Activated config for " + vars["SERVER_NAME"])
|
||||||
else :
|
else :
|
||||||
utils.log("[!] Can't activate config for " + vars["SERVER_NAME"])
|
utils.log("[!] Can't activate config for " + vars["SERVER_NAME"])
|
||||||
else :
|
else :
|
||||||
utils.log("[!] Can't generate config for " + vars["SERVER_NAME"])
|
utils.log("[!] Can't generate config for " + vars["SERVER_NAME"])
|
||||||
|
del self.__servers[id]
|
||||||
|
self.__gen_env()
|
||||||
|
self.__config.generate(self.__env)
|
||||||
|
|
||||||
elif event == "start" :
|
elif event == "start" :
|
||||||
if id in self.__servers :
|
if id in self.__servers :
|
||||||
self.__servers[id].reload()
|
self.__servers[id].reload()
|
||||||
utils.log("[*] Activating config for " + vars["SERVER_NAME"] + " ...")
|
utils.log("[*] Activating config for " + vars["SERVER_NAME"] + " ...")
|
||||||
if self.__config.activate(self.__instances, vars) :
|
self.__gen_env()
|
||||||
|
if self.__config.reload(self.__instances) :
|
||||||
utils.log("[*] Activated config for " + vars["SERVER_NAME"])
|
utils.log("[*] Activated config for " + vars["SERVER_NAME"])
|
||||||
else :
|
else :
|
||||||
utils.log("[!] Can't activate config for " + vars["SERVER_NAME"])
|
utils.log("[!] Can't activate config for " + vars["SERVER_NAME"])
|
||||||
|
|
||||||
elif event == "die" :
|
elif event == "die" :
|
||||||
if id in self.__servers :
|
if id in self.__servers :
|
||||||
self.__servers[id].reload()
|
self.__servers[id].reload()
|
||||||
utils.log("[*] Deactivating config for " + vars["SERVER_NAME"])
|
utils.log("[*] Deactivating config for " + vars["SERVER_NAME"])
|
||||||
if self.__config.deactivate(self.__instances, vars) :
|
self.__gen_env()
|
||||||
|
if self.__config.reload() :
|
||||||
utils.log("[*] Deactivated config for " + vars["SERVER_NAME"])
|
utils.log("[*] Deactivated config for " + vars["SERVER_NAME"])
|
||||||
else :
|
else :
|
||||||
utils.log("[!] Can't deactivate config for " + vars["SERVER_NAME"])
|
utils.log("[!] Can't deactivate config for " + vars["SERVER_NAME"])
|
||||||
|
|
||||||
elif event == "destroy" or event == "remove" :
|
elif event == "destroy" or event == "remove" :
|
||||||
if id in self.__servers :
|
if id in self.__servers :
|
||||||
if self.__swarm :
|
|
||||||
utils.log("[*] Deactivating config for " + vars["SERVER_NAME"])
|
|
||||||
if self.__config.deactivate(self.__instances, vars) :
|
|
||||||
utils.log("[*] Deactivated config for " + vars["SERVER_NAME"])
|
|
||||||
else :
|
|
||||||
utils.log("[!] Can't deactivate config for " + vars["SERVER_NAME"])
|
|
||||||
del self.__servers[id]
|
|
||||||
utils.log("[*] Removing config for " + vars["SERVER_NAME"])
|
utils.log("[*] Removing config for " + vars["SERVER_NAME"])
|
||||||
if self.__config.remove(vars) :
|
del self.__servers[id]
|
||||||
|
self.__gen_env()
|
||||||
|
if self.__config.generate(self.__env) :
|
||||||
utils.log("[*] Removed config for " + vars["SERVER_NAME"])
|
utils.log("[*] Removed config for " + vars["SERVER_NAME"])
|
||||||
else :
|
else :
|
||||||
utils.log("[!] Can't remove config for " + vars["SERVER_NAME"])
|
utils.log("[!] Can't remove config for " + vars["SERVER_NAME"])
|
||||||
|
utils.log("[*] Deactivating config for " + vars["SERVER_NAME"])
|
||||||
|
if self.__config.reload(self.__instances) :
|
||||||
|
utils.log("[*] Deactivated config for " + vars["SERVER_NAME"])
|
||||||
|
else :
|
||||||
|
utils.log("[!] Can't deactivate config for " + vars["SERVER_NAME"])
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,6 @@ class Config :
|
|||||||
self.__swarm = swarm
|
self.__swarm = swarm
|
||||||
self.__api = api
|
self.__api = api
|
||||||
|
|
||||||
|
|
||||||
def initconf(self, instances) :
|
def initconf(self, instances) :
|
||||||
try :
|
try :
|
||||||
for instance_id, instance in instances.items() :
|
for instance_id, instance in instances.items() :
|
||||||
@ -59,48 +58,24 @@ class Config :
|
|||||||
utils.log("[!] Error while initializing config : " + str(e))
|
utils.log("[!] Error while initializing config : " + str(e))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def globalconf(self, instances) :
|
def generate(self, env) :
|
||||||
try :
|
try :
|
||||||
for instance_id, instance in instances.items() :
|
# Write environment variables to fs
|
||||||
env = instance.attrs["Spec"]["TaskTemplate"]["ContainerSpec"]["Env"]
|
with open("/tmp/variables.env", "w") as f :
|
||||||
break
|
for k, v in env.items() :
|
||||||
vars = {}
|
f.write(k + "=" + v + "\n")
|
||||||
for var_value in env :
|
|
||||||
var = var_value.split("=")[0]
|
|
||||||
value = var_value.replace(var + "=", "", 1)
|
|
||||||
vars[var] = value
|
|
||||||
proc = subprocess.run(["/bin/su", "-s", "/opt/entrypoint/global-config.sh", "nginx"], env=vars, capture_output=True)
|
|
||||||
if proc.returncode == 0 :
|
|
||||||
return True
|
|
||||||
else :
|
|
||||||
utils.log("[*] Error while generating global config : return code = " + str(proc.returncode))
|
|
||||||
except Exception as e :
|
|
||||||
utils.log("[!] Exception while generating global config : " + str(e))
|
|
||||||
return False
|
|
||||||
|
|
||||||
def generate(self, instances, vars) :
|
# Call the generator
|
||||||
try :
|
proc = subprocess.run(["/bin/su", "-c", "/opt/gen/main.py --settings /opt/settings.json --templates /opt/confs --output /etc/nginx --variables /tmp/variables.env", "nginx"], capture_output=True)
|
||||||
# Get env vars from bunkerized-nginx instances
|
|
||||||
vars_instances = {}
|
# Print stdout/stderr just in case
|
||||||
for instance_id, instance in instances.items() :
|
# TODO
|
||||||
if self.__swarm :
|
|
||||||
env = instance.attrs["Spec"]["TaskTemplate"]["ContainerSpec"]["Env"]
|
# We're done
|
||||||
else :
|
|
||||||
env = instance.attrs["Config"]["Env"]
|
|
||||||
for var_value in env :
|
|
||||||
var = var_value.split("=")[0]
|
|
||||||
value = var_value.replace(var + "=", "", 1)
|
|
||||||
vars_instances[var] = value
|
|
||||||
vars_defaults = vars.copy()
|
|
||||||
vars_defaults.update(vars_instances)
|
|
||||||
vars_defaults.update(vars)
|
|
||||||
# Call site-config.sh to generate the config
|
|
||||||
proc = subprocess.run(["/bin/su", "-s", "/bin/sh", "-c", "/opt/entrypoint/site-config.sh" + " \"" + vars["SERVER_NAME"] + "\"", "nginx"], env=vars_defaults, capture_output=True)
|
|
||||||
if proc.returncode == 0 and vars_defaults["MULTISITE"] == "yes" and self.__swarm :
|
|
||||||
proc = subprocess.run(["/bin/su", "-s", "/opt/entrypoint/multisite-config.sh", "nginx"], env=vars_defaults, capture_output=True)
|
|
||||||
if proc.returncode == 0 :
|
if proc.returncode == 0 :
|
||||||
return True
|
return True
|
||||||
utils.log("[!] Error while generating site config for " + vars["SERVER_NAME"] + " : return code = " + str(proc.returncode))
|
utils.log("[!] Error while generating site config for " + vars["SERVER_NAME"] + " : return code = " + str(proc.returncode))
|
||||||
|
|
||||||
except Exception as e :
|
except Exception as e :
|
||||||
utils.log("[!] Exception while generating site config : " + str(e))
|
utils.log("[!] Exception while generating site config : " + str(e))
|
||||||
return False
|
return False
|
||||||
@ -149,24 +124,6 @@ class Config :
|
|||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def remove(self, vars) :
|
|
||||||
try :
|
|
||||||
# Get first server name
|
|
||||||
first_server_name = vars["SERVER_NAME"].split(" ")[0]
|
|
||||||
|
|
||||||
# Check if file exists
|
|
||||||
if not os.path.isfile("/etc/nginx/" + first_server_name + "/server.conf") :
|
|
||||||
utils.log("[!] /etc/nginx/" + first_server_name + "/server.conf doesn't exist")
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Remove the folder
|
|
||||||
shutil.rmtree("/etc/nginx/" + first_server_name)
|
|
||||||
return True
|
|
||||||
except Exception as e :
|
|
||||||
utils.log("[!] Error while deactivating config : " + str(e))
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
||||||
def reload(self, instances) :
|
def reload(self, instances) :
|
||||||
return self.__api_call(instances, "/reload")
|
return self.__api_call(instances, "/reload")
|
||||||
|
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# create nginx user
|
# create nginx user
|
||||||
addgroup -g 101 nginx
|
addgroup -g 101 nginx
|
||||||
adduser -h /var/cache/nginx -g nginx -s /sbin/nologin -G nginx -D -H -u 101 nginx
|
adduser -h /var/cache/nginx -g nginx -s /bin/sh -G nginx -D -H -u 101 nginx
|
||||||
|
|
||||||
# prepare /opt
|
# prepare /opt
|
||||||
chown -R root:nginx /opt
|
chown -R root:nginx /opt
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
toto
|
|
||||||
server {
|
server {
|
||||||
{% if LISTEN_HTTP == "yes" %}listen 0.0.0.0:{{ HTTP_PORT }} default_server{% endif %}
|
{% if LISTEN_HTTP == "yes" %}listen 0.0.0.0:{{ HTTP_PORT }} default_server{% endif %};
|
||||||
server_name _;
|
server_name _;
|
||||||
{% if has_value("AUTO_LETS_ENCRYPT", "yes") %}include /etc/nginx/multisite-default-server-https.conf;{% endif %}
|
{% if has_value("AUTO_LETS_ENCRYPT", "yes") %}include /etc/nginx/multisite-default-server-https.conf;{% endif %}
|
||||||
{% if DISABLE_DEFAULT_SERVER == "yes" %}include /etc/nginx/multisite-disable-default-server.conf;{% endif %}
|
{% if DISABLE_DEFAULT_SERVER == "yes" %}include /etc/nginx/multisite-disable-default-server.conf;{% endif %}
|
||||||
|
|||||||
@ -116,14 +116,31 @@ http {
|
|||||||
{% if MULTISITE == "yes" %}include /etc/nginx/multisite-default-server.conf;{% endif %}
|
{% if MULTISITE == "yes" %}include /etc/nginx/multisite-default-server.conf;{% endif %}
|
||||||
|
|
||||||
# server config(s)
|
# server config(s)
|
||||||
{% if SWARM_MODE == "no" %}
|
{% if MULTISITE == "yes" and SERVER_NAME != "" %}
|
||||||
{% if MULTISITE == "yes" %}
|
{% set map_servers = {} %}
|
||||||
{% for server_name in SERVER_NAME.split(" ") %}
|
{% for server_name in SERVER_NAME.split(" ") %}
|
||||||
include /etc/nginx/{{ server_name }}/server.conf;
|
{% if server_name + "_SERVER_NAME" in all %}
|
||||||
{% endfor %}
|
{% set x = map_servers.update({server_name : [all[server_name] + "_SERVER_NAME"].split(" ")}) %}
|
||||||
{% else %}
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for server_name in SERVER_NAME.split(" ") %}
|
||||||
|
{% if not server_name in map_servers %}
|
||||||
|
{% set found = {"res": false} %}
|
||||||
|
{% for first_server, servers in map_servers.items() %}
|
||||||
|
{% if server_name in servers %}
|
||||||
|
{% set x = found.update({"res" : true}) %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if not found["res"] %}
|
||||||
|
{% set x = map_servers.update({server_name : [server_name]}) %}
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for first_server in map_servers %}
|
||||||
|
include /etc/nginx/{{ first_server }}/server.conf;
|
||||||
|
{% endfor %}
|
||||||
|
{% elif MULTISITE == "no" %}
|
||||||
include /etc/nginx/server.conf;
|
include /etc/nginx/server.conf;
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# API
|
# API
|
||||||
|
|||||||
@ -843,7 +843,7 @@
|
|||||||
"env": "SERVER_NAME",
|
"env": "SERVER_NAME",
|
||||||
"id": "server-name",
|
"id": "server-name",
|
||||||
"label": "Server name",
|
"label": "Server name",
|
||||||
"regex": "^([a-z\\-0-9]+\\.? ?)+$",
|
"regex": "^([a-z\\-0-9]+\\.? ?)*$",
|
||||||
"type": "text"
|
"type": "text"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user