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