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",
|
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(
|
self._parser.set_defaults(
|
||||||
builtin_worker=False,
|
builtin_worker=False,
|
||||||
composer_api=False,
|
composer_api=False,
|
||||||
local_worker_api=False,
|
local_worker_api=False,
|
||||||
remote_worker_api=False,
|
remote_worker_api=False,
|
||||||
weldr_api=False,
|
weldr_api=False,
|
||||||
|
dnf_json=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
return self._parser.parse_args(self._argv[1:])
|
return self._parser.parse_args(self._argv[1:])
|
||||||
|
|
@ -238,11 +253,29 @@ class Cli(contextlib.AbstractContextManager):
|
||||||
preexec_fn=preexec_setenv,
|
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):
|
def run(self):
|
||||||
"""Program Runtime"""
|
"""Program Runtime"""
|
||||||
|
|
||||||
proc_composer = None
|
proc_composer = None
|
||||||
proc_worker = None
|
proc_worker = None
|
||||||
|
proc_dnf_json = None
|
||||||
res = 0
|
res = 0
|
||||||
sockets = self._prepare_sockets()
|
sockets = self._prepare_sockets()
|
||||||
|
|
||||||
|
|
@ -250,24 +283,35 @@ class Cli(contextlib.AbstractContextManager):
|
||||||
if self.args.builtin_worker:
|
if self.args.builtin_worker:
|
||||||
proc_worker = self._spawn_worker()
|
proc_worker = self._spawn_worker()
|
||||||
|
|
||||||
|
if self.args.dnf_json:
|
||||||
|
proc_dnf_json = self._spawn_dnf_json()
|
||||||
|
|
||||||
proc_composer = self._spawn_composer(sockets)
|
proc_composer = self._spawn_composer(sockets)
|
||||||
|
|
||||||
res = proc_composer.wait()
|
res = proc_composer.wait()
|
||||||
if proc_worker:
|
if proc_worker:
|
||||||
proc_worker.terminate()
|
proc_worker.terminate()
|
||||||
proc_worker.wait()
|
proc_worker.wait()
|
||||||
|
if proc_dnf_json:
|
||||||
|
proc_dnf_json.terminate()
|
||||||
|
proc_dnf_json.wait()
|
||||||
|
|
||||||
return res
|
return res
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
if proc_worker:
|
if proc_worker:
|
||||||
proc_worker.terminate()
|
proc_worker.terminate()
|
||||||
proc_worker.wait()
|
proc_worker.wait()
|
||||||
|
if proc_dnf_json:
|
||||||
|
proc_dnf_json.terminate()
|
||||||
|
proc_dnf_json.wait()
|
||||||
if proc_composer:
|
if proc_composer:
|
||||||
proc_composer.terminate()
|
proc_composer.terminate()
|
||||||
res = proc_composer.wait()
|
res = proc_composer.wait()
|
||||||
except:
|
except:
|
||||||
if proc_worker:
|
if proc_worker:
|
||||||
proc_worker.kill()
|
proc_worker.kill()
|
||||||
|
if proc_dnf_json:
|
||||||
|
proc_dnf_json.kill()
|
||||||
if proc_composer:
|
if proc_composer:
|
||||||
proc_composer.kill()
|
proc_composer.kill()
|
||||||
raise
|
raise
|
||||||
|
|
|
||||||
19
dnf-json
19
dnf-json
|
|
@ -10,6 +10,7 @@ import socketserver
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
from http.server import BaseHTTPRequestHandler
|
from http.server import BaseHTTPRequestHandler
|
||||||
|
import pathlib
|
||||||
|
|
||||||
import dnf
|
import dnf
|
||||||
import hawkey
|
import hawkey
|
||||||
|
|
@ -254,15 +255,21 @@ class DnfJsonRequestHandler(BaseHTTPRequestHandler):
|
||||||
log.info("Starting the dnf-json server")
|
log.info("Starting the dnf-json server")
|
||||||
|
|
||||||
LISTEN_FDS = int(os.environ.get("LISTEN_FDS", 0))
|
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):
|
class SystemDActivationSocketServer(socketserver.ForkingMixIn, socketserver.UnixStreamServer):
|
||||||
def server_bind(self):
|
def server_bind(self):
|
||||||
log.debug("service bind")
|
log.debug("service bind")
|
||||||
assert LISTEN_FDS == 1
|
if LISTEN_FDS == 0:
|
||||||
log.debug("rebind socket")
|
log.debug("create new socket")
|
||||||
log.debug("address_family: %d ", self.address_family)
|
socketserver.UnixStreamServer.server_bind(self)
|
||||||
log.debug("socket_type: %d ", self.socket_type)
|
else:
|
||||||
self.socket = socket.fromfd(3, self.address_family, self.socket_type)
|
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()
|
server.serve_forever()
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ sudo podman run \
|
||||||
-v "$WELDR_DIR:/run/weldr/":Z \
|
-v "$WELDR_DIR:/run/weldr/":Z \
|
||||||
-p 8700:8700 \
|
-p 8700:8700 \
|
||||||
"quay.io/osbuild/osbuild-composer-ubi-pr:${CI_COMMIT_SHA}" \
|
"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
|
--no-local-worker-api --no-composer-api
|
||||||
|
|
||||||
# try starting a worker
|
# try starting a worker
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue