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