mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 16:37:19 +09:00
Merge pull request #27273 from mrc0mmand/test-generators
test: add a couple of tests for getty/run/system-update generators
This commit is contained in:
@@ -195,6 +195,7 @@ BASICTOOLS=(
|
||||
losetup
|
||||
lz4cat
|
||||
mkfifo
|
||||
mknod
|
||||
mktemp
|
||||
modprobe
|
||||
mount
|
||||
|
||||
@@ -54,8 +54,27 @@ 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:?}"/*
|
||||
"$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
|
||||
umount /proc/1/environ
|
||||
rm -f "$environ"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)"
|
||||
@@ -65,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[@]}"
|
||||
)
|
||||
|
||||
@@ -101,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"
|
||||
|
||||
@@ -251,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
|
||||
@@ -285,9 +289,6 @@ check_fstab_mount_units() {
|
||||
done
|
||||
}
|
||||
|
||||
# TODO
|
||||
# - kernel arguments
|
||||
|
||||
: "fstab-generator: regular"
|
||||
printf "%s\n" "${FSTAB_GENERAL_ROOT[@]}" >"$FSTAB"
|
||||
cat "$FSTAB"
|
||||
@@ -320,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
|
||||
@@ -358,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/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/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"
|
||||
|
||||
89
test/units/testsuite-81.getty-generator.sh
Executable file
89
test/units/testsuite-81.getty-generator.sh
Executable file
@@ -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/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
|
||||
|
||||
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/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/normal/getty.target.wants/$unit"
|
||||
test ! -h "$OUT_DIR/normal/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
|
||||
76
test/units/testsuite-81.run-generator.sh
Executable file
76
test/units/testsuite-81.run-generator.sh
Executable file
@@ -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"
|
||||
@@ -5,8 +5,6 @@ set -o pipefail
|
||||
|
||||
: >/failed
|
||||
|
||||
systemctl log-level debug
|
||||
|
||||
for script in "${0%.sh}".*.sh; do
|
||||
echo "Running $script"
|
||||
"./$script"
|
||||
|
||||
38
test/units/testsuite-81.system-update-generator.sh
Executable file
38
test/units/testsuite-81.system-update-generator.sh
Executable file
@@ -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
|
||||
Reference in New Issue
Block a user