2007-01-04 14:23:48 +01:00
|
|
|
|
2007-01-31 16:45:01 +01:00
|
|
|
TS_OUTDIR="output"
|
|
|
|
TS_DIFFDIR="diff"
|
|
|
|
TS_EXPECTEDDIR="expected"
|
|
|
|
TS_INPUTDIR="input"
|
2007-05-18 15:34:28 +02:00
|
|
|
TS_VERBOSE="no"
|
2007-01-04 14:23:48 +01:00
|
|
|
|
2007-01-03 01:07:55 +01:00
|
|
|
function ts_skip {
|
|
|
|
echo " IGNORE ($1)"
|
2007-05-18 13:49:15 +02:00
|
|
|
if [ -n "$2" ] && [ -b "$2" ]; then
|
|
|
|
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 {
|
|
|
|
if [ $UID != 0 ]; then
|
|
|
|
ts_skip "not root permissions"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2007-03-19 23:27:40 +01:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
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"
|
|
|
|
echo -n $ALL | sed 's/ //g' | gawk 'BEGIN { FS="="; RS="--" } /('$NAME'$|'$NAME'=)/ { print "yes" }'
|
|
|
|
}
|
|
|
|
|
2007-01-04 14:23:48 +01:00
|
|
|
function ts_init {
|
2007-01-30 13:18:51 +01:00
|
|
|
export LANG="en_US.UTF-8":
|
2007-01-04 14:23:48 +01:00
|
|
|
TS_NAME=$(basename $0)
|
|
|
|
if [ ! -d $TS_OUTDIR ]; then
|
|
|
|
mkdir -p $TS_OUTDIR
|
|
|
|
fi
|
|
|
|
if [ ! -d $TS_DIFFDIR ]; then
|
|
|
|
mkdir -p $TS_DIFFDIR
|
|
|
|
fi
|
2007-06-11 14:45:32 +02:00
|
|
|
|
|
|
|
TS_VERBOSE=$( ts_has_option "verbose" "$*")
|
2007-01-04 14:23:48 +01:00
|
|
|
TS_OUTPUT="$TS_OUTDIR/$TS_NAME"
|
|
|
|
TS_DIFF="$TS_DIFFDIR/$TS_NAME"
|
|
|
|
TS_EXPECTED="$TS_EXPECTEDDIR/$TS_NAME"
|
2007-01-30 13:18:51 +01:00
|
|
|
TS_INPUT="$TS_INPUTDIR/$TS_NAME"
|
2007-05-22 16:01:55 +02:00
|
|
|
TS_MOUNTPOINT="$(pwd)/$TS_OUTDIR/${TS_NAME}_mnt"
|
2007-05-25 14:53:22 +02:00
|
|
|
TS_BLKIDCACHE=""
|
|
|
|
TS_HAS_VOLUMEID="no"
|
|
|
|
|
|
|
|
ldd $TS_CMD_MOUNT | grep -q 'libvolume_id' &> /dev/null
|
|
|
|
if [ "$?" == "0" ]; then
|
|
|
|
TS_HAS_VOLUMEID="yes"
|
|
|
|
fi
|
|
|
|
if [ "$TS_HAS_VOLUMEID" != "yes" ]; then
|
|
|
|
if [ -f "/etc/blkid/blkid.tab" ]; then
|
|
|
|
TS_BLKIDCACHE="/etc/blkid/blkid.tab"
|
|
|
|
elif [ -f "/etc/blkid.tab" ]; then
|
|
|
|
TS_BLKIDCACHE="/etc/blkid.tab"
|
|
|
|
fi
|
|
|
|
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
|
|
|
|
2007-01-04 14:23:48 +01:00
|
|
|
printf "%15s: %-25s ..." "$TS_COMPONENT" "$TS_DESC"
|
|
|
|
}
|
|
|
|
|
|
|
|
function ts_finalize {
|
|
|
|
local res=0
|
|
|
|
|
|
|
|
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 {
|
2007-05-18 13:49:15 +02:00
|
|
|
local IMAGE="$TS_OUTDIR/$TS_NAME.img"
|
|
|
|
local IMAGE_RE=$( echo "$IMAGE" | sed 's:/:\\/:g' )
|
|
|
|
local DEV=""
|
2007-03-19 23:27:40 +01:00
|
|
|
|
2007-05-25 14:53:22 +02:00
|
|
|
if [ "$TS_HAS_VOLUMEID" != "yes" ] && [ -f "$TS_BLKIDCACHE" ]; then
|
|
|
|
cp $TS_BLKIDCACHE $OUTDIR/$TS_NAME.cache
|
|
|
|
fi
|
|
|
|
|
2007-05-16 01:38:13 +02:00
|
|
|
dd if=/dev/zero of="$IMAGE" bs=1M count=5 &> /dev/null
|
2007-03-19 23:27:40 +01:00
|
|
|
|
2007-05-16 01:38:13 +02:00
|
|
|
$TS_CMD_LOSETUP -f "$IMAGE" 2>&1 >> $TS_OUTPUT
|
2007-05-18 13:49:15 +02:00
|
|
|
DEV=$( $TS_CMD_LOSETUP -a | gawk 'BEGIN {FS=":"} /'$IMAGE_RE'/ { print $1 }' )
|
2007-05-16 01:38:13 +02:00
|
|
|
|
2007-05-18 13:49:15 +02:00
|
|
|
if [ -z "$DEV" ]; then
|
|
|
|
ts_device_deinit $DEV
|
2007-05-16 01:38:13 +02:00
|
|
|
return 1 # error
|
|
|
|
fi
|
|
|
|
|
2007-05-18 13:49:15 +02:00
|
|
|
echo $DEV
|
2007-05-16 01:38:13 +02:00
|
|
|
return 0 # succes
|
|
|
|
}
|
|
|
|
|
|
|
|
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-25 14:53:22 +02:00
|
|
|
if [ "$TS_HAS_VOLUMEID" != "yes" ] && [ -f "$TS_BLKIDCACHE" ] && [ -s "$OUTDIR/$TS_NAME.cache" ]; then
|
|
|
|
# We have to remove the device from cache otherwise
|
|
|
|
# libblkid will reuse cached information. The cache
|
|
|
|
# refresh time is 2 seconds -- that's too long. We
|
|
|
|
# re-use the same device more quickly. --kzak
|
|
|
|
mv -f $OUTDIR/$TS_NAME.cache $TS_BLKIDCACHE
|
|
|
|
fi
|
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 $?
|
|
|
|
}
|
|
|
|
|
|
|
|
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"}
|
|
|
|
local OPT=${4:-"default"}
|
|
|
|
|
|
|
|
echo "$SPEC $MNT $FS defaults 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
|
|
|
|
}
|
|
|
|
|