diff --git a/containers/osbuild-composer/entrypoint.py b/containers/osbuild-composer/entrypoint.py index 89090428d..685378e90 100644 --- a/containers/osbuild-composer/entrypoint.py +++ b/containers/osbuild-composer/entrypoint.py @@ -95,12 +95,27 @@ class Cli(contextlib.AbstractContextManager): help="Disable the weldr-API", ) + # --[no-]dnf-json + self._parser.add_argument( + "--dnf-json", + action="store_true", + dest="dnf_json", + help="Enable dnf-json", + ) + self._parser.add_argument( + "--no-dnf-json", + action="store_false", + dest="dnf_json", + help="Disable dnf-json", + ) + self._parser.set_defaults( builtin_worker=False, composer_api=False, local_worker_api=False, remote_worker_api=False, weldr_api=False, + dnf_json=False, ) return self._parser.parse_args(self._argv[1:]) @@ -238,11 +253,29 @@ class Cli(contextlib.AbstractContextManager): preexec_fn=preexec_setenv, ) + def _spawn_dnf_json(self): + cmd = [ + "/usr/libexec/osbuild-composer/dnf-json", + ] + + dnfenv = os.environ.copy() + dnfenv["LISTEN_FDS"] = "0" + dnfenv["LISTEN_FDNAMES"] = "" + + return subprocess.Popen( + cmd, + cwd="/usr/libexec/osbuild-composer", + stdin=subprocess.DEVNULL, + stderr=subprocess.STDOUT, + env=dnfenv, + ) + def run(self): """Program Runtime""" proc_composer = None proc_worker = None + proc_dnf_json = None res = 0 sockets = self._prepare_sockets() @@ -250,24 +283,35 @@ class Cli(contextlib.AbstractContextManager): if self.args.builtin_worker: proc_worker = self._spawn_worker() + if self.args.dnf_json: + proc_dnf_json = self._spawn_dnf_json() + proc_composer = self._spawn_composer(sockets) res = proc_composer.wait() if proc_worker: proc_worker.terminate() proc_worker.wait() + if proc_dnf_json: + proc_dnf_json.terminate() + proc_dnf_json.wait() return res except KeyboardInterrupt: if proc_worker: proc_worker.terminate() proc_worker.wait() + if proc_dnf_json: + proc_dnf_json.terminate() + proc_dnf_json.wait() if proc_composer: proc_composer.terminate() res = proc_composer.wait() except: if proc_worker: proc_worker.kill() + if proc_dnf_json: + proc_dnf_json.kill() if proc_composer: proc_composer.kill() raise diff --git a/dnf-json b/dnf-json index 8dd9397b2..9f16dd1f8 100755 --- a/dnf-json +++ b/dnf-json @@ -10,6 +10,7 @@ import socketserver import logging import sys from http.server import BaseHTTPRequestHandler +import pathlib import dnf import hawkey @@ -254,15 +255,21 @@ class DnfJsonRequestHandler(BaseHTTPRequestHandler): log.info("Starting the dnf-json server") LISTEN_FDS = int(os.environ.get("LISTEN_FDS", 0)) +SOCK_PATH = "/run/osbuild-dnf-json/" +SOCK_NAME = "api.sock" class SystemDActivationSocketServer(socketserver.ForkingMixIn, socketserver.UnixStreamServer): def server_bind(self): log.debug("service bind") - assert LISTEN_FDS == 1 - log.debug("rebind socket") - log.debug("address_family: %d ", self.address_family) - log.debug("socket_type: %d ", self.socket_type) - self.socket = socket.fromfd(3, self.address_family, self.socket_type) + if LISTEN_FDS == 0: + log.debug("create new socket") + socketserver.UnixStreamServer.server_bind(self) + else: + log.debug("rebind socket") + log.debug("address_family: %d ", self.address_family) + log.debug("socket_type: %d ", self.socket_type) + self.socket = socket.fromfd(3, self.address_family, self.socket_type) -server = SystemDActivationSocketServer('', DnfJsonRequestHandler) +pathlib.Path(SOCK_PATH).mkdir(parents=True, exist_ok=True) +server = SystemDActivationSocketServer(f"{SOCK_PATH}{SOCK_NAME}", DnfJsonRequestHandler) server.serve_forever() diff --git a/test/cases/regression-old-worker-new-composer.sh b/test/cases/regression-old-worker-new-composer.sh index c01f1acf9..486534257 100644 --- a/test/cases/regression-old-worker-new-composer.sh +++ b/test/cases/regression-old-worker-new-composer.sh @@ -68,7 +68,7 @@ sudo podman run \ -v "$WELDR_DIR:/run/weldr/":Z \ -p 8700:8700 \ "quay.io/osbuild/osbuild-composer-ubi-pr:${CI_COMMIT_SHA}" \ - --weldr-api --remote-worker-api \ + --weldr-api --dnf-json --remote-worker-api \ --no-local-worker-api --no-composer-api # try starting a worker