2007-07-20 14:43:49 +02:00
|
|
|
#
|
|
|
|
# Copyright (C) 2007 Karel Zak <kzak@redhat.com>
|
|
|
|
#
|
|
|
|
# This file is part of util-linux-ng.
|
|
|
|
#
|
|
|
|
# This file is free software; you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This file is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
2007-01-04 14:23:48 +01:00
|
|
|
|
|
|
|
|
2009-01-19 22:36:27 +01:00
|
|
|
function ts_abspath {
|
|
|
|
cd $1
|
|
|
|
pwd
|
|
|
|
}
|
2009-01-19 18:08:06 +01:00
|
|
|
|
2007-01-03 01:07:55 +01:00
|
|
|
function ts_skip {
|
|
|
|
echo " IGNORE ($1)"
|
2008-11-06 15:46:22 +00:00
|
|
|
if [ -n "$2" -a -b "$2" ]; then
|
2007-05-18 13:49:15 +02:00
|
|
|
ts_device_deinit "$2"
|
|
|
|
fi
|
2007-01-03 01:07:55 +01:00
|
|
|
exit 0
|
|
|
|
}
|
|
|
|
|
2007-05-16 00:41:14 +02:00
|
|
|
function ts_skip_nonroot {
|
2008-11-06 15:46:22 +00:00
|
|
|
if [ $UID -ne 0 ]; then
|
2007-05-16 00:41:14 +02:00
|
|
|
ts_skip "not root permissions"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2007-03-19 23:27:40 +01:00
|
|
|
function ts_failed {
|
|
|
|
if [ x"$1" == x"" ]; then
|
2009-01-19 18:08:06 +01:00
|
|
|
echo " FAILED ($TS_NS)"
|
2007-03-19 23:27:40 +01:00
|
|
|
else
|
|
|
|
echo " FAILED ($1)"
|
|
|
|
fi
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
|
|
|
function ts_ok {
|
|
|
|
if [ x"$1" == x"" ]; then
|
|
|
|
echo " OK"
|
|
|
|
else
|
|
|
|
echo " OK ($1)"
|
|
|
|
fi
|
|
|
|
exit 0
|
|
|
|
}
|
|
|
|
|
2007-05-18 15:34:28 +02:00
|
|
|
function ts_log {
|
|
|
|
echo "$1" >> $TS_OUTPUT
|
|
|
|
[ "$TS_VERBOSE" == "yes" ] && echo "$1"
|
|
|
|
}
|
|
|
|
|
2007-06-11 14:45:32 +02:00
|
|
|
function ts_has_option {
|
|
|
|
NAME="$1"
|
|
|
|
ALL="$2"
|
2009-01-19 22:36:27 +01:00
|
|
|
echo -n $ALL | sed 's/ //g' | awk 'BEGIN { FS="="; RS="--" } /('$NAME'$|'$NAME'=)/ { print "yes" }'
|
2007-06-11 14:45:32 +02:00
|
|
|
}
|
|
|
|
|
2009-01-20 13:19:43 +01:00
|
|
|
function ts_init_env {
|
2009-01-19 22:36:27 +01:00
|
|
|
local mydir=$(ts_abspath $(dirname $0))
|
2009-01-19 18:08:06 +01:00
|
|
|
|
2009-01-19 22:36:27 +01:00
|
|
|
export LANG="en_US.UTF-8"
|
2009-01-19 18:08:06 +01:00
|
|
|
|
2009-01-19 22:36:27 +01:00
|
|
|
TS_TOPDIR=$(ts_abspath $mydir/../../)
|
|
|
|
TS_SCRIPT="$mydir/$(basename $0)"
|
2009-01-19 18:08:06 +01:00
|
|
|
TS_SUBDIR=$(dirname $TS_SCRIPT)
|
|
|
|
TS_TESTNAME=$(basename $TS_SCRIPT)
|
|
|
|
TS_COMPONENT=$(basename $TS_SUBDIR)
|
|
|
|
|
|
|
|
TS_NS="$TS_COMPONENT/$TS_TESTNAME"
|
|
|
|
TS_SELF="$TS_SUBDIR"
|
|
|
|
|
2009-01-19 23:35:35 +01:00
|
|
|
TS_OUTDIR="$TS_TOPDIR/output/$TS_COMPONENT"
|
|
|
|
TS_OUTPUT="$TS_OUTDIR/$TS_TESTNAME"
|
2009-01-19 23:57:10 +01:00
|
|
|
TS_DIFFDIR="$TS_TOPDIR/diff/$TS_COMPONENT"
|
2009-01-19 23:35:35 +01:00
|
|
|
TS_DIFF="$TS_DIFFDIR/$TS_TESTNAME"
|
2009-01-19 22:36:27 +01:00
|
|
|
TS_EXPECTED="$TS_TOPDIR/expected/$TS_NS"
|
2009-01-19 23:35:35 +01:00
|
|
|
TS_MOUNTPOINT="$TS_OUTDIR/${TS_TESTNAME}-mnt"
|
2009-01-19 18:08:06 +01:00
|
|
|
|
2009-01-19 23:35:35 +01:00
|
|
|
TS_VERBOSE=$(ts_has_option "verbose" "$*")
|
2009-01-19 18:08:06 +01:00
|
|
|
TS_HAS_VOLUMEID="no"
|
|
|
|
|
2009-01-20 00:24:23 +01:00
|
|
|
BLKID_FILE="$TS_OUTDIR/${TS_TESTNAME}.blkidtab"
|
2009-01-19 18:08:06 +01:00
|
|
|
|
2009-01-19 23:35:35 +01:00
|
|
|
[ -d "$TS_OUTDIR" ] || mkdir -p "$TS_OUTDIR"
|
|
|
|
[ -d "$TS_DIFFDIR" ] || mkdir -p "$TS_DIFFDIR"
|
2007-06-11 14:45:32 +02:00
|
|
|
|
2007-06-15 15:55:10 +02:00
|
|
|
declare -a TS_SUID_PROGS
|
|
|
|
declare -a TS_SUID_USER
|
|
|
|
declare -a TS_SUID_GROUP
|
|
|
|
|
2009-01-19 22:36:27 +01:00
|
|
|
. $TS_TOPDIR/commands.sh
|
|
|
|
|
2007-12-06 22:46:00 +01:00
|
|
|
export BLKID_FILE
|
2007-05-25 14:53:22 +02:00
|
|
|
|
2008-08-14 13:01:04 +02:00
|
|
|
if [ -x $TS_CMD_MOUNT ]; then
|
|
|
|
ldd $TS_CMD_MOUNT | grep -q 'libvolume_id' &> /dev/null
|
2009-01-19 22:36:27 +01:00
|
|
|
[ "$?" == "0" ] && TS_HAS_VOLUMEID="yes"
|
2007-05-25 14:53:22 +02:00
|
|
|
fi
|
2007-01-04 14:23:48 +01:00
|
|
|
|
2007-01-03 00:42:23 +01:00
|
|
|
rm -f $TS_OUTPUT
|
2007-05-18 13:49:15 +02:00
|
|
|
touch $TS_OUTPUT
|
2007-01-03 00:42:23 +01:00
|
|
|
|
2009-01-19 18:08:06 +01:00
|
|
|
if [ "$TS_VERBOSE" == "yes" ]; then
|
|
|
|
echo
|
|
|
|
echo " script: $TS_SCRIPT"
|
|
|
|
echo " sub dir: $TS_SUBDIR"
|
2009-01-19 22:36:27 +01:00
|
|
|
echo " top dir: $TS_TOPDIR"
|
2009-01-19 18:08:06 +01:00
|
|
|
echo " self: $TS_SELF"
|
|
|
|
echo " test name: $TS_TESTNAME"
|
|
|
|
echo " test desc: $TS_DESC"
|
|
|
|
echo " component: $TS_COMPONENT"
|
|
|
|
echo " namespace: $TS_NS"
|
|
|
|
echo " verbose: $TS_VERBOSE"
|
|
|
|
echo " output: $TS_OUTPUT"
|
|
|
|
echo " expected: $TS_EXPECTED"
|
|
|
|
echo " mountpoint: $TS_MOUNTPOINT"
|
|
|
|
echo
|
|
|
|
fi
|
2009-01-20 13:19:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function ts_init {
|
|
|
|
local is_fake=$( ts_has_option "fake" "$*")
|
|
|
|
|
|
|
|
ts_init_env "$*"
|
|
|
|
|
|
|
|
printf "%15s: %-30s ..." "$TS_COMPONENT" "$TS_DESC"
|
2009-01-19 18:08:06 +01:00
|
|
|
|
|
|
|
[ "$is_fake" == "yes" ] && ts_skip "fake mode"
|
2007-01-04 14:23:48 +01:00
|
|
|
}
|
|
|
|
|
2007-06-15 15:55:10 +02:00
|
|
|
function ts_init_suid {
|
|
|
|
PROG="$1"
|
|
|
|
ct=${#TS_SUID_PROGS[*]}
|
|
|
|
|
|
|
|
# Save info about original setting
|
|
|
|
TS_SUID_PROGS[$ct]=$PROG
|
|
|
|
TS_SUID_USER[$ct]=$(stat --printf="%U" $PROG)
|
|
|
|
TS_SUID_GROUP[$ct]=$(stat --printf="%G" $PROG)
|
|
|
|
|
|
|
|
chown root.root $PROG &> /dev/null
|
|
|
|
chmod u+s $PROG &> /dev/null
|
|
|
|
}
|
|
|
|
|
2007-01-04 14:23:48 +01:00
|
|
|
function ts_finalize {
|
|
|
|
local res=0
|
|
|
|
|
2007-06-15 15:55:10 +02:00
|
|
|
for idx in $(seq 0 $((${#TS_SUID_PROGS[*]} - 1))); do
|
|
|
|
PROG=${TS_SUID_PROGS[$idx]}
|
|
|
|
chmod a-s $PROG &> /dev/null
|
|
|
|
chown ${TS_SUID_USER[$idx]}.${TS_SUID_GROUP[$idx]} $PROG &> /dev/null
|
|
|
|
done
|
|
|
|
|
2007-01-04 14:23:48 +01:00
|
|
|
if [ -s $TS_EXPECTED ]; then
|
|
|
|
if [ -s $TS_OUTPUT ]; then
|
|
|
|
diff -u $TS_EXPECTED $TS_OUTPUT > $TS_DIFF
|
|
|
|
if [ -s $TS_DIFF ]; then
|
|
|
|
res=1
|
|
|
|
fi
|
|
|
|
else
|
2007-01-30 13:18:51 +01:00
|
|
|
res=1
|
2007-01-04 14:23:48 +01:00
|
|
|
fi
|
2007-01-03 00:42:23 +01:00
|
|
|
else
|
|
|
|
echo " IGNORE (expected output undefined)"
|
|
|
|
exit 0
|
2007-01-04 14:23:48 +01:00
|
|
|
fi
|
|
|
|
if [ $res -eq 0 ]; then
|
2007-03-19 23:27:40 +01:00
|
|
|
ts_ok $1
|
2007-01-04 14:23:48 +01:00
|
|
|
else
|
2007-03-19 23:27:40 +01:00
|
|
|
ts_failed $1
|
2007-01-04 14:23:48 +01:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2007-05-18 13:49:15 +02:00
|
|
|
function ts_die {
|
2007-05-18 15:34:28 +02:00
|
|
|
ts_log "$1"
|
2007-05-18 13:49:15 +02:00
|
|
|
if [ -n "$2" ] && [ -b "$2" ]; then
|
|
|
|
ts_device_deinit "$2"
|
2007-05-22 16:01:55 +02:00
|
|
|
ts_fstab_clean # for sure...
|
2007-05-18 13:49:15 +02:00
|
|
|
fi
|
|
|
|
ts_finalize
|
|
|
|
}
|
|
|
|
|
2007-05-16 01:38:13 +02:00
|
|
|
function ts_device_init {
|
2009-01-20 00:24:23 +01:00
|
|
|
local img="$TS_OUTDIR/${TS_TESTNAME}.img"
|
|
|
|
local dev=""
|
2007-03-19 23:27:40 +01:00
|
|
|
|
2009-01-20 00:24:23 +01:00
|
|
|
dd if=/dev/zero of="$img" bs=1M count=5 &> /dev/null
|
2007-03-19 23:27:40 +01:00
|
|
|
|
2009-01-20 00:24:23 +01:00
|
|
|
dev=$($TS_CMD_LOSETUP -s -f "$img")
|
2007-05-16 01:38:13 +02:00
|
|
|
|
2009-01-20 00:24:23 +01:00
|
|
|
if [ -z "$dev" ]; then
|
|
|
|
ts_device_deinit $dev
|
2007-05-16 01:38:13 +02:00
|
|
|
return 1 # error
|
|
|
|
fi
|
|
|
|
|
2009-01-20 00:24:23 +01:00
|
|
|
echo $dev
|
2007-05-16 01:38:13 +02:00
|
|
|
return 0 # succes
|
|
|
|
}
|
|
|
|
|
2007-10-12 00:33:01 +02:00
|
|
|
|
|
|
|
|
2007-05-16 01:38:13 +02:00
|
|
|
function ts_device_deinit {
|
2007-05-18 13:49:15 +02:00
|
|
|
local DEV="$1"
|
|
|
|
|
|
|
|
if [ -b "$DEV" ]; then
|
|
|
|
$TS_CMD_UMOUNT "$DEV" &> /dev/null
|
|
|
|
$TS_CMD_LOSETUP -d "$DEV" &> /dev/null
|
2007-05-16 01:38:13 +02:00
|
|
|
fi
|
|
|
|
}
|
2007-05-16 02:07:07 +02:00
|
|
|
|
2007-05-18 13:49:15 +02:00
|
|
|
function ts_udev_dev_support {
|
2007-05-25 14:53:22 +02:00
|
|
|
if [ "$TS_HAS_VOLUMEID" == "yes" ] && [ ! -L "/dev/disk/$1/$2" ]; then
|
2007-05-16 02:07:07 +02:00
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2007-05-17 20:16:25 +02:00
|
|
|
function ts_uuid_by_devname {
|
|
|
|
local DEV="$1"
|
|
|
|
local UUID=""
|
|
|
|
if [ -x "$TS_ECMD_BLKID" ]; then
|
|
|
|
UUID=$($TS_ECMD_BLKID -c /dev/null -w /dev/null -s "UUID" $DEV | sed 's/.*UUID="//g; s/"//g')
|
|
|
|
elif [ -x "$TS_ECMD_VOLID" ]; then
|
|
|
|
UUID=$($TS_ECMD_VOLID -u $DEV)
|
|
|
|
fi
|
|
|
|
echo $UUID
|
|
|
|
}
|
|
|
|
|
|
|
|
function ts_label_by_devname {
|
|
|
|
local DEV="$1"
|
|
|
|
local TYPE=""
|
|
|
|
if [ -x "$TS_ECMD_BLKID" ]; then
|
|
|
|
LABEL=$($TS_ECMD_BLKID -c /dev/null -w /dev/null -s "LABEL" $DEV | sed 's/.*LABEL="//g; s/"//g')
|
|
|
|
elif [ -x "$TS_ECMD_VOLID" ]; then
|
|
|
|
LABEL=$($TS_ECMD_VOLID -l $DEV)
|
|
|
|
fi
|
|
|
|
echo $LABEL
|
|
|
|
}
|
|
|
|
|
|
|
|
function ts_fstype_by_devname {
|
|
|
|
local DEV="$1"
|
|
|
|
local TYPE=""
|
|
|
|
if [ -x "$TS_ECMD_BLKID" ]; then
|
|
|
|
TYPE=$($TS_ECMD_BLKID -c /dev/null -w /dev/null -s "TYPE" $DEV | sed 's/.*TYPE="//g; s/"//g')
|
|
|
|
elif [ -x "$TS_ECMD_VOLID" ]; then
|
|
|
|
TYPE=$($TS_ECMD_VOLID -t $DEV)
|
|
|
|
fi
|
|
|
|
echo $TYPE
|
|
|
|
}
|
|
|
|
|
|
|
|
function ts_device_has {
|
|
|
|
local TAG="$1"
|
|
|
|
local VAL="$2"
|
|
|
|
local DEV="$3"
|
2007-05-18 13:49:15 +02:00
|
|
|
local vl=""
|
2007-05-17 20:16:25 +02:00
|
|
|
|
|
|
|
case $TAG in
|
|
|
|
"TYPE") vl=$(ts_fstype_by_devname $DEV);;
|
|
|
|
"LABEL") vl=$(ts_label_by_devname $DEV);;
|
|
|
|
"UUID") vl=$(ts_uuid_by_devname $DEV);;
|
|
|
|
*) return 1;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
if [ "$vl" == "$VAL" ]; then
|
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
return 1
|
|
|
|
}
|
2007-05-18 13:49:15 +02:00
|
|
|
|
|
|
|
function ts_device_has_uuid {
|
|
|
|
ts_uuid_by_devname "$1" | egrep -q '^[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}$'
|
|
|
|
return $?
|
|
|
|
}
|
|
|
|
|
2009-02-04 22:38:34 +01:00
|
|
|
function ts_is_mounted {
|
|
|
|
local DEV=$1
|
|
|
|
|
|
|
|
grep -q $DEV /proc/mounts && return 0
|
|
|
|
|
|
|
|
if [ "${DEV#/dev/loop/}" != "$DEV" ]; then
|
|
|
|
return grep -q "/dev/loop${DEV#/dev/loop/}" /proc/mounts
|
|
|
|
fi
|
|
|
|
return 1
|
|
|
|
}
|
|
|
|
|
2007-05-18 13:49:15 +02:00
|
|
|
function ts_swapoff {
|
|
|
|
local DEV="$1"
|
|
|
|
|
|
|
|
# swapoff doesn't exist in build tree
|
|
|
|
if [ ! -x "$TS_CMD_SWAPOFF" ]; then
|
|
|
|
ln -sf $TS_CMD_SWAPON $TS_CMD_SWAPOFF
|
|
|
|
REMSWAPOFF="true"
|
|
|
|
fi
|
|
|
|
$TS_CMD_SWAPOFF $DEV 2>&1 >> $TS_OUTPUT
|
|
|
|
if [ -n "$REMSWAPOFF" ]; then
|
|
|
|
rm -f $TS_CMD_SWAPOFF
|
|
|
|
fi
|
|
|
|
}
|
2007-05-22 16:01:55 +02:00
|
|
|
|
|
|
|
function ts_fstab_open {
|
|
|
|
echo "# <!-- util-linux-ng test entry" >> /etc/fstab
|
|
|
|
}
|
|
|
|
|
|
|
|
function ts_fstab_close {
|
|
|
|
echo "# -->" >> /etc/fstab
|
|
|
|
}
|
|
|
|
|
|
|
|
function ts_fstab_addline {
|
|
|
|
local SPEC="$1"
|
|
|
|
local MNT=${2:-"$TS_MOUNTPOINT"}
|
|
|
|
local FS=${3:-"auto"}
|
2007-06-15 11:29:04 +02:00
|
|
|
local OPT=${4:-"defaults"}
|
2007-05-22 16:01:55 +02:00
|
|
|
|
2007-06-15 11:29:04 +02:00
|
|
|
echo "$SPEC $MNT $FS $OPT 0 0" >> /etc/fstab
|
2007-05-22 16:01:55 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function ts_fstab_add {
|
|
|
|
ts_fstab_open
|
2007-06-15 11:29:04 +02:00
|
|
|
ts_fstab_addline $*
|
2007-05-22 16:01:55 +02:00
|
|
|
ts_fstab_close
|
|
|
|
}
|
|
|
|
|
|
|
|
function ts_fstab_clean {
|
|
|
|
sed --in-place "
|
|
|
|
/# <!-- util-linux-ng/!b
|
|
|
|
:a
|
|
|
|
/# -->/!{
|
|
|
|
N
|
|
|
|
ba
|
|
|
|
}
|
|
|
|
s/# <!-- util-linux-ng.*-->//;
|
|
|
|
/^$/d" /etc/fstab
|
|
|
|
}
|
|
|
|
|