autoconf - fixing various bug when SWARM_MODE=yes

This commit is contained in:
bunkerity 2021-05-28 12:16:56 +02:00
parent 0f8e56a668
commit dfce0c06dd
No known key found for this signature in database
GPG Key ID: 3D80806F12602A7C
4 changed files with 20 additions and 36 deletions

View File

@ -96,6 +96,11 @@ class AutoConf :
utils.log("[*] Initial config succeeded") utils.log("[*] Initial config succeeded")
with open("/etc/nginx/autoconf", "w") as f : with open("/etc/nginx/autoconf", "w") as f :
f.write("ok") 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 : 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)

View File

@ -9,35 +9,8 @@ class Config :
self.__swarm = swarm self.__swarm = swarm
self.__api = api self.__api = api
def initconf(self, instances) : def swarm_wait(self, instances) :
try : 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 ...") utils.log("[*] Waiting for bunkerized-nginx tasks ...")
i = 1 i = 1
started = False started = False
@ -50,12 +23,18 @@ class Config :
utils.log("[!] Waiting " + str(i) + " seconds before retrying to contact bunkerized-nginx tasks") utils.log("[!] Waiting " + str(i) + " seconds before retrying to contact bunkerized-nginx tasks")
if started : if started :
utils.log("[*] bunkerized-nginx tasks 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 return proc.returncode == 0
else : else :
utils.log("[!] bunkerized-nginx tasks are not started") utils.log("[!] bunkerized-nginx tasks are not started")
except Exception as e : except Exception as e :
utils.log("[!] Error while initializing config : " + str(e)) utils.log("[!] Error while waiting for Swarm tasks : " + str(e))
return False return False
def generate(self, env) : def generate(self, env) :
@ -71,9 +50,9 @@ class Config :
# Print stdout/stderr # Print stdout/stderr
stdout = proc.stdout.decode("ascii") stdout = proc.stdout.decode("ascii")
stderr = proc.stderr.decode("ascii") stderr = proc.stderr.decode("ascii")
if proc.stdout != "": if stdout != "":
utils.log("[*] Generator output : " + stdout) utils.log("[*] Generator output : " + stdout)
if proc.stderr != "" : if stderr != "" :
utils.log("[*] Generator error : " + stderr) utils.log("[*] Generator error : " + stderr)
# We're done # We're done
@ -111,7 +90,7 @@ class Config :
req = requests.post("http://" + fqdn + ":8080" + self.__api + path) req = requests.post("http://" + fqdn + ":8080" + self.__api + path)
except : except :
pass 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)") utils.log("[*] Sent API order " + path + " to instance " + fqdn + " (service.node.task)")
else : else :
utils.log("[!] Can't send API order " + path + " to instance " + fqdn + " (service.node.task)") utils.log("[!] Can't send API order " + path + " to instance " + fqdn + " (service.node.task)")

View File

@ -10,10 +10,10 @@ rewrite_by_lua_block {
ngx.header.content_type = 'text/plain' ngx.header.content_type = 'text/plain'
if api.do_api_call(api_uri) then 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) logger.log(ngx.NOTICE, "API", "API call " .. ngx.var.request_uri .. " successfull from " .. ngx.var.remote_addr)
ngx.say("ok") ngx.print("ok")
else else
logger.log(ngx.WARN, "API", "API call " .. ngx.var.request_uri .. " failed from " .. ngx.var.remote_addr) logger.log(ngx.WARN, "API", "API call " .. ngx.var.request_uri .. " failed from " .. ngx.var.remote_addr)
ngx.say("ko") ngx.print("ko")
end end
ngx.exit(ngx.HTTP_OK) ngx.exit(ngx.HTTP_OK)

View File

@ -74,7 +74,7 @@ services:
- "node.role==worker" - "node.role==worker"
labels: labels:
- "bunkerized-nginx.SERVER_NAME=app1.website.com" - "bunkerized-nginx.SERVER_NAME=app1.website.com"
- "bunkerized-nginx.REMOTE_PHP=php" - "bunkerized-nginx.REMOTE_PHP=app1"
- "bunkerized-nginx.REMOTE_PHP_PATH=/www" - "bunkerized-nginx.REMOTE_PHP_PATH=/www"
app2: app2: