dnf-json: Can be started without systemd

Instead of starting the socket in the entrypoint, make dnf-json able to
bind on the unixsocket by itself.
This commit is contained in:
sanne 2021-12-01 16:04:28 +01:00 committed by Thomas Lavocat
parent 0877ae3ac0
commit 83e16afda4
3 changed files with 58 additions and 7 deletions

View file

@ -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

View file

@ -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()

View file

@ -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