*(f"--exclude-prefix={d}" for d in ("/tmp", "/var/tmp", "/run", "/proc", "/sys", "/dev")),
]
+ sandbox = context.sandbox(
+ options=[
+ "--bind", context.root, context.root,
+ # systemd uses acl.h to parse ACLs in tmpfiles snippets which uses the host's passwd so we have to
+ # mount the image's passwd over it to make ACL parsing work.
+ *finalize_passwd_mounts(context.root)
+ ],
+ )
+
result = run(
cmdline,
- sandbox=context.sandbox(
- options=[
- "--bind", context.root, context.root,
- # systemd uses acl.h to parse ACLs in tmpfiles snippets which uses the host's passwd so we have to
- # mount the image's passwd over it to make ACL parsing work.
- *finalize_passwd_mounts(context.root)
- ],
- ),
+ sandbox=sandbox,
env={"SYSTEMD_TMPFILES_FORCE_SUBVOL": "0"},
check=False,
)
# systemd-tmpfiles can exit with DATAERR or CANTCREAT in some cases which are handled as success by the
# systemd-tmpfiles service so we handle those as success as well.
if result.returncode not in (0, 65, 73):
- log_process_failure(cmdline, result.returncode)
+ log_process_failure([str(s) for s in sandbox], cmdline, result.returncode)
raise subprocess.CalledProcessError(result.returncode, cmdline)
signal.SIGKILL = old
-def log_process_failure(cmdline: Sequence[str], returncode: int) -> None:
+def log_process_failure(sandbox: Sequence[str], cmdline: Sequence[str], returncode: int) -> None:
if returncode < 0:
logging.error(f"Interrupted by {signal.Signals(-returncode).name} signal")
else:
- logging.error(f"\"{shlex.join(cmdline)}\" returned non-zero exit code {returncode}.")
+ logging.error(
+ f"\"{shlex.join([*sandbox, *cmdline] if ARG_DEBUG.get() else cmdline)}\" returned non-zero exit code "
+ f" {returncode}."
+ )
def run(
cmdline = [os.fspath(x) for x in cmdline]
if ARG_DEBUG.get():
- logging.info(f"+ {shlex.join(sandbox + cmdline)}")
+ logging.info(f"+ {shlex.join(cmdline)}")
if not stdout and not stderr:
# Unless explicit redirection is done, print all subprocess
die(f"{e.filename} not found.")
except subprocess.CalledProcessError as e:
if log:
- log_process_failure(cmdline, e.returncode)
+ log_process_failure(sandbox, cmdline, e.returncode)
if ARG_DEBUG_SHELL.get():
subprocess.run(
[*sandbox, "bash"],
cmdline = [os.fspath(x) for x in cmdline]
if ARG_DEBUG.get():
- logging.info(f"+ {shlex.join(sandbox + cmdline)}")
+ logging.info(f"+ {shlex.join(cmdline)}")
if not stdout and not stderr:
# Unless explicit redirection is done, print all subprocess
die(f"{e.filename} not found.")
except subprocess.CalledProcessError as e:
if log:
- log_process_failure(cmdline, e.returncode)
+ log_process_failure(sandbox, cmdline, e.returncode)
raise e
finally:
if foreground: