From dfce0c06dd0dc66e7e10faab7cccea3e42ac833e Mon Sep 17 00:00:00 2001 From: bunkerity Date: Fri, 28 May 2021 12:16:56 +0200 Subject: [PATCH] autoconf - fixing various bug when SWARM_MODE=yes --- autoconf/AutoConf.py | 5 +++++ autoconf/Config.py | 45 +++++++++++----------------------------- confs/global/api.conf | 4 ++-- examples/swarm/stack.yml | 2 +- 4 files changed, 20 insertions(+), 36 deletions(-) diff --git a/autoconf/AutoConf.py b/autoconf/AutoConf.py index e819e33..917af49 100644 --- a/autoconf/AutoConf.py +++ b/autoconf/AutoConf.py @@ -96,6 +96,11 @@ class AutoConf : utils.log("[*] Initial config succeeded") with open("/etc/nginx/autoconf", "w") as f : f.write("ok") + if not self.__config.swarm_wait(self.__instances) : + utils.log("[!] Removing bunkerized-nginx instances from list") + del self.__instances[id] + os.remove("/etc/nginx/autoconf") + else : utils.log("[!] Initial config failed") utils.log("[*] bunkerized-nginx instance created : " + name + " / " + id) diff --git a/autoconf/Config.py b/autoconf/Config.py index bc20143..e12416b 100644 --- a/autoconf/Config.py +++ b/autoconf/Config.py @@ -9,35 +9,8 @@ class Config : self.__swarm = swarm self.__api = api - def initconf(self, instances) : + def swarm_wait(self, instances) : try : - for instance_id, instance in instances.items() : - env = instance.attrs["Spec"]["TaskTemplate"]["ContainerSpec"]["Env"] - break - vars = {} - for var_value in env : - var = var_value.split("=")[0] - value = var_value.replace(var + "=", "", 1) - vars[var] = value - - utils.log("[*] Generating global config ...") - if not self.globalconf(instances) : - utils.log("[!] Can't generate global config") - return False - utils.log("[*] Generated global config") - - if "SERVER_NAME" in vars and vars["SERVER_NAME"] != "" : - for server in vars["SERVER_NAME"].split(" ") : - vars_site = vars.copy() - vars_site["SERVER_NAME"] = server - utils.log("[*] Generating config for " + vars["SERVER_NAME"] + " ...") - if not self.generate(instances, vars_site) or not self.activate(instances, vars_site, reload=False) : - utils.log("[!] Can't generate/activate site config for " + server) - return False - utils.log("[*] Generated config for " + vars["SERVER_NAME"]) - with open("/etc/nginx/autoconf", "w") as f : - f.write("ok") - utils.log("[*] Waiting for bunkerized-nginx tasks ...") i = 1 started = False @@ -50,12 +23,18 @@ class Config : utils.log("[!] Waiting " + str(i) + " seconds before retrying to contact bunkerized-nginx tasks") if started : utils.log("[*] bunkerized-nginx tasks started") - proc = subprocess.run(["/bin/su", "-s", "/opt/entrypoint/jobs.sh", "nginx"], env=vars, capture_output=True) + proc = subprocess.run(["/bin/su", "-c", "/opt/entrypoint/jobs.sh", "nginx"], capture_output=True) + stdout = proc.stdout.decode("ascii") + stderr = proc.stderr.decode("ascii") + if stdout != "" : + utils.log("[*] Jobs output : " + stdout) + if stderr != "" : + utils.log("[!] Jobs error : " + stderr) return proc.returncode == 0 else : utils.log("[!] bunkerized-nginx tasks are not started") except Exception as e : - utils.log("[!] Error while initializing config : " + str(e)) + utils.log("[!] Error while waiting for Swarm tasks : " + str(e)) return False def generate(self, env) : @@ -71,9 +50,9 @@ class Config : # Print stdout/stderr stdout = proc.stdout.decode("ascii") stderr = proc.stderr.decode("ascii") - if proc.stdout != "": + if stdout != "": utils.log("[*] Generator output : " + stdout) - if proc.stderr != "" : + if stderr != "" : utils.log("[*] Generator error : " + stderr) # We're done @@ -111,7 +90,7 @@ class Config : req = requests.post("http://" + fqdn + ":8080" + self.__api + path) except : pass - if req and req.status_code == 200 : + if req and req.status_code == 200 and req.text == "ok" : utils.log("[*] Sent API order " + path + " to instance " + fqdn + " (service.node.task)") else : utils.log("[!] Can't send API order " + path + " to instance " + fqdn + " (service.node.task)") diff --git a/confs/global/api.conf b/confs/global/api.conf index 55beb1f..cf62567 100644 --- a/confs/global/api.conf +++ b/confs/global/api.conf @@ -10,10 +10,10 @@ rewrite_by_lua_block { ngx.header.content_type = 'text/plain' if api.do_api_call(api_uri) then logger.log(ngx.NOTICE, "API", "API call " .. ngx.var.request_uri .. " successfull from " .. ngx.var.remote_addr) - ngx.say("ok") + ngx.print("ok") else logger.log(ngx.WARN, "API", "API call " .. ngx.var.request_uri .. " failed from " .. ngx.var.remote_addr) - ngx.say("ko") + ngx.print("ko") end ngx.exit(ngx.HTTP_OK) diff --git a/examples/swarm/stack.yml b/examples/swarm/stack.yml index f803f62..41856c6 100644 --- a/examples/swarm/stack.yml +++ b/examples/swarm/stack.yml @@ -74,7 +74,7 @@ services: - "node.role==worker" labels: - "bunkerized-nginx.SERVER_NAME=app1.website.com" - - "bunkerized-nginx.REMOTE_PHP=php" + - "bunkerized-nginx.REMOTE_PHP=app1" - "bunkerized-nginx.REMOTE_PHP_PATH=/www" app2: