From 53c5dc5446a3a3fee3d54af3ab7a57f74341cebe Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Fri, 7 Apr 2023 11:37:39 +0200 Subject: [PATCH 1/8] test: run the generators with debug log level unless requested otherwise. --- test/units/generator-utils.sh | 2 +- test/units/testsuite-81.fstab-generator.sh | 2 -- test/units/testsuite-81.sh | 2 -- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/test/units/generator-utils.sh b/test/units/generator-utils.sh index 1973efefba..8f502d00cc 100644 --- a/test/units/generator-utils.sh +++ b/test/units/generator-utils.sh @@ -56,6 +56,6 @@ run_and_list() { local out_dir="${2:?}" rm -fr "${out_dir:?}"/* - "$generator" "$out_dir" + SYSTEMD_LOG_LEVEL="${SYSTEMD_LOG_LEVEL:-debug}" "$generator" "$out_dir" ls -lR "$out_dir" } diff --git a/test/units/testsuite-81.fstab-generator.sh b/test/units/testsuite-81.fstab-generator.sh index a9efc0bc7a..b57a2c7d67 100755 --- a/test/units/testsuite-81.fstab-generator.sh +++ b/test/units/testsuite-81.fstab-generator.sh @@ -7,8 +7,6 @@ set -o pipefail # shellcheck source=test/units/generator-utils.sh . "$(dirname "$0")/generator-utils.sh" -export SYSTEMD_LOG_LEVEL=debug - GENERATOR_BIN="/usr/lib/systemd/system-generators/systemd-fstab-generator" NETWORK_FS_RX="^(afs|ceph|cifs|gfs|gfs2|ncp|ncpfs|nfs|nfs4|ocfs2|orangefs|pvfs2|smb3|smbfs|davfs|glusterfs|lustre|sshfs)$" OUT_DIR="$(mktemp -d /tmp/fstab-generator.XXX)" diff --git a/test/units/testsuite-81.sh b/test/units/testsuite-81.sh index 63f4cb6430..13c767e490 100755 --- a/test/units/testsuite-81.sh +++ b/test/units/testsuite-81.sh @@ -5,8 +5,6 @@ set -o pipefail : >/failed -systemctl log-level debug - for script in "${0%.sh}".*.sh; do echo "Running $script" "./$script" From 2d4eb78ce19169a816af9d3dca36579bf6c2fe34 Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Sat, 8 Apr 2023 20:49:14 +0200 Subject: [PATCH 2/8] test: check if x-systemd.automount is ignored for rootfs --- test/units/testsuite-81.fstab-generator.sh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/test/units/testsuite-81.fstab-generator.sh b/test/units/testsuite-81.fstab-generator.sh index b57a2c7d67..20b9d0f19a 100755 --- a/test/units/testsuite-81.fstab-generator.sh +++ b/test/units/testsuite-81.fstab-generator.sh @@ -63,7 +63,7 @@ FSTAB_GENERAL=( FSTAB_GENERAL_ROOT=( # rootfs with bunch of options we should ignore and fsck enabled - "/dev/test1 / ext4 noauto,nofail,automount,x-systemd.wanted-by=foo,x-systemd.required-by=bar 0 1" + "/dev/test1 / ext4 noauto,nofail,x-systemd.automount,x-systemd.wanted-by=foo,x-systemd.required-by=bar 0 1" "${FSTAB_GENERAL[@]}" ) @@ -249,8 +249,14 @@ check_fstab_mount_units() { elif [[ "$opt" == x-systemd.automount ]]; then # The $unit should have an accompanying automount unit supp="$(systemd-escape --suffix=automount --path "$where")" - test -e "$out_dir/$supp" - link_eq "$out_dir/local-fs.target.requires/$supp" "../$supp" + if [[ "$where" == / ]]; then + # This option is ignored for rootfs mounts + test ! -e "$out_dir/$supp" + (! link_eq "$out_dir/local-fs.target.requires/$supp" "../$supp") + else + test -e "$out_dir/$supp" + link_eq "$out_dir/local-fs.target.requires/$supp" "../$supp" + fi elif [[ "$opt" =~ ^x-systemd.idle-timeout= ]]; then # The timeout applies to the automount unit, not the original # mount one From ff8d435db4b91b9f89bee635b89b079d49d924f5 Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Sat, 8 Apr 2023 20:49:45 +0200 Subject: [PATCH 3/8] test: add a couple of test for fstab-related kernel cmdline args --- test/units/testsuite-81.fstab-generator.sh | 43 ++++++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/test/units/testsuite-81.fstab-generator.sh b/test/units/testsuite-81.fstab-generator.sh index 20b9d0f19a..c57cb9e239 100755 --- a/test/units/testsuite-81.fstab-generator.sh +++ b/test/units/testsuite-81.fstab-generator.sh @@ -289,9 +289,6 @@ check_fstab_mount_units() { done } -# TODO -# - kernel arguments - : "fstab-generator: regular" printf "%s\n" "${FSTAB_GENERAL_ROOT[@]}" >"$FSTAB" cat "$FSTAB" @@ -362,3 +359,43 @@ SYSTEMD_FSTAB="$FSTAB" SYSTEMD_PROC_CMDLINE="rd.fstab=0" run_and_list "$GENERATO SYSTEMD_FSTAB="$FSTAB" check_fstab_mount_units FSTAB_MINIMAL "$OUT_DIR" SYSTEMD_IN_INITRD=1 SYSTEMD_FSTAB="$FSTAB" SYSTEMD_PROC_CMDLINE="rd.fstab=0" run_and_list "$GENERATOR_BIN" "$OUT_DIR" (! SYSTEMD_IN_INITRD=1 SYSTEMD_FSTAB="$FSTAB" check_fstab_mount_units FSTAB_MINIMAL "$OUT_DIR") + +: "fstab-generator: kernel args - systemd.swap=0" +printf "%s\n" "${FSTAB_GENERAL_ROOT[@]}" >"$FSTAB" +cat "$FSTAB" +SYSTEMD_FSTAB="$FSTAB" SYSTEMD_PROC_CMDLINE="systemd.swap=0" run_and_list "$GENERATOR_BIN" "$OUT_DIR" +# No swap units should get created here +[[ "$(find "$OUT_DIR" -name "*.swap" | wc -l)" -eq 0 ]] + +# Possible TODO +# - combine the rootfs & usrfs arguments and mix them with fstab entries +# - systemd.volatile= +: "fstab-generator: kernel args - root= + rootfstype= + rootflags=" +# shellcheck disable=SC2034 +EXPECTED_FSTAB=( + "/dev/disk/by-label/rootfs / ext4 noexec,ro 0 1" +) +CMDLINE="root=LABEL=rootfs rootfstype=ext4 rootflags=noexec" +SYSTEMD_IN_INITRD=1 SYSTEMD_FSTAB=/dev/null SYSTEMD_SYSROOT_FSTAB=/dev/null SYSTEMD_PROC_CMDLINE="$CMDLINE" run_and_list "$GENERATOR_BIN" "$OUT_DIR" +# The /proc/cmdline here is a dummy value to tell the in_initrd_host() function +# we're parsing host's fstab, but it's all on the kernel cmdline instead +SYSTEMD_IN_INITRD=1 SYSTEMD_SYSROOT_FSTAB=/proc/cmdline check_fstab_mount_units EXPECTED_FSTAB "$OUT_DIR" + +# This is a very basic sanity test that involves manual checks, since adding it +# to the check_fstab_mount_units() function would make it way too complex +# (yet another possible TODO) +: "fstab-generator: kernel args - mount.usr= + mount.usrfstype= + mount.usrflags=" +CMDLINE="mount.usr=UUID=be780f43-8803-4a76-9732-02ceda6e9808 mount.usrfstype=ext4 mount.usrflags=noexec,nodev" +SYSTEMD_IN_INITRD=1 SYSTEMD_FSTAB=/dev/null SYSTEMD_SYSROOT_FSTAB=/dev/null SYSTEMD_PROC_CMDLINE="$CMDLINE" run_and_list "$GENERATOR_BIN" "$OUT_DIR" +cat "$OUT_DIR/sysroot-usr.mount" "$OUT_DIR/sysusr-usr.mount" +# The general idea here is to mount the device to /sysusr/usr and then +# bind-mount /sysusr/usr to /sysroot/usr +grep -qE "^What=/dev/disk/by-uuid/be780f43-8803-4a76-9732-02ceda6e9808$" "$OUT_DIR/sysusr-usr.mount" +grep -qE "^Where=/sysusr/usr$" "$OUT_DIR/sysusr-usr.mount" +grep -qE "^Type=ext4$" "$OUT_DIR/sysusr-usr.mount" +grep -qE "^Options=noexec,nodev,ro$" "$OUT_DIR/sysusr-usr.mount" +link_eq "$OUT_DIR/initrd-usr-fs.target.requires/sysusr-usr.mount" "../sysusr-usr.mount" +grep -qE "^What=/sysusr/usr$" "$OUT_DIR/sysroot-usr.mount" +grep -qE "^Where=/sysroot/usr$" "$OUT_DIR/sysroot-usr.mount" +grep -qE "^Options=bind$" "$OUT_DIR/sysroot-usr.mount" +link_eq "$OUT_DIR/initrd-fs.target.requires/sysroot-usr.mount" "../sysroot-usr.mount" From 7faa4e3782cfcfaab2457abbb32b765a2c918ee7 Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Fri, 14 Apr 2023 12:58:16 +0200 Subject: [PATCH 4/8] test: allow overriding PID1's environment for test purposes --- test/units/generator-utils.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/units/generator-utils.sh b/test/units/generator-utils.sh index 8f502d00cc..035fd55b0d 100644 --- a/test/units/generator-utils.sh +++ b/test/units/generator-utils.sh @@ -54,8 +54,26 @@ opt_filter_consumed() {( run_and_list() { local generator="${1:?}" local out_dir="${2:?}" + local environ + + # If $PID1_ENVIRON is set temporarily overmount /proc/1/environ with + # a temporary file that contains contents of $PID1_ENVIRON. This is + # necessary in cases where the generator reads the environment through + # getenv_for_pid(1, ...) or similar like getty-generator does. + # + # Note: $PID1_ENVIRON should be a NUL separated list of env assignments + if [[ -n "${PID1_ENVIRON:-}" ]]; then + environ="$(mktemp)" + echo -ne "${PID1_ENVIRON}\0" >"${environ:?}" + mount -v --bind "$environ" /proc/1/environ + fi rm -fr "${out_dir:?}"/* SYSTEMD_LOG_LEVEL="${SYSTEMD_LOG_LEVEL:-debug}" "$generator" "$out_dir" ls -lR "$out_dir" + + if [[ -n "${environ:-}" ]]; then + umount /proc/1/environ + rm -f "$environ" + fi } From e6c281c1cbb26749d8cabd0e38c45651e6bc3030 Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Fri, 14 Apr 2023 12:58:51 +0200 Subject: [PATCH 5/8] test: add a couple of tests for getty-generator --- test/test-functions | 1 + test/units/testsuite-81.getty-generator.sh | 89 ++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100755 test/units/testsuite-81.getty-generator.sh diff --git a/test/test-functions b/test/test-functions index 27951cb105..f6f2bd6322 100644 --- a/test/test-functions +++ b/test/test-functions @@ -195,6 +195,7 @@ BASICTOOLS=( losetup lz4cat mkfifo + mknod mktemp modprobe mount diff --git a/test/units/testsuite-81.getty-generator.sh b/test/units/testsuite-81.getty-generator.sh new file mode 100755 index 0000000000..a53aa4cee1 --- /dev/null +++ b/test/units/testsuite-81.getty-generator.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later +# shellcheck disable=SC2235 +set -eux +set -o pipefail +# Disable history expansion so we don't have to escape ! in strings below +set +o histexpand + +# shellcheck source=test/units/generator-utils.sh +. "$(dirname "$0")/generator-utils.sh" + +GENERATOR_BIN="/usr/lib/systemd/system-generators/systemd-getty-generator" +OUT_DIR="$(mktemp -d /tmp/getty-generator.XXX)" + +at_exit() { + rm -frv "${OUT_DIR:?}" +} + +trap at_exit EXIT + +test -x "${GENERATOR_BIN:?}" + +if in_container; then + # Do a limited test in a container, as writing to /dev is usually restrited + : "getty-generator: \$container_ttys env (container)" + # In a container we allow only /dev/pts/* ptys + PID1_ENVIRON="container_ttys=tty0 pts/0 /dev/tty0" run_and_list "$GENERATOR_BIN" "$OUT_DIR" + + # console-getty.service is always pulled in in containers + link_endswith "$OUT_DIR/getty.target.wants/console-getty.service" "/lib/systemd/system/console-getty.service" + link_endswith "$OUT_DIR/getty.target.wants/container-getty@0.service" "/lib/systemd/system/container-getty@.service" + test ! -e "$OUT_DIR/getty.target.wants/container-getty@tty0.service" + test ! -h "$OUT_DIR/getty.target.wants/container-getty@tty0.service" + + exit 0 +fi + +DUMMY_ACTIVE_CONSOLES=( + "hvc99" + "xvc99" + "hvsi99" + "sclp_line99" + "ttysclp99" + "3270!tty99" + "dummy99" +) +DUMMY_INACTIVE_CONSOLES=( + "inactive99" + "xvc199" +) +DUMMY_CONSOLES=( + "${DUMMY_ACTIVE_CONSOLES[@]}" + "${DUMMY_INACTIVE_CONSOLES[@]}" +) +# Create a bunch of dummy consoles +for console in "${DUMMY_CONSOLES[@]}"; do + mknod "/dev/$console" c 4 0 +done +# Sneak in one "not-a-tty" console +touch /dev/notatty99 +# Temporarily replace /sys/class/tty/console/active with our list of dummy +# consoles so getty-generator can process them +echo -ne "${DUMMY_ACTIVE_CONSOLES[@]}" /dev/notatty99 >/tmp/dummy-active-consoles +mount -v --bind /tmp/dummy-active-consoles /sys/class/tty/console/active + +: "getty-generator: no arguments" +# Sneak in an invalid value for $SYSTEMD_GETTY_AUTO to test things out +PID1_ENVIRON="SYSTEMD_GETTY_AUTO=foo" run_and_list "$GENERATOR_BIN" "$OUT_DIR" +for console in "${DUMMY_ACTIVE_CONSOLES[@]}"; do + unit="$(systemd-escape --template serial-getty@.service "$console")" + link_endswith "$OUT_DIR/getty.target.wants/$unit" /lib/systemd/system/serial-getty@.service +done +for console in "${DUMMY_INACTIVE_CONSOLES[@]}" /dev/notatty99; do + unit="$(systemd-escape --template serial-getty@.service "$console")" + test ! -e "$OUT_DIR/getty.target.wants/$unit" + test ! -h "$OUT_DIR/getty.target.wants/$unit" +done + +: "getty-generator: systemd.getty_auto=0 on kernel cmdline" +SYSTEMD_PROC_CMDLINE="systemd.getty_auto=foo systemd.getty_auto=0" run_and_list "$GENERATOR_BIN" "$OUT_DIR" +[[ "$(find "$OUT_DIR" ! -type d | wc -l)" -eq 0 ]] + +: "getty-generator: SYSTEMD_GETTY_AUTO=0 in PID1's environment" +PID1_ENVIRON="SYSTEMD_GETTY_AUTO=0" run_and_list "$GENERATOR_BIN" "$OUT_DIR" +[[ "$(find "$OUT_DIR" ! -type d | wc -l)" -eq 0 ]] + +# Cleanup +umount /sys/class/tty/console/active +rm -f "${DUMMY_CONSOLES[@]/#//dev/}" /dev/notatty99 From d72cf09859908b6b472edbdc937061ca8f26221e Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Fri, 14 Apr 2023 15:15:13 +0200 Subject: [PATCH 6/8] test: properly distinguish between generator phases Let's make sure the units generated by generators are generated at the right stage. --- test/units/generator-utils.sh | 3 +- test/units/testsuite-81.debug-generator.sh | 64 +++++++++++----------- test/units/testsuite-81.fstab-generator.sh | 30 +++++----- test/units/testsuite-81.getty-generator.sh | 14 ++--- 4 files changed, 56 insertions(+), 55 deletions(-) diff --git a/test/units/generator-utils.sh b/test/units/generator-utils.sh index 035fd55b0d..42c6a77353 100644 --- a/test/units/generator-utils.sh +++ b/test/units/generator-utils.sh @@ -69,7 +69,8 @@ run_and_list() { fi rm -fr "${out_dir:?}"/* - SYSTEMD_LOG_LEVEL="${SYSTEMD_LOG_LEVEL:-debug}" "$generator" "$out_dir" + mkdir -p "$out_dir"/{normal,early,late} + SYSTEMD_LOG_LEVEL="${SYSTEMD_LOG_LEVEL:-debug}" "$generator" "$out_dir/normal" "$out_dir/early" "$out_dir/late" ls -lR "$out_dir" if [[ -n "${environ:-}" ]]; then diff --git a/test/units/testsuite-81.debug-generator.sh b/test/units/testsuite-81.debug-generator.sh index d2b2bf1111..fddf85a54c 100755 --- a/test/units/testsuite-81.debug-generator.sh +++ b/test/units/testsuite-81.debug-generator.sh @@ -37,69 +37,69 @@ ARGS=( : "debug-shell: regular" CMDLINE="ro root=/ ${ARGS[*]} rd.systemd.debug_shell" SYSTEMD_PROC_CMDLINE="$CMDLINE" run_and_list "$GENERATOR_BIN" "$OUT_DIR" -link_eq "$OUT_DIR/masked-no-suffix.service" /dev/null -link_eq "$OUT_DIR/masked.service" /dev/null -link_eq "$OUT_DIR/masked.socket" /dev/null -link_endswith "$OUT_DIR/default.target.wants/wanted-no-suffix.service" /lib/systemd/system/wanted-no-suffix.service -link_endswith "$OUT_DIR/default.target.wants/wanted.service" /lib/systemd/system/wanted.service -link_endswith "$OUT_DIR/default.target.wants/wanted.mount" /lib/systemd/system/wanted.mount +link_eq "$OUT_DIR/early/masked-no-suffix.service" /dev/null +link_eq "$OUT_DIR/early/masked.service" /dev/null +link_eq "$OUT_DIR/early/masked.socket" /dev/null +link_endswith "$OUT_DIR/early/default.target.wants/wanted-no-suffix.service" /lib/systemd/system/wanted-no-suffix.service +link_endswith "$OUT_DIR/early/default.target.wants/wanted.service" /lib/systemd/system/wanted.service +link_endswith "$OUT_DIR/early/default.target.wants/wanted.mount" /lib/systemd/system/wanted.mount # Following stuff should be ignored, as it's prefixed with rd. -test ! -h "$OUT_DIR/masked-initrd.service" -test ! -h "$OUT_DIR/default.target.wants/wants-initrd.service" -test ! -h "$OUT_DIR/default.target.wants/debug-shell.service" -test ! -d "$OUT_DIR/initrd.target.wants" +test ! -h "$OUT_DIR/early/masked-initrd.service" +test ! -h "$OUT_DIR/early/default.target.wants/wants-initrd.service" +test ! -h "$OUT_DIR/early/default.target.wants/debug-shell.service" +test ! -d "$OUT_DIR/early/initrd.target.wants" # Let's re-run the generator with systemd.debug_shell that should be honored : "debug-shell: regular + systemd.debug_shell" CMDLINE="$CMDLINE systemd.debug_shell" SYSTEMD_PROC_CMDLINE="$CMDLINE" run_and_list "$GENERATOR_BIN" "$OUT_DIR" -link_endswith "$OUT_DIR/default.target.wants/debug-shell.service" /lib/systemd/system/debug-shell.service +link_endswith "$OUT_DIR/early/default.target.wants/debug-shell.service" /lib/systemd/system/debug-shell.service # Same thing, but with custom tty : "debug-shell: regular + systemd.debug_shell=/dev/tty666" CMDLINE="$CMDLINE systemd.debug_shell=/dev/tty666" SYSTEMD_PROC_CMDLINE="$CMDLINE" run_and_list "$GENERATOR_BIN" "$OUT_DIR" -link_endswith "$OUT_DIR/default.target.wants/debug-shell.service" /lib/systemd/system/debug-shell.service -grep -F "/dev/tty666" "$OUT_DIR/debug-shell.service.d/50-tty.conf" +link_endswith "$OUT_DIR/early/default.target.wants/debug-shell.service" /lib/systemd/system/debug-shell.service +grep -F "/dev/tty666" "$OUT_DIR/early/debug-shell.service.d/50-tty.conf" # Now override the default target via systemd.unit= : "debug-shell: regular + systemd.unit=" CMDLINE="$CMDLINE systemd.unit=my-fancy.target" SYSTEMD_PROC_CMDLINE="$CMDLINE" run_and_list "$GENERATOR_BIN" "$OUT_DIR" -link_eq "$OUT_DIR/masked-no-suffix.service" /dev/null -link_eq "$OUT_DIR/masked.service" /dev/null -link_eq "$OUT_DIR/masked.socket" /dev/null -link_endswith "$OUT_DIR/my-fancy.target.wants/wanted-no-suffix.service" /lib/systemd/system/wanted-no-suffix.service -link_endswith "$OUT_DIR/my-fancy.target.wants/wanted.service" /lib/systemd/system/wanted.service -link_endswith "$OUT_DIR/my-fancy.target.wants/wanted.mount" /lib/systemd/system/wanted.mount -link_endswith "$OUT_DIR/my-fancy.target.wants/debug-shell.service" /lib/systemd/system/debug-shell.service -test ! -d "$OUT_DIR/default.target.wants" +link_eq "$OUT_DIR/early/masked-no-suffix.service" /dev/null +link_eq "$OUT_DIR/early/masked.service" /dev/null +link_eq "$OUT_DIR/early/masked.socket" /dev/null +link_endswith "$OUT_DIR/early/my-fancy.target.wants/wanted-no-suffix.service" /lib/systemd/system/wanted-no-suffix.service +link_endswith "$OUT_DIR/early/my-fancy.target.wants/wanted.service" /lib/systemd/system/wanted.service +link_endswith "$OUT_DIR/early/my-fancy.target.wants/wanted.mount" /lib/systemd/system/wanted.mount +link_endswith "$OUT_DIR/early/my-fancy.target.wants/debug-shell.service" /lib/systemd/system/debug-shell.service +test ! -d "$OUT_DIR/early/default.target.wants" # Initrd scenario : "debug-shell: initrd" CMDLINE="ro root=/ ${ARGS[*]} systemd.debug_shell" SYSTEMD_IN_INITRD=1 SYSTEMD_PROC_CMDLINE="$CMDLINE" run_and_list "$GENERATOR_BIN" "$OUT_DIR" -link_eq "$OUT_DIR/masked-initrd.service" /dev/null -link_endswith "$OUT_DIR/initrd.target.wants/wanted-initrd.service" /lib/systemd/system/wanted-initrd.service +link_eq "$OUT_DIR/early/masked-initrd.service" /dev/null +link_endswith "$OUT_DIR/early/initrd.target.wants/wanted-initrd.service" /lib/systemd/system/wanted-initrd.service # The non-initrd stuff (i.e. without the rd. suffix) should be ignored in # this case -test ! -h "$OUT_DIR/masked-no-suffix.service" -test ! -h "$OUT_DIR/masked.service" -test ! -h "$OUT_DIR/masked.socket" -test ! -h "$OUT_DIR/initrd.target.wants/debug-shell.service" -test ! -d "$OUT_DIR/default.target.wants" +test ! -h "$OUT_DIR/early/masked-no-suffix.service" +test ! -h "$OUT_DIR/early/masked.service" +test ! -h "$OUT_DIR/early/masked.socket" +test ! -h "$OUT_DIR/early/initrd.target.wants/debug-shell.service" +test ! -d "$OUT_DIR/early/default.target.wants" # Again, but with rd.systemd.debug_shell : "debug-shell: initrd + rd.systemd.debug_shell" CMDLINE="$CMDLINE rd.systemd.debug_shell" SYSTEMD_IN_INITRD=1 SYSTEMD_PROC_CMDLINE="$CMDLINE" run_and_list "$GENERATOR_BIN" "$OUT_DIR" -link_endswith "$OUT_DIR/initrd.target.wants/debug-shell.service" /lib/systemd/system/debug-shell.service +link_endswith "$OUT_DIR/early/initrd.target.wants/debug-shell.service" /lib/systemd/system/debug-shell.service # Override the default target : "debug-shell: initrd + rd.systemd.unit" CMDLINE="$CMDLINE rd.systemd.unit=my-fancy-initrd.target" SYSTEMD_IN_INITRD=1 SYSTEMD_PROC_CMDLINE="$CMDLINE" run_and_list "$GENERATOR_BIN" "$OUT_DIR" -link_eq "$OUT_DIR/masked-initrd.service" /dev/null -link_endswith "$OUT_DIR/my-fancy-initrd.target.wants/wanted-initrd.service" /lib/systemd/system/wanted-initrd.service -test ! -d "$OUT_DIR/initrd.target.wants" +link_eq "$OUT_DIR/early/masked-initrd.service" /dev/null +link_endswith "$OUT_DIR/early/my-fancy-initrd.target.wants/wanted-initrd.service" /lib/systemd/system/wanted-initrd.service +test ! -d "$OUT_DIR/early/initrd.target.wants" diff --git a/test/units/testsuite-81.fstab-generator.sh b/test/units/testsuite-81.fstab-generator.sh index c57cb9e239..d772f8de0a 100755 --- a/test/units/testsuite-81.fstab-generator.sh +++ b/test/units/testsuite-81.fstab-generator.sh @@ -99,7 +99,7 @@ check_fstab_mount_units() { local what where fstype opts passno unit local item opt split_options filtered_options supp service device arg local array_name="${1:?}" - local out_dir="${2:?}" + local out_dir="${2:?}/normal" # Get a reference to the array from its name local -n fstab_entries="$array_name" @@ -321,10 +321,10 @@ SYSTEMD_IN_INITRD=1 SYSTEMD_FSTAB=/dev/null SYSTEMD_SYSROOT_FSTAB="$FSTAB" check # Check the default stuff that we (almost) always create in initrd : "fstab-generator: initrd default" SYSTEMD_IN_INITRD=1 SYSTEMD_FSTAB=/dev/null SYSTEMD_SYSROOT_FSTAB=/dev/null run_and_list "$GENERATOR_BIN" "$OUT_DIR" -test -e "$OUT_DIR/sysroot.mount" -test -e "$OUT_DIR/systemd-fsck-root.service" -link_eq "$OUT_DIR/initrd-root-fs.target.requires/sysroot.mount" "../sysroot.mount" -link_eq "$OUT_DIR/initrd-root-fs.target.requires/sysroot.mount" "../sysroot.mount" +test -e "$OUT_DIR/normal/sysroot.mount" +test -e "$OUT_DIR/normal/systemd-fsck-root.service" +link_eq "$OUT_DIR/normal/initrd-root-fs.target.requires/sysroot.mount" "../sysroot.mount" +link_eq "$OUT_DIR/normal/initrd-root-fs.target.requires/sysroot.mount" "../sysroot.mount" : "fstab-generator: run as systemd-sysroot-fstab-check in initrd" ln -svf "$GENERATOR_BIN" /tmp/systemd-sysroot-fstab-check @@ -387,15 +387,15 @@ SYSTEMD_IN_INITRD=1 SYSTEMD_SYSROOT_FSTAB=/proc/cmdline check_fstab_mount_units : "fstab-generator: kernel args - mount.usr= + mount.usrfstype= + mount.usrflags=" CMDLINE="mount.usr=UUID=be780f43-8803-4a76-9732-02ceda6e9808 mount.usrfstype=ext4 mount.usrflags=noexec,nodev" SYSTEMD_IN_INITRD=1 SYSTEMD_FSTAB=/dev/null SYSTEMD_SYSROOT_FSTAB=/dev/null SYSTEMD_PROC_CMDLINE="$CMDLINE" run_and_list "$GENERATOR_BIN" "$OUT_DIR" -cat "$OUT_DIR/sysroot-usr.mount" "$OUT_DIR/sysusr-usr.mount" +cat "$OUT_DIR/normal/sysroot-usr.mount" "$OUT_DIR/normal/sysusr-usr.mount" # The general idea here is to mount the device to /sysusr/usr and then # bind-mount /sysusr/usr to /sysroot/usr -grep -qE "^What=/dev/disk/by-uuid/be780f43-8803-4a76-9732-02ceda6e9808$" "$OUT_DIR/sysusr-usr.mount" -grep -qE "^Where=/sysusr/usr$" "$OUT_DIR/sysusr-usr.mount" -grep -qE "^Type=ext4$" "$OUT_DIR/sysusr-usr.mount" -grep -qE "^Options=noexec,nodev,ro$" "$OUT_DIR/sysusr-usr.mount" -link_eq "$OUT_DIR/initrd-usr-fs.target.requires/sysusr-usr.mount" "../sysusr-usr.mount" -grep -qE "^What=/sysusr/usr$" "$OUT_DIR/sysroot-usr.mount" -grep -qE "^Where=/sysroot/usr$" "$OUT_DIR/sysroot-usr.mount" -grep -qE "^Options=bind$" "$OUT_DIR/sysroot-usr.mount" -link_eq "$OUT_DIR/initrd-fs.target.requires/sysroot-usr.mount" "../sysroot-usr.mount" +grep -qE "^What=/dev/disk/by-uuid/be780f43-8803-4a76-9732-02ceda6e9808$" "$OUT_DIR/normal/sysusr-usr.mount" +grep -qE "^Where=/sysusr/usr$" "$OUT_DIR/normal/sysusr-usr.mount" +grep -qE "^Type=ext4$" "$OUT_DIR/normal/sysusr-usr.mount" +grep -qE "^Options=noexec,nodev,ro$" "$OUT_DIR/normal/sysusr-usr.mount" +link_eq "$OUT_DIR/normal/initrd-usr-fs.target.requires/sysusr-usr.mount" "../sysusr-usr.mount" +grep -qE "^What=/sysusr/usr$" "$OUT_DIR/normal/sysroot-usr.mount" +grep -qE "^Where=/sysroot/usr$" "$OUT_DIR/normal/sysroot-usr.mount" +grep -qE "^Options=bind$" "$OUT_DIR/normal/sysroot-usr.mount" +link_eq "$OUT_DIR/normal/initrd-fs.target.requires/sysroot-usr.mount" "../sysroot-usr.mount" diff --git a/test/units/testsuite-81.getty-generator.sh b/test/units/testsuite-81.getty-generator.sh index a53aa4cee1..103e966191 100755 --- a/test/units/testsuite-81.getty-generator.sh +++ b/test/units/testsuite-81.getty-generator.sh @@ -27,10 +27,10 @@ if in_container; then PID1_ENVIRON="container_ttys=tty0 pts/0 /dev/tty0" run_and_list "$GENERATOR_BIN" "$OUT_DIR" # console-getty.service is always pulled in in containers - link_endswith "$OUT_DIR/getty.target.wants/console-getty.service" "/lib/systemd/system/console-getty.service" - link_endswith "$OUT_DIR/getty.target.wants/container-getty@0.service" "/lib/systemd/system/container-getty@.service" - test ! -e "$OUT_DIR/getty.target.wants/container-getty@tty0.service" - test ! -h "$OUT_DIR/getty.target.wants/container-getty@tty0.service" + link_endswith "$OUT_DIR/normal/getty.target.wants/console-getty.service" "/lib/systemd/system/console-getty.service" + link_endswith "$OUT_DIR/normal/getty.target.wants/container-getty@0.service" "/lib/systemd/system/container-getty@.service" + test ! -e "$OUT_DIR/normal/getty.target.wants/container-getty@tty0.service" + test ! -h "$OUT_DIR/normal/getty.target.wants/container-getty@tty0.service" exit 0 fi @@ -68,12 +68,12 @@ mount -v --bind /tmp/dummy-active-consoles /sys/class/tty/console/active PID1_ENVIRON="SYSTEMD_GETTY_AUTO=foo" run_and_list "$GENERATOR_BIN" "$OUT_DIR" for console in "${DUMMY_ACTIVE_CONSOLES[@]}"; do unit="$(systemd-escape --template serial-getty@.service "$console")" - link_endswith "$OUT_DIR/getty.target.wants/$unit" /lib/systemd/system/serial-getty@.service + link_endswith "$OUT_DIR/normal/getty.target.wants/$unit" "/lib/systemd/system/serial-getty@.service" done for console in "${DUMMY_INACTIVE_CONSOLES[@]}" /dev/notatty99; do unit="$(systemd-escape --template serial-getty@.service "$console")" - test ! -e "$OUT_DIR/getty.target.wants/$unit" - test ! -h "$OUT_DIR/getty.target.wants/$unit" + test ! -e "$OUT_DIR/normal/getty.target.wants/$unit" + test ! -h "$OUT_DIR/normal/getty.target.wants/$unit" done : "getty-generator: systemd.getty_auto=0 on kernel cmdline" From 657ea51341b406b9327b8b7a0a80cd3b3fbbf491 Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Fri, 14 Apr 2023 16:09:32 +0200 Subject: [PATCH 7/8] test: add a couple of tests for system-update-generator --- .../testsuite-81.system-update-generator.sh | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100755 test/units/testsuite-81.system-update-generator.sh diff --git a/test/units/testsuite-81.system-update-generator.sh b/test/units/testsuite-81.system-update-generator.sh new file mode 100755 index 0000000000..6dfee0d898 --- /dev/null +++ b/test/units/testsuite-81.system-update-generator.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later +# shellcheck disable=SC2235 +set -eux +set -o pipefail + +# shellcheck source=test/units/generator-utils.sh +. "$(dirname "$0")/generator-utils.sh" + +GENERATOR_BIN="/usr/lib/systemd/system-generators/systemd-system-update-generator" +OUT_DIR="$(mktemp -d /tmp/system-update-generator-generator.XXX)" + +at_exit() { + rm -frv "${OUT_DIR:?}" /system-update +} + +trap at_exit EXIT + +test -x "${GENERATOR_BIN:?}" + +rm -f /system-update + +: "system-update-generator: no /system-update flag" +run_and_list "$GENERATOR_BIN" "$OUT_DIR" +[[ "$(find "$OUT_DIR" ! -type d | wc -l)" -eq 0 ]] + +: "system-update-generator: with /system-update flag" +touch /system-update +run_and_list "$GENERATOR_BIN" "$OUT_DIR" +link_endswith "$OUT_DIR/early/default.target" "/lib/systemd/system/system-update.target" + +: "system-update-generator: kernel cmdline warnings" +# We should warn if the default target is overriden on the kernel cmdline +# by a runlevel or systemd.unit=, but still generate the symlink +SYSTEMD_PROC_CMDLINE="systemd.unit=foo.bar 3" run_and_list "$GENERATOR_BIN" "$OUT_DIR" |& tee /tmp/system-update-generator.log +link_endswith "$OUT_DIR/early/default.target" "/lib/systemd/system/system-update.target" +grep -qE "Offline system update overridden .* systemd.unit=" /tmp/system-update-generator.log +grep -qE "Offline system update overridden .* runlevel" /tmp/system-update-generator.log From bbbf16b3d78c3531a3cdf6c92c36bf39b46f76eb Mon Sep 17 00:00:00 2001 From: Frantisek Sumsal Date: Fri, 14 Apr 2023 17:05:55 +0200 Subject: [PATCH 8/8] test: add a couple of tests for run-generator --- test/units/testsuite-81.run-generator.sh | 76 ++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100755 test/units/testsuite-81.run-generator.sh diff --git a/test/units/testsuite-81.run-generator.sh b/test/units/testsuite-81.run-generator.sh new file mode 100755 index 0000000000..9bd74efbaf --- /dev/null +++ b/test/units/testsuite-81.run-generator.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-2.1-or-later +# shellcheck disable=SC2235 +set -eux +set -o pipefail + +# shellcheck source=test/units/generator-utils.sh +. "$(dirname "$0")/generator-utils.sh" + +GENERATOR_BIN="/usr/lib/systemd/system-generators/systemd-run-generator" +OUT_DIR="$(mktemp -d /tmp/run-generator.XXX)" + +at_exit() { + rm -frv "${OUT_DIR:?}" +} + +trap at_exit EXIT + +test -x "${GENERATOR_BIN:?}" + +check_kernel_cmdline_target() { + local out_dir="${1:?}/normal" + + cat "$out_dir/kernel-command-line.target" + grep -qE "^Requires=kernel-command-line.service$" "$out_dir/kernel-command-line.target" + grep -qE "^After=kernel-command-line.service$" "$out_dir/kernel-command-line.target" + + link_eq "$out_dir/default.target" "kernel-command-line.target" +} + +: "run-generator: empty cmdline" +SYSTEMD_PROC_CMDLINE="" run_and_list "$GENERATOR_BIN" "$OUT_DIR" +[[ "$(find "$OUT_DIR" ! -type d | wc -l)" -eq 0 ]] + +: "run-generator: single command" +CMDLINE="systemd.run='echo hello world'" +SYSTEMD_PROC_CMDLINE="$CMDLINE" run_and_list "$GENERATOR_BIN" "$OUT_DIR" +check_kernel_cmdline_target "$OUT_DIR" +UNIT="$OUT_DIR/normal/kernel-command-line.service" +cat "$UNIT" +systemd-analyze verify --man=no --recursive-errors=no "$UNIT" +grep -qE "^SuccessAction=exit$" "$UNIT" +grep -qE "^FailureAction=exit$" "$UNIT" +grep -qE "^ExecStart=echo hello world$" "$UNIT" + +: "run-generator: multiple commands + success/failure actions" +ARGS=( + # These should be ignored + "systemd.run" + "systemd.run_success_action" + "systemd.run_failure_action" + + # Set actions which we will overwrite later + "systemd.run_success_action=" + "systemd.run_failure_action=" + + "systemd.run=/bin/false" + "systemd.run=" + "systemd.run=/bin/true" + "systemd.run='echo this is a long string'" + + "systemd.run_success_action=reboot" + "systemd.run_failure_action=poweroff-force" +) +CMDLINE="${ARGS[*]}" +SYSTEMD_PROC_CMDLINE="$CMDLINE" run_and_list "$GENERATOR_BIN" "$OUT_DIR" +check_kernel_cmdline_target "$OUT_DIR" +UNIT="$OUT_DIR/normal/kernel-command-line.service" +cat "$UNIT" +systemd-analyze verify --man=no --recursive-errors=no "$UNIT" +grep -qE "^SuccessAction=reboot$" "$UNIT" +grep -qE "^FailureAction=poweroff-force$" "$UNIT" +grep -qE "^ExecStart=/bin/false$" "$UNIT" +grep -qE "^ExecStart=$" "$UNIT" +grep -qE "^ExecStart=/bin/true$" "$UNIT" +grep -qE "^ExecStart=echo this is a long string$" "$UNIT"