xref: /freebsd/usr.sbin/etcupdate/tests/preworld_test.sh (revision d0b2dbfa0ecf2bbc9709efc5e20baf8e4b44bbbf)
1d14afb2aSJulio Merino#!/bin/sh
2d14afb2aSJulio Merino#
3179fa75eSJohn Baldwin# Copyright (c) 2013 Hudson River Trading LLC
4d14afb2aSJulio Merino# Written by: John H. Baldwin <jhb@FreeBSD.org>
5d14afb2aSJulio Merino# All rights reserved.
6d14afb2aSJulio Merino#
7d14afb2aSJulio Merino# Redistribution and use in source and binary forms, with or without
8d14afb2aSJulio Merino# modification, are permitted provided that the following conditions
9d14afb2aSJulio Merino# are met:
10d14afb2aSJulio Merino# 1. Redistributions of source code must retain the above copyright
11d14afb2aSJulio Merino#    notice, this list of conditions and the following disclaimer.
12d14afb2aSJulio Merino# 2. Redistributions in binary form must reproduce the above copyright
13d14afb2aSJulio Merino#    notice, this list of conditions and the following disclaimer in the
14d14afb2aSJulio Merino#    documentation and/or other materials provided with the distribution.
15d14afb2aSJulio Merino#
16d14afb2aSJulio Merino# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17d14afb2aSJulio Merino# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18d14afb2aSJulio Merino# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19d14afb2aSJulio Merino# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20d14afb2aSJulio Merino# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21d14afb2aSJulio Merino# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22d14afb2aSJulio Merino# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23d14afb2aSJulio Merino# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24d14afb2aSJulio Merino# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25d14afb2aSJulio Merino# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26d14afb2aSJulio Merino# SUCH DAMAGE.
27d14afb2aSJulio Merino#
28d14afb2aSJulio Merino
29d14afb2aSJulio Merino# Regression tests for the pre-world (-p) mode
30d14afb2aSJulio Merino
31d14afb2aSJulio MerinoFAILED=no
32d14afb2aSJulio MerinoWORKDIR=work
33d14afb2aSJulio Merino
34d14afb2aSJulio Merinousage()
35d14afb2aSJulio Merino{
36d14afb2aSJulio Merino	echo "Usage: preworld.sh [-s script] [-w workdir]"
37d14afb2aSJulio Merino	exit 1
38d14afb2aSJulio Merino}
39d14afb2aSJulio Merino
40d14afb2aSJulio Merino# Allow the user to specify an alternate work directory or script.
41d14afb2aSJulio MerinoCOMMAND=etcupdate
42d14afb2aSJulio Merinowhile getopts "s:w:" option; do
43d14afb2aSJulio Merino	case $option in
44d14afb2aSJulio Merino		s)
45d14afb2aSJulio Merino			COMMAND="sh $OPTARG"
46d14afb2aSJulio Merino			;;
47d14afb2aSJulio Merino		w)
48d14afb2aSJulio Merino			WORKDIR=$OPTARG
49d14afb2aSJulio Merino			;;
50d14afb2aSJulio Merino		*)
51d14afb2aSJulio Merino			echo
52d14afb2aSJulio Merino			usage
53d14afb2aSJulio Merino			;;
54d14afb2aSJulio Merino	esac
55d14afb2aSJulio Merinodone
56d14afb2aSJulio Merinoshift $((OPTIND - 1))
57d14afb2aSJulio Merinoif [ $# -ne 0 ]; then
58d14afb2aSJulio Merino	usage
59d14afb2aSJulio Merinofi
60d14afb2aSJulio Merino
61d14afb2aSJulio MerinoCONFLICTS=$WORKDIR/conflicts
62d14afb2aSJulio MerinoSRC=$WORKDIR/src
63d14afb2aSJulio MerinoOLD=$WORKDIR/current
64d14afb2aSJulio MerinoTEST=$WORKDIR/test
65d14afb2aSJulio Merino
66d14afb2aSJulio Merinobuild_trees()
67d14afb2aSJulio Merino{
68d14afb2aSJulio Merino
69d14afb2aSJulio Merino	# Populate trees with pre-world files and additional files
70d14afb2aSJulio Merino	# that should not be touched.
71d14afb2aSJulio Merino
72d14afb2aSJulio Merino	rm -rf $SRC $OLD $TEST $CONFLICTS
73d14afb2aSJulio Merino
74d14afb2aSJulio Merino	# Create the "old" source tree as the starting point
75d14afb2aSJulio Merino	mkdir -p $OLD/etc
76d14afb2aSJulio Merino	cat >> $OLD/etc/master.passwd <<EOF
77d14afb2aSJulio Merino#
78d14afb2aSJulio Merinoroot::0:0::0:0:Charlie &:/root:/bin/csh
79d14afb2aSJulio Merinotoor:*:0:0::0:0:Bourne-again Superuser:/root:
80d14afb2aSJulio Merinodaemon:*:1:1::0:0:Owner of many system processes:/root:/usr/sbin/nologin
81d14afb2aSJulio Merinooperator:*:2:5::0:0:System &:/:/usr/sbin/nologin
82d14afb2aSJulio Merino_dhcp:*:65:65::0:0:dhcp programs:/var/empty:/usr/sbin/nologin
83d14afb2aSJulio Merinouucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/local/libexec/uucp/uucico
84d14afb2aSJulio Merinopop:*:68:6::0:0:Post Office Owner:/nonexistent:/usr/sbin/nologin
85d14afb2aSJulio Merinowww:*:80:80::0:0:World Wide Web Owner:/nonexistent:/usr/sbin/nologin
86d14afb2aSJulio Merinohast:*:845:845::0:0:HAST unprivileged user:/var/empty:/usr/sbin/nologin
87d14afb2aSJulio Merinonobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/usr/sbin/nologin
88d14afb2aSJulio MerinoEOF
89d14afb2aSJulio Merino	cat >> $OLD/etc/group <<EOF
90d14afb2aSJulio Merino#
91d14afb2aSJulio Merinowheel:*:0:root
92d14afb2aSJulio Merinodaemon:*:1:
93d14afb2aSJulio Merinokmem:*:2:
94d14afb2aSJulio Merinosys:*:3:
95d14afb2aSJulio Merinotty:*:4:
96d14afb2aSJulio Merinooperator:*:5:root
97d14afb2aSJulio Merino_dhcp:*:65:
98d14afb2aSJulio Merinouucp:*:66:
99d14afb2aSJulio Merinodialer:*:68:
100d14afb2aSJulio Merinonetwork:*:69:
101d14afb2aSJulio Merinowww:*:80:
102d14afb2aSJulio Merinohast:*:845:
103d14afb2aSJulio Merinonogroup:*:65533:
104d14afb2aSJulio Merinonobody:*:65534:
105d14afb2aSJulio MerinoEOF
106d14afb2aSJulio Merino	cat >> $OLD/etc/inetd.conf <<EOF
107d14afb2aSJulio Merino# Yet another file
108d14afb2aSJulio MerinoEOF
109d14afb2aSJulio Merino
110d14afb2aSJulio Merino	# Copy the "old" source tree to the test tree and make local
111d14afb2aSJulio Merino	# modifications.
112d14afb2aSJulio Merino	cp -R $OLD $TEST
113d14afb2aSJulio Merino	sed -I "" -e 's/root::/root:<rpass>:/' $TEST/etc/master.passwd
114d14afb2aSJulio Merino	cat >> $TEST/etc/master.passwd <<EOF
115d14afb2aSJulio Merinojohn:<password>:1001:1001::0:0:John Baldwin:/home/john:/bin/tcsh
116d14afb2aSJulio Merinomessagebus:*:556:556::0:0:D-BUS Daemon User:/nonexistent:/usr/sbin/nologin
117d14afb2aSJulio Merinopolkit:*:562:562::0:0:PolicyKit User:/nonexistent:/usr/sbin/nologin
118d14afb2aSJulio Merinohaldaemon:*:560:560::0:0:HAL Daemon User:/nonexistent:/usr/sbin/nologin
119d14afb2aSJulio MerinoEOF
120d14afb2aSJulio Merino	awk '/wheel/ { printf "%s,john\n", $0; next } // { print }' \
121d14afb2aSJulio Merino	    $OLD/etc/group > $TEST/etc/group
122d14afb2aSJulio Merino	cat >> $TEST/etc/group <<EOF
123d14afb2aSJulio Merinojohn:*:1001:
124d14afb2aSJulio Merinomessagebus:*:556:
125d14afb2aSJulio Merinopolkit:*:562:
126d14afb2aSJulio Merinohaldaemon:*:560:
127d14afb2aSJulio MerinoEOF
128d14afb2aSJulio Merino	rm $TEST/etc/inetd.conf
129d14afb2aSJulio Merino	touch $TEST/etc/localtime
130d14afb2aSJulio Merino
131d14afb2aSJulio Merino	# Copy the "old" source tree to the new source tree and
132d14afb2aSJulio Merino	# make upstream modifications.
133d14afb2aSJulio Merino	cp -R $OLD $SRC
134d14afb2aSJulio Merino	sed -I "" -e '/:80:/i\
135d14afb2aSJulio Merinoauditdistd:*:78:77::0:0:Auditdistd unprivileged user:/var/empty:/usr/sbin/nologin' \
136d14afb2aSJulio Merino	    $SRC/etc/master.passwd
137d14afb2aSJulio Merino	sed -I "" -e '/:80:/i\
138d14afb2aSJulio Merinoaudit:*:77:' \
139d14afb2aSJulio Merino	    $SRC/etc/group
140d14afb2aSJulio Merino	cat >> $SRC/etc/inetd.conf <<EOF
141d14afb2aSJulio Merino# Making this larger
142d14afb2aSJulio MerinoEOF
143d14afb2aSJulio Merino}
144d14afb2aSJulio Merino
145d14afb2aSJulio Merino# $1 - relative path to file that should be missing from TEST
146d14afb2aSJulio Merinomissing()
147d14afb2aSJulio Merino{
148d14afb2aSJulio Merino	if [ -e $TEST/$1 -o -L $TEST/$1 ]; then
149d14afb2aSJulio Merino		echo "File $1 should be missing"
150d14afb2aSJulio Merino		FAILED=yes
151d14afb2aSJulio Merino	fi
152d14afb2aSJulio Merino}
153d14afb2aSJulio Merino
154d14afb2aSJulio Merino# $1 - relative path to file that should be present in TEST
155d14afb2aSJulio Merinopresent()
156d14afb2aSJulio Merino{
157d14afb2aSJulio Merino	if ! [ -e $TEST/$1 -o -L $TEST/$1 ]; then
158d14afb2aSJulio Merino		echo "File $1 should be present"
159d14afb2aSJulio Merino		FAILED=yes
160d14afb2aSJulio Merino	fi
161d14afb2aSJulio Merino}
162d14afb2aSJulio Merino
163d14afb2aSJulio Merino# $1 - relative path to regular file that should be present in TEST
164d14afb2aSJulio Merino# $2 - optional string that should match file contents
165d14afb2aSJulio Merino# $3 - optional MD5 of the flie contents, overrides $2 if present
166d14afb2aSJulio Merinofile()
167d14afb2aSJulio Merino{
168d14afb2aSJulio Merino	local contents sum
169d14afb2aSJulio Merino
170d14afb2aSJulio Merino	if ! [ -f $TEST/$1 ]; then
171d14afb2aSJulio Merino		echo "File $1 should be a regular file"
172d14afb2aSJulio Merino		FAILED=yes
173d14afb2aSJulio Merino	elif [ $# -eq 2 ]; then
174d14afb2aSJulio Merino		contents=`cat $TEST/$1`
175d14afb2aSJulio Merino		if [ "$contents" != "$2" ]; then
176d14afb2aSJulio Merino			echo "File $1 has wrong contents"
177d14afb2aSJulio Merino			FAILED=yes
178d14afb2aSJulio Merino		fi
179d14afb2aSJulio Merino	elif [ $# -eq 3 ]; then
180d14afb2aSJulio Merino		sum=`md5 -q $TEST/$1`
181d14afb2aSJulio Merino		if [ "$sum" != "$3" ]; then
182d14afb2aSJulio Merino			echo "File $1 has wrong contents"
183d14afb2aSJulio Merino			FAILED=yes
184d14afb2aSJulio Merino		fi
185d14afb2aSJulio Merino	fi
186d14afb2aSJulio Merino}
187d14afb2aSJulio Merino
188d14afb2aSJulio Merino# $1 - relative path to a regular file that should have a conflict
189d14afb2aSJulio Merino# $2 - optional MD5 of the conflict file contents
190d14afb2aSJulio Merinoconflict()
191d14afb2aSJulio Merino{
192d14afb2aSJulio Merino	local sum
193d14afb2aSJulio Merino
194d14afb2aSJulio Merino	if ! [ -f $CONFLICTS/$1 ]; then
195d14afb2aSJulio Merino		echo "File $1 missing conflict"
196d14afb2aSJulio Merino		FAILED=yes
197d14afb2aSJulio Merino	elif [ $# -gt 1 ]; then
198d14afb2aSJulio Merino		sum=`md5 -q $CONFLICTS/$1`
199d14afb2aSJulio Merino		if [ "$sum" != "$2" ]; then
200d14afb2aSJulio Merino			echo "Conflict $1 has wrong contents"
201d14afb2aSJulio Merino			FAILED=yes
202d14afb2aSJulio Merino		fi
203d14afb2aSJulio Merino	fi
204d14afb2aSJulio Merino}
205d14afb2aSJulio Merino
206d14afb2aSJulio Merinocheck_trees()
207d14afb2aSJulio Merino{
208d14afb2aSJulio Merino
209d14afb2aSJulio Merino	echo "Checking tree for correct results:"
210d14afb2aSJulio Merino
211d14afb2aSJulio Merino	file /etc/master.passwd "" 1385366e8b424d33d59b7d8a2bdb15d3
212d14afb2aSJulio Merino	file /etc/group "" 21273f845f6ec0cda9188c4ddac9ed47
213d14afb2aSJulio Merino	missing /etc/inetd.conf
214d14afb2aSJulio Merino
215d14afb2aSJulio Merino	# These should be auto-generated by pwd_mkdb
216*4bbf45cfSXin LI	file /etc/passwd "" e4650d2727044b22d513e6a02d86bcfa
217d14afb2aSJulio Merino	file /etc/pwd.db
218d14afb2aSJulio Merino	file /etc/spwd.db
219d14afb2aSJulio Merino}
220d14afb2aSJulio Merino
221d14afb2aSJulio Merinoif [ `id -u` -ne 0 ]; then
222d14afb2aSJulio Merino	echo "must be root"
223d14afb2aSJulio Merino	exit 0
224d14afb2aSJulio Merinofi
225d14afb2aSJulio Merino
226d14afb2aSJulio Merinoif [ -r /etc/etcupdate.conf ]; then
227d14afb2aSJulio Merino	echo "WARNING: /etc/etcupdate.conf settings may break some tests."
228d14afb2aSJulio Merinofi
229d14afb2aSJulio Merino
230d14afb2aSJulio Merinobuild_trees
231d14afb2aSJulio Merino
232d14afb2aSJulio Merino$COMMAND -np -s $SRC -d $WORKDIR -D $TEST > $WORKDIR/testn.out
233d14afb2aSJulio Merino
234d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF
235d14afb2aSJulio Merino  M /etc/group
236d14afb2aSJulio Merino  M /etc/master.passwd
237d14afb2aSJulio MerinoEOF
238d14afb2aSJulio Merino
239d14afb2aSJulio Merinoecho "Differences for -n:"
240d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/testn.out \
241d14afb2aSJulio Merino    || FAILED=yes
242d14afb2aSJulio Merino
243d14afb2aSJulio Merino$COMMAND -p -s $SRC -d $WORKDIR -D $TEST > $WORKDIR/test.out
244d14afb2aSJulio Merino
245d14afb2aSJulio Merinoecho "Differences for real:"
246d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \
247d14afb2aSJulio Merino    || FAILED=yes
248d14afb2aSJulio Merino
249d14afb2aSJulio Merinocheck_trees
250d14afb2aSJulio Merino
251d14afb2aSJulio Merino[ "${FAILED}" = no ]
252