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# Various regression tests for the tzsetup handling in the 'update' command. 30d14afb2aSJulio Merino 31d14afb2aSJulio MerinoFAILED=no 32d14afb2aSJulio MerinoWORKDIR=work 33d14afb2aSJulio Merino 34d14afb2aSJulio Merinousage() 35d14afb2aSJulio Merino{ 36d14afb2aSJulio Merino echo "Usage: tzsetup.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 MerinoOLD=$WORKDIR/old 63d14afb2aSJulio MerinoNEW=$WORKDIR/current 64d14afb2aSJulio MerinoTEST=$WORKDIR/test 65d14afb2aSJulio Merino 66d14afb2aSJulio Merinobuild_trees() 67d14afb2aSJulio Merino{ 68d14afb2aSJulio Merino 69d14afb2aSJulio Merino # Build the base tree, but not /etc/localtime itself 70d14afb2aSJulio Merino local i j k 71d14afb2aSJulio Merino 72d14afb2aSJulio Merino rm -rf $OLD $NEW $TEST $CONFLICTS 73d14afb2aSJulio Merino mkdir -p $OLD $NEW $TEST 74d14afb2aSJulio Merino mkdir -p $TEST/etc 75d14afb2aSJulio Merino mkdir -p $TEST/var/db 76d14afb2aSJulio Merino mkdir -p $TEST/usr/share/zoneinfo 77d14afb2aSJulio Merino 78d14afb2aSJulio Merino # Create a dummy timezone file 79d14afb2aSJulio Merino echo "foo" > $TEST/usr/share/zoneinfo/foo 80d14afb2aSJulio Merino 81d14afb2aSJulio Merino} 82d14afb2aSJulio Merino 83d14afb2aSJulio Merino# $1 - relative path to file that should be missing from TEST 84d14afb2aSJulio Merinomissing() 85d14afb2aSJulio Merino{ 86d14afb2aSJulio Merino if [ -e $TEST/$1 -o -L $TEST/$1 ]; then 87d14afb2aSJulio Merino echo "File $1 should be missing" 88d14afb2aSJulio Merino FAILED=yes 89d14afb2aSJulio Merino fi 90d14afb2aSJulio Merino} 91d14afb2aSJulio Merino 92d14afb2aSJulio Merino# $1 - relative path to file that should be a symlink in TEST 93d14afb2aSJulio Merino# $2 - optional value of the link 94d14afb2aSJulio Merinolink() 95d14afb2aSJulio Merino{ 96d14afb2aSJulio Merino local val 97d14afb2aSJulio Merino 98d14afb2aSJulio Merino if ! [ -L $TEST/$1 ]; then 99d14afb2aSJulio Merino echo "File $1 should be a link" 100d14afb2aSJulio Merino FAILED=yes 101d14afb2aSJulio Merino elif [ $# -gt 1 ]; then 102d14afb2aSJulio Merino val=`readlink $TEST/$1` 103d14afb2aSJulio Merino if [ "$val" != "$2" ]; then 104d14afb2aSJulio Merino echo "Link $1 should link to \"$2\"" 105d14afb2aSJulio Merino FAILED=yes 106d14afb2aSJulio Merino fi 107d14afb2aSJulio Merino fi 108d14afb2aSJulio Merino} 109d14afb2aSJulio Merino 110d14afb2aSJulio Merino# $1 - relative path to regular file that should be present in TEST 111d14afb2aSJulio Merino# $2 - optional string that should match file contents 112d14afb2aSJulio Merino# $3 - optional MD5 of the flie contents, overrides $2 if present 113d14afb2aSJulio Merinofile() 114d14afb2aSJulio Merino{ 115d14afb2aSJulio Merino local contents sum 116d14afb2aSJulio Merino 117d14afb2aSJulio Merino if ! [ -f $TEST/$1 ]; then 118d14afb2aSJulio Merino echo "File $1 should be a regular file" 119d14afb2aSJulio Merino FAILED=yes 120d14afb2aSJulio Merino elif [ $# -eq 2 ]; then 121d14afb2aSJulio Merino contents=`cat $TEST/$1` 122d14afb2aSJulio Merino if [ "$contents" != "$2" ]; then 123d14afb2aSJulio Merino echo "File $1 has wrong contents" 124d14afb2aSJulio Merino FAILED=yes 125d14afb2aSJulio Merino fi 126d14afb2aSJulio Merino elif [ $# -eq 3 ]; then 127d14afb2aSJulio Merino sum=`md5 -q $TEST/$1` 128d14afb2aSJulio Merino if [ "$sum" != "$3" ]; then 129d14afb2aSJulio Merino echo "File $1 has wrong contents" 130d14afb2aSJulio Merino FAILED=yes 131d14afb2aSJulio Merino fi 132d14afb2aSJulio Merino fi 133d14afb2aSJulio Merino} 134d14afb2aSJulio Merino 135d14afb2aSJulio Merinoif [ `id -u` -ne 0 ]; then 136d14afb2aSJulio Merino echo "must be root" 137d14afb2aSJulio Merino exit 0 138d14afb2aSJulio Merinofi 139d14afb2aSJulio Merino 140d14afb2aSJulio Merinoif [ -r /etc/etcupdate.conf ]; then 141d14afb2aSJulio Merino echo "WARNING: /etc/etcupdate.conf settings may break some tests." 142d14afb2aSJulio Merinofi 143d14afb2aSJulio Merino 144d14afb2aSJulio Merino# First, test for /etc/localtime not existing 145d14afb2aSJulio Merino 146d14afb2aSJulio Merinobuild_trees 147d14afb2aSJulio Merino 148d14afb2aSJulio Merino$COMMAND -nr -d $WORKDIR -D $TEST > $WORKDIR/testn.out 149d14afb2aSJulio Merino 150d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF 151d14afb2aSJulio MerinoEOF 152d14afb2aSJulio Merino 153d14afb2aSJulio Merinoecho "Differences for no /etc/localtime with -n:" 154d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/testn.out \ 155d14afb2aSJulio Merino || FAILED=yes 156d14afb2aSJulio Merino 157d14afb2aSJulio Merino$COMMAND -r -d $WORKDIR -D $TEST > $WORKDIR/test.out 158d14afb2aSJulio Merino 159d14afb2aSJulio Merinoecho "Differences for no /etc/localtime:" 160d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \ 161d14afb2aSJulio Merino || FAILED=yes 162d14afb2aSJulio Merino 163d14afb2aSJulio Merinomissing /etc/localtime 164d14afb2aSJulio Merinomissing /var/db/zoneinfo 165d14afb2aSJulio Merino 166d14afb2aSJulio Merino# Second, test for /etc/localtime being a symlink 167d14afb2aSJulio Merino 168d14afb2aSJulio Merinobuild_trees 169d14afb2aSJulio Merinoln -s /dev/null $TEST/etc/localtime 170d14afb2aSJulio Merino 171d14afb2aSJulio Merino$COMMAND -nr -d $WORKDIR -D $TEST > $WORKDIR/testn.out 172d14afb2aSJulio Merino 173d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF 174d14afb2aSJulio MerinoEOF 175d14afb2aSJulio Merino 176d14afb2aSJulio Merinoecho "Differences for symlinked /etc/localtime with -n:" 177d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/testn.out \ 178d14afb2aSJulio Merino || FAILED=yes 179d14afb2aSJulio Merino 180d14afb2aSJulio Merino$COMMAND -r -d $WORKDIR -D $TEST > $WORKDIR/test.out 181d14afb2aSJulio Merino 182d14afb2aSJulio Merinoecho "Differences for symlinked /etc/localtime:" 183d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \ 184d14afb2aSJulio Merino || FAILED=yes 185d14afb2aSJulio Merino 186d14afb2aSJulio Merinolink /etc/localtime "/dev/null" 187d14afb2aSJulio Merinomissing /var/db/zoneinfo 188d14afb2aSJulio Merino 189d14afb2aSJulio Merino# Third, test for /etc/localtime as a file and a missing /var/db/zoneinfo 190d14afb2aSJulio Merino 191d14afb2aSJulio Merinobuild_trees 192d14afb2aSJulio Merinoecho "bar" > $TEST/etc/localtime 193d14afb2aSJulio Merino 194d14afb2aSJulio Merino$COMMAND -nr -d $WORKDIR -D $TEST > $WORKDIR/testn.out 195d14afb2aSJulio Merino 196d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF 197d14afb2aSJulio MerinoWarnings: 198ce570b1eSEnji Cooper Needs update: /etc/localtime (required manual update via tzsetup(8)) 199d14afb2aSJulio MerinoEOF 200d14afb2aSJulio Merino 201d14afb2aSJulio Merinoecho "Differences for missing /var/db/zoneinfo with -n:" 202d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/testn.out \ 203d14afb2aSJulio Merino || FAILED=yes 204d14afb2aSJulio Merino 205d14afb2aSJulio Merino$COMMAND -r -d $WORKDIR -D $TEST > $WORKDIR/test.out 206d14afb2aSJulio Merino 207d14afb2aSJulio Merinoecho "Differences for missing /var/db/zoneinfo:" 208d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \ 209d14afb2aSJulio Merino || FAILED=yes 210d14afb2aSJulio Merino 211d14afb2aSJulio Merinofile /etc/localtime "bar" 212d14afb2aSJulio Merinomissing /var/db/zoneinfo 213d14afb2aSJulio Merino 214d14afb2aSJulio Merino# Finally, test the case where it should update /etc/localtime 215d14afb2aSJulio Merino 216d14afb2aSJulio Merinobuild_trees 217d14afb2aSJulio Merinoecho "bar" > $TEST/etc/localtime 218d14afb2aSJulio Merinoecho "foo" > $TEST/var/db/zoneinfo 219d14afb2aSJulio Merino 220d14afb2aSJulio Merino$COMMAND -nr -d $WORKDIR -D $TEST > $WORKDIR/testn.out 221d14afb2aSJulio Merino 222d14afb2aSJulio Merinocat > $WORKDIR/correct.out <<EOF 223d14afb2aSJulio MerinoEOF 224d14afb2aSJulio Merino 225d14afb2aSJulio Merinoecho "Differences for real update with -n:" 226d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/testn.out \ 227d14afb2aSJulio Merino || FAILED=yes 228d14afb2aSJulio Merino 229d14afb2aSJulio Merino$COMMAND -r -d $WORKDIR -D $TEST > $WORKDIR/test.out 230d14afb2aSJulio Merino 231d14afb2aSJulio Merinoecho "Differences for real update:" 232d14afb2aSJulio Merinodiff -u -L "correct" $WORKDIR/correct.out -L "test" $WORKDIR/test.out \ 233d14afb2aSJulio Merino || FAILED=yes 234d14afb2aSJulio Merino 235*f72b4f7eSEd Maste# XXX tzsetup installs a symlink as of 5e16809c953f 236*f72b4f7eSEd Maste#file /etc/localtime "foo" 237*f72b4f7eSEd Maste#file /var/db/zoneinfo "foo" 238d14afb2aSJulio Merino 239d14afb2aSJulio Merino[ "${FAILED}" = no ] 240