blob: 5857731521377ab965936bad051b66cfe8f4a3af [file] [log] [blame]
#
# 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.
#
TS_OUTDIR="output"
TS_DIFFDIR="diff"
TS_EXPECTEDDIR="expected"
TS_INPUTDIR="input"
TS_VERBOSE="no"
function ts_skip {
echo " IGNORE ($1)"
if [ -n "$2" ] && [ -b "$2" ]; then
ts_device_deinit "$2"
fi
exit 0
}
function ts_skip_nonroot {
if [ $UID != 0 ]; then
ts_skip "not root permissions"
fi
}
function ts_failed {
if [ x"$1" == x"" ]; then
echo " FAILED ($TS_NAME)"
else
echo " FAILED ($1)"
fi
exit 1
}
function ts_ok {
if [ x"$1" == x"" ]; then
echo " OK"
else
echo " OK ($1)"
fi
exit 0
}
function ts_log {
echo "$1" >> $TS_OUTPUT
[ "$TS_VERBOSE" == "yes" ] && echo "$1"
}
function ts_has_option {
NAME="$1"
ALL="$2"
echo -n $ALL | sed 's/ //g' | $AWK 'BEGIN { FS="="; RS="--" } /('$NAME'$|'$NAME'=)/ { print "yes" }'
}
function ts_init {
export LANG="en_US.UTF-8":
TS_NAME=$(basename $0)
if [ ! -d $TS_OUTDIR ]; then
mkdir -p $TS_OUTDIR
fi
if [ ! -d $TS_DIFFDIR ]; then
mkdir -p $TS_DIFFDIR
fi
declare -a TS_SUID_PROGS
declare -a TS_SUID_USER
declare -a TS_SUID_GROUP
TS_VERBOSE=$( ts_has_option "verbose" "$*")
TS_OUTPUT="$TS_OUTDIR/$TS_NAME"
TS_DIFF="$TS_DIFFDIR/$TS_NAME"
TS_EXPECTED="$TS_EXPECTEDDIR/$TS_NAME"
TS_INPUT="$TS_INPUTDIR/$TS_NAME"
TS_MOUNTPOINT="$(pwd)/$TS_OUTDIR/${TS_NAME}_mnt"
TS_HAS_VOLUMEID="no"
BLKID_FILE="$TS_OUTDIR/$TS_NAME.blkidtab"
export BLKID_FILE
ldd $TS_CMD_MOUNT | grep -q 'libvolume_id' &> /dev/null
if [ "$?" == "0" ]; then
TS_HAS_VOLUMEID="yes"
fi
rm -f $TS_OUTPUT
touch $TS_OUTPUT
printf "%15s: %-25s ..." "$TS_COMPONENT" "$TS_DESC"
}
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
}
function ts_finalize {
local res=0
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
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
res=1
fi
else
echo " IGNORE (expected output undefined)"
exit 0
fi
if [ $res -eq 0 ]; then
ts_ok $1
else
ts_failed $1
fi
}
function ts_die {
ts_log "$1"
if [ -n "$2" ] && [ -b "$2" ]; then
ts_device_deinit "$2"
ts_fstab_clean # for sure...
fi
ts_finalize
}
function ts_device_init {
local IMAGE="$TS_OUTDIR/$TS_NAME.img"
local DEV=""
dd if=/dev/zero of="$IMAGE" bs=1M count=5 &> /dev/null
DEV=$($TS_CMD_LOSETUP -s -f "$IMAGE")
if [ -z "$DEV" ]; then
ts_device_deinit $DEV
return 1 # error
fi
echo $DEV
return 0 # succes
}
function ts_device_deinit {
local DEV="$1"
if [ -b "$DEV" ]; then
$TS_CMD_UMOUNT "$DEV" &> /dev/null
$TS_CMD_LOSETUP -d "$DEV" &> /dev/null
fi
}
function ts_udev_dev_support {
if [ "$TS_HAS_VOLUMEID" == "yes" ] && [ ! -L "/dev/disk/$1/$2" ]; then
return 1
fi
return 0
}
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"
local vl=""
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
}
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 $?
}
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
}
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"}
local OPT=${4:-"defaults"}
echo "$SPEC $MNT $FS $OPT 0 0" >> /etc/fstab
}
function ts_fstab_add {
ts_fstab_open
ts_fstab_addline $*
ts_fstab_close
}
function ts_fstab_clean {
sed --in-place "
/# <!-- util-linux-ng/!b
:a
/# -->/!{
N
ba
}
s/# <!-- util-linux-ng.*-->//;
/^$/d" /etc/fstab
}