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:
parent
0877ae3ac0
commit
83e16afda4
3 changed files with 58 additions and 7 deletions
|
|
@ -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
|
||||
|
|
|
|||
19
dnf-json
19
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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue