]> git.ipfire.org Git - thirdparty/systemd.git/blame - test/test-sysusers.sh.in
Merge pull request #32588 from CodethinkLabs/mkosi-selinux
[thirdparty/systemd.git] / test / test-sysusers.sh.in
CommitLineData
bd7e6aa7 1#!/usr/bin/env bash
8f5bcd61 2# SPDX-License-Identifier: LGPL-2.1-or-later
bd7e6aa7
ZJS
3set -e
4
5SYSUSERS="${1:-systemd-sysusers}"
6
d79881c5
LB
7# shellcheck disable=SC1090
8[ -e "$(dirname "$0")/../systemd-runtest.env" ] && . "$(dirname "$0")/../systemd-runtest.env"
bd7e6aa7
ZJS
9SYSTEMD_TEST_DATA=${SYSTEMD_TEST_DATA:-@SYSTEMD_TEST_DATA@}
10SOURCE=$SYSTEMD_TEST_DATA/test-sysusers
11
12TESTDIR=$(mktemp --tmpdir --directory "test-sysusers.XXXXXXXXXX")
d79881c5 13# shellcheck disable=SC2064
bd7e6aa7
ZJS
14trap "rm -rf '$TESTDIR'" EXIT INT QUIT PIPE
15
16prepare_testdir() {
d79881c5
LB
17 mkdir -p "$TESTDIR/etc/sysusers.d/"
18 mkdir -p "$TESTDIR/usr/lib/sysusers.d/"
19 rm -f "$TESTDIR"/etc/*{passwd,group,shadow}
bd7e6aa7 20 for i in $1.initial-{passwd,group,shadow}; do
d79881c5 21 test -f "$i" && cp "$i" "$TESTDIR/etc/${i#*.initial-}"
bd7e6aa7
ZJS
22 done
23 return 0
24}
25
d79881c5 26# shellcheck disable=SC2050
aa25270c
ZJS
27[ @SYSTEM_UID_MAX@ -lt @SYSTEM_GID_MAX@ ] && system_guid_max=@SYSTEM_UID_MAX@ || system_guid_max=@SYSTEM_GID_MAX@
28
bd7e6aa7 29preprocess() {
aa25270c
ZJS
30 m=${2:-$system_guid_max}
31
d79881c5 32 # shellcheck disable=SC2140
aa25270c
ZJS
33 sed -e "s/SYSTEM_UGID_MAX/$m/g;
34 s#NOLOGIN#@NOLOGIN@#g" "$1"
bd7e6aa7
ZJS
35}
36
37compare() {
d79881c5 38 if ! diff -u "$TESTDIR/etc/passwd" <(preprocess "$1.expected-passwd" "$3"); then
78643f26 39 echo >&2 "**** Unexpected output for $f $2"
bd7e6aa7
ZJS
40 exit 1
41 fi
42
d79881c5 43 if ! diff -u "$TESTDIR/etc/group" <(preprocess "$1.expected-group" "$3"); then
78643f26 44 echo >&2 "**** Unexpected output for $f $2"
bd7e6aa7
ZJS
45 exit 1
46 fi
47}
48
d79881c5 49rm -f "$TESTDIR"/etc/sysusers.d/* "$TESTDIR"/usr/lib/sysusers.d/*
bd7e6aa7
ZJS
50
51# happy tests
d79881c5 52for f in $(find "$SOURCE"/test-*.input | sort -V); do
bd7e6aa7 53 echo "*** Running $f"
d79881c5
LB
54 prepare_testdir "${f%.input}"
55 cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
56 $SYSUSERS --root="$TESTDIR"
bd7e6aa7 57
d79881c5 58 compare "${f%.*}" ""
bd7e6aa7
ZJS
59done
60
d79881c5 61for f in $(find "$SOURCE"/test-*.input | sort -V); do
bd7e6aa7 62 echo "*** Running $f on stdin"
d79881c5
LB
63 prepare_testdir "${f%.input}"
64 touch "$TESTDIR/etc/sysusers.d/test.conf"
65 $SYSUSERS --root="$TESTDIR" - <"$f"
bd7e6aa7 66
d79881c5 67 compare "${f%.*}" "on stdin"
bd7e6aa7
ZJS
68done
69
d79881c5 70for f in $(find "$SOURCE"/test-*.input | sort -V); do
bd7e6aa7 71 echo "*** Running $f on stdin with --replace"
d79881c5
LB
72 prepare_testdir "${f%.input}"
73 touch "$TESTDIR/etc/sysusers.d/test.conf"
bd7e6aa7 74 # this overrides test.conf which is masked on disk
d79881c5 75 $SYSUSERS --root="$TESTDIR" --replace=/etc/sysusers.d/test.conf - <"$f"
bd7e6aa7 76 # this should be ignored
d79881c5 77 $SYSUSERS --root="$TESTDIR" --replace=/usr/lib/sysusers.d/test.conf - <"$SOURCE/test-1.input"
bd7e6aa7 78
d79881c5 79 compare "${f%.*}" "on stdin with --replace"
bd7e6aa7
ZJS
80done
81
82# test --inline
83echo "*** Testing --inline"
d79881c5 84prepare_testdir "$SOURCE/inline"
bd7e6aa7 85# copy a random file to make sure it is ignored
d79881c5
LB
86cp "$f" "$TESTDIR/etc/sysusers.d/confuse.conf"
87$SYSUSERS --root="$TESTDIR" --inline \
bd7e6aa7
ZJS
88 "u u1 222 - - /bin/zsh" \
89 "g g1 111"
90
d79881c5 91compare "$SOURCE/inline" "(--inline)"
bd7e6aa7
ZJS
92
93# test --replace
94echo "*** Testing --inline with --replace"
d79881c5 95prepare_testdir "$SOURCE/inline"
bd7e6aa7 96# copy a random file to make sure it is ignored
d79881c5
LB
97cp "$f" "$TESTDIR/etc/sysusers.d/confuse.conf"
98$SYSUSERS --root="$TESTDIR" \
bd7e6aa7
ZJS
99 --inline \
100 --replace=/etc/sysusers.d/confuse.conf \
101 "u u1 222 - - /bin/zsh" \
102 "g g1 111"
103
d79881c5 104compare "$SOURCE/inline" "(--inline --replace=…)"
bd7e6aa7 105
3e74e6a1 106echo "*** Testing --inline with no /etc"
d79881c5
LB
107rm -rf "${TESTDIR:?}/etc"
108$SYSUSERS --root="$TESTDIR" --inline \
3e74e6a1
ZJS
109 "u u1 222 - - /bin/zsh" \
110 "g g1 111"
111
d79881c5 112compare "$SOURCE/inline" "(--inline)"
3e74e6a1 113
d79881c5 114rm -f "$TESTDIR"/etc/sysusers.d/* "$TESTDIR"/usr/lib/sysusers.d/*
bd7e6aa7 115
d79881c5 116cat >"$TESTDIR/etc/login.defs" <<EOF
aa25270c
ZJS
117SYS_UID_MIN abcd
118SYS_UID_MAX abcd
119SYS_GID_MIN abcd
120SYS_GID_MAX abcd
121SYS_UID_MIN 401
122SYS_UID_MAX 555
123SYS_GID_MIN 405
124SYS_GID_MAX 666
125SYS_UID_MIN abcd
126SYS_UID_MAX abcd
127SYS_GID_MIN abcd
128SYS_GID_MAX abcd
129SYS_UID_MIN999
130SYS_UID_MAX999
131SYS_GID_MIN999
132SYS_GID_MAX999
133EOF
134
d79881c5 135for f in $(find "$SOURCE"/test-*.input | sort -V); do
aa25270c 136 echo "*** Running $f (with login.defs)"
d79881c5
LB
137 prepare_testdir "${f%.input}"
138 cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
139 $SYSUSERS --root="$TESTDIR"
aa25270c 140
d79881c5 141 # shellcheck disable=SC2050
aa25270c 142 [ @ENABLE_COMPAT_MUTABLE_UID_BOUNDARIES@ = 1 ] && bound=555 || bound=$system_guid_max
6aea5ce8 143 compare "${f%.*}" "(with login.defs)" "$bound"
aa25270c
ZJS
144done
145
d79881c5 146rm -f "$TESTDIR"/etc/sysusers.d/* "$TESTDIR"/usr/lib/sysusers.d/*
aa25270c 147
d79881c5
LB
148mv "$TESTDIR/etc/login.defs" "$TESTDIR/etc/login.defs.moved"
149ln -s ../../../../../etc/login.defs.moved "$TESTDIR/etc/login.defs"
aa25270c 150
d79881c5 151for f in $(find "$SOURCE"/test-*.input | sort -V); do
aa25270c 152 echo "*** Running $f (with login.defs symlinked)"
d79881c5
LB
153 prepare_testdir "${f%.input}"
154 cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
155 $SYSUSERS --root="$TESTDIR"
aa25270c 156
d79881c5 157 # shellcheck disable=SC2050
aa25270c 158 [ @ENABLE_COMPAT_MUTABLE_UID_BOUNDARIES@ = 1 ] && bound=555 || bound=$system_guid_max
6aea5ce8 159 compare "${f%.*}" "(with login.defs symlinked)" "$bound"
aa25270c
ZJS
160done
161
d79881c5 162rm -f "$TESTDIR"/etc/sysusers.d/* "$TESTDIR"/usr/lib/sysusers.d/*
aa25270c 163
bd7e6aa7 164# tests for error conditions
d79881c5 165for f in $(find "$SOURCE"/unhappy-*.input | sort -V); do
bd7e6aa7 166 echo "*** Running test $f"
d79881c5
LB
167 prepare_testdir "${f%.input}"
168 cp "$f" "$TESTDIR/usr/lib/sysusers.d/test.conf"
88d4b97a 169 SYSTEMD_LOG_LEVEL=info $SYSUSERS --root="$TESTDIR" 2>&1 | tail -n1 | sed -r 's/^[^:]+:[^:]+://' >"$TESTDIR/err"
d79881c5 170 if ! diff -u "$TESTDIR/err" "${f%.*}.expected-err"; then
78643f26
YW
171 echo >&2 "**** Unexpected error output for $f"
172 cat >&2 "$TESTDIR/err"
bd7e6aa7
ZJS
173 exit 1
174 fi
175done