From 24d9cce82f1a23bda66044ae8b6ba0a8f6742ea5 Mon Sep 17 00:00:00 2001 From: bunkerity Date: Fri, 30 Jul 2021 17:08:54 +0200 Subject: [PATCH] autoconf - various bug fixes in Swarm mode --- autoconf/src/Config.py | 15 +++++++++++++++ autoconf/src/Controller.py | 10 +++++++--- autoconf/src/DockerController.py | 4 ++++ autoconf/src/IngressController.py | 5 ++++- autoconf/src/SwarmController.py | 4 ++++ autoconf/src/app.py | 8 +++++++- entrypoint/permissions-swarm.sh | 2 +- entrypoint/permissions.sh | 2 +- jobs/Job.py | 6 +++--- 9 files changed, 46 insertions(+), 10 deletions(-) diff --git a/autoconf/src/Config.py b/autoconf/src/Config.py index 69d878b..1defdb7 100644 --- a/autoconf/src/Config.py +++ b/autoconf/src/Config.py @@ -12,6 +12,21 @@ class Config : self.__type = type self.__api_uri = api_uri + + def __jobs(self) : + log("config", "INFO", "starting jobs ...") + proc = subprocess.run(["/bin/su", "-c", "/opt/bunkerized-nginx/entrypoint/jobs.sh", "nginx"], capture_output=True) + stdout = proc.stdout.decode("ascii") + stderr = proc.stderr.decode("ascii") + if len(stdout) > 1 : + log("config", "INFO", "jobs stdout : " + stdout) + if stderr != "" : + log("config", "ERROR", "jobs stderr : " + stderr) + if proc.returncode != 0 : + log("config", "ERROR", "jobs error (return code = " + str(proc.returncode) + ")") + return False + return True + def gen(self, env) : try : # Write environment variables to a file diff --git a/autoconf/src/Controller.py b/autoconf/src/Controller.py index fe810f7..ea2cba2 100644 --- a/autoconf/src/Controller.py +++ b/autoconf/src/Controller.py @@ -11,7 +11,7 @@ class Type(Enum) : class Controller(ABC) : def __init__(self, type, api_uri=None, lock=None) : - self.__config = Config(type, api_uri) + self._config = Config(type, api_uri) self.lock = lock @abstractmethod @@ -27,7 +27,11 @@ class Controller(ABC) : return fixed_env def gen_conf(self, env) : - return self.__config.gen(env) + return self._config.gen(env) + + @abstractmethod + def wait(self) : + pass @abstractmethod def process_events(self, current_env) : @@ -38,4 +42,4 @@ class Controller(ABC) : pass def _reload(self, instances) : - return self.__config.reload(instances) + return self._config.reload(instances) diff --git a/autoconf/src/DockerController.py b/autoconf/src/DockerController.py index 98a3b43..69ea32f 100644 --- a/autoconf/src/DockerController.py +++ b/autoconf/src/DockerController.py @@ -57,3 +57,7 @@ class DockerController(Controller.Controller) : def reload(self) : return self._reload(self.__get_instances()) + + def wait(self) : + # TODO : healthcheck ? + return True diff --git a/autoconf/src/IngressController.py b/autoconf/src/IngressController.py index 4ee7ad4..cb2582c 100644 --- a/autoconf/src/IngressController.py +++ b/autoconf/src/IngressController.py @@ -1,5 +1,5 @@ from kubernetes import client, config, watch -from threading import Thread +from threading import Thread, Lock import Controller @@ -96,3 +96,6 @@ class IngressController(Controller.Controller) : def reload(self) : return self._reload(self.__get_ingresses()) + + def wait(self) : + return self._config.wait(self.__get_ingresses()) diff --git a/autoconf/src/SwarmController.py b/autoconf/src/SwarmController.py index 63fd000..0b66c1f 100644 --- a/autoconf/src/SwarmController.py +++ b/autoconf/src/SwarmController.py @@ -1,4 +1,5 @@ import docker +from threading import Lock from logger import log @@ -59,3 +60,6 @@ class SwarmController(Controller.Controller) : def reload(self) : return self._reload(self.__get_instances()) + + def wait(self) : + return self._config.wait(self.__get_instances()) diff --git a/autoconf/src/app.py b/autoconf/src/app.py index 27de9cc..a252cca 100644 --- a/autoconf/src/app.py +++ b/autoconf/src/app.py @@ -28,12 +28,18 @@ else : # Run the reload server in background if needed if swarm or kubernetes : + log("autoconf", "INFO", "start reload server in background") (server, thread) = run_reload_server(controller) # Apply the first config for existing services current_env = controller.get_env() if current_env != {} : - controller.gen_conf(current_env) + log("autoconf", "INFO", "generating the initial configuration...") + if controller.gen_conf(current_env) : + log("autoconf", "INFO", "initial configuration successfully generated") + else : + log("autoconf", "ERROR", "error while generating initial configuration") # Process events +log("autoconf", "INFO", "waiting for events ...") controller.process_events(current_env) diff --git a/entrypoint/permissions-swarm.sh b/entrypoint/permissions-swarm.sh index a6ba278..2399c97 100644 --- a/entrypoint/permissions-swarm.sh +++ b/entrypoint/permissions-swarm.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # /etc/letsencrypt if [ ! -r "/etc/letsencrypt" ] || [ ! -x "/etc/letsencrypt" ] ; then diff --git a/entrypoint/permissions.sh b/entrypoint/permissions.sh index 662cfe5..5204c8e 100644 --- a/entrypoint/permissions.sh +++ b/entrypoint/permissions.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # /etc/letsencrypt if [ ! -w "/etc/letsencrypt" ] || [ ! -r "/etc/letsencrypt" ] || [ ! -x "/etc/letsencrypt" ] ; then diff --git a/jobs/Job.py b/jobs/Job.py index 6d0cbf8..b27239d 100644 --- a/jobs/Job.py +++ b/jobs/Job.py @@ -1,4 +1,4 @@ -import abc, requests, redis, os, datetime, traceback, re, shutil, enum, filecmp, subprocess +import abc, requests, redis, os, datetime, traceback, re, shutil, enum, filecmp, subprocess, stat, socket from logger import log @@ -19,9 +19,9 @@ class JobManagement() : if os.path.isfile("/usr/sbin/nginx") and os.path.isfile("/tmp/nginx.pid") : self.__local_nginx = True self.__autoconf_socket = None - if os.path.exists("/tmp/autoconf.sock") and stat.S_ISSOCK(os.stat("/tmp/autoconf.sock")) : + if os.path.exists("/tmp/autoconf.sock") and stat.S_ISSOCK(os.stat("/tmp/autoconf.sock").st_mode) : self.__autoconf_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - self.__autoconf_socket.connect() + self.__autoconf_socket.connect("/tmp/autoconf.sock") def __autoconf_order(self, order) : self.__autoconf_socket.sendall(order)