#!/usr/bin/env bash # SPDX-License-Identifier: LGPL-2.1-or-later set -e SYSUSERS="${1:-systemd-sysusers}" # shellcheck disable=SC1090 [ -e "$(dirname "$0")/../systemd-runtest.env" ] && . "$(dirname "$0")/../systemd-runtest.env" SYSTEMD_TEST_DATA=${SYSTEMD_TEST_DATA:-@SYSTEMD_TEST_DATA@} SOURCE=$SYSTEMD_TEST_DATA/test-sysusers TESTDIR=$(mktemp --tmpdir --directory "test-sysusers.XXXXXXXXXX") # shellcheck disable=SC2064 trap "rm -rf '$TESTDIR'" EXIT INT QUIT PIPE prepare_testdir() { mkdir -p "$TESTDIR/etc/sysusers.d/" mkdir -p "$TESTDIR/usr/lib/sysusers.d/" rm -f "$TESTDIR"/etc/*{passwd,group,shadow} for i in $1.initial-{passwd,group,shadow}; do test -f "$i" && cp "$i" "$TESTDIR/etc/${i#*.initial-}" done return 0 } # shellcheck disable=SC2050 [ @SYSTEM_UID_MAX@ -lt @SYSTEM_GID_MAX@ ] && system_guid_max=@SYSTEM_UID_MAX@ || system_guid_max=@SYSTEM_GID_MAX@ preprocess() { m=${2:-$system_guid_max} # shellcheck disable=SC2140 sed -e "s/SYSTEM_UGID_MAX/$m/g; s#NOLOGIN#@NOLOGIN@#g" "$1" } compare() { if ! diff -u "$TESTDIR/etc/passwd" <(preprocess "$1.expected-passwd" "$3"); then echo >&2 "**** Unexpected output for $f $2" exit 1 fi if ! diff -u "$TESTDIR/etc/group" <(preprocess "$1.expected-group" "$3"); then echo >&2 "**** Unexpected output for $f $2" exit 1 fi } rm -f "$TESTDIR"/etc/sysusers.d/* "$TESTDIR"/usr/lib/sysusers.d/* # happy tests for f in $(find "$SOURCE"/test-*.input | sort -V); do echo "*** Running $f" prepare_testdir "${f%.input}" cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf" "$SYSUSERS" --root="$TESTDIR" compare "${f%.*}" "" done for f in $(find "$SOURCE"/test-*.input | sort -V); do echo "*** Running $f on stdin" prepare_testdir "${f%.input}" touch "$TESTDIR/etc/sysusers.d/test.conf" "$SYSUSERS" --root="$TESTDIR" - <"$f" compare "${f%.*}" "on stdin" done for f in $(find "$SOURCE"/test-*.input | sort -V); do echo "*** Running $f on stdin with --replace" prepare_testdir "${f%.input}" touch "$TESTDIR/etc/sysusers.d/test.conf" # this overrides test.conf which is masked on disk "$SYSUSERS" --root="$TESTDIR" --replace=/etc/sysusers.d/test.conf - <"$f" # this should be ignored "$SYSUSERS" --root="$TESTDIR" --replace=/usr/lib/sysusers.d/test.conf - <"$SOURCE/test-1.input" compare "${f%.*}" "on stdin with --replace" done # test --inline echo "*** Testing --inline" prepare_testdir "$SOURCE/inline" # copy a random file to make sure it is ignored cp "$f" "$TESTDIR/etc/sysusers.d/confuse.conf" "$SYSUSERS" --root="$TESTDIR" --inline \ "u u1 222 - - /bin/zsh" \ "g g1 111" compare "$SOURCE/inline" "(--inline)" # test --replace echo "*** Testing --inline with --replace" prepare_testdir "$SOURCE/inline" # copy a random file to make sure it is ignored cp "$f" "$TESTDIR/etc/sysusers.d/confuse.conf" "$SYSUSERS" --root="$TESTDIR" \ --inline \ --replace=/etc/sysusers.d/confuse.conf \ "u u1 222 - - /bin/zsh" \ "g g1 111" compare "$SOURCE/inline" "(--inline --replace=…)" echo "*** Testing --inline with no /etc" rm -rf "${TESTDIR:?}/etc" "$SYSUSERS" --root="$TESTDIR" --inline \ "u u1 222 - - /bin/zsh" \ "g g1 111" compare "$SOURCE/inline" "(--inline)" rm -f "$TESTDIR"/etc/sysusers.d/* "$TESTDIR"/usr/lib/sysusers.d/* cat >"$TESTDIR/etc/login.defs" <&1 | tail -n1 | sed -r 's/^[^:]+:[^:]+://' >"$TESTDIR/err" if ! diff -u "$TESTDIR/err" "${f%.*}.expected-err"; then echo >&2 "**** Unexpected error output for $f" cat >&2 "$TESTDIR/err" exit 1 fi done