#!/bin/bash
#
# ZFS/ZPOOL configuration test script.

basedir="$(dirname $0)"

SCRIPT_COMMON=common.sh
if [ -f "${basedir}/${SCRIPT_COMMON}" ]; then
. "${basedir}/${SCRIPT_COMMON}"
else
echo "Missing helper script ${SCRIPT_COMMON}" && exit 1
fi

PROG=zpios-sanity.sh
HEADER=
FAILS=0

usage() {
cat << EOF
USAGE:
$0 [hvxfc]

DESCRIPTION:
        ZPIOS sanity tests

OPTIONS:
        -h      Show this message
        -v      Verbose
        -x      Destructive hd/sd/md/dm/ram tests
	-f      Don't prompt due to -x
	-c      Cleanup lo+file devices at start

EOF
}

while getopts 'hvxfc?' OPTION; do
	case $OPTION in
	h)
		usage
		exit 1
		;;
	v)
		VERBOSE=1
		;;
	x)
		DANGEROUS=1
		;;
	f)
		FORCE=1
		;;
	c)
		CLEANUP=1
		;;
	?)
		usage
		exit
		;;
	esac
done

if [ $(id -u) != 0 ]; then
	die "Must run as root"
fi

# Initialize the test suite
init

# Perform pre-cleanup is requested
if [ ${CLEANUP} ]; then
	${ZFS_SH} -u
	cleanup_md_devices
	cleanup_loop_devices
	rm -f /tmp/zpool.cache.*
fi

zpios_test() {
	CONFIG=$1
	TEST=$2
	LOG=`mktemp`

	${ZPIOS_SH} -f -c ${CONFIG} -t ${TEST} &>${LOG}
	if [ $? -ne 0 ]; then
		FAILS=1

		if [ ${VERBOSE} ]; then
			printf "FAIL:     %-13s\n" ${CONFIG}
			cat ${LOG}
		else
			if [ ! ${HEADER} ]; then
				head -2 ${LOG}
				HEADER=1
			fi

			printf "FAIL:     %-13s" ${CONFIG}
			tail -1 ${LOG}
		fi
	else
		if [ ${VERBOSE} ]; then
			cat ${LOG}
		else
			if [ ! ${HEADER} ]; then
				head -2 ${LOG}
				HEADER=1
			fi

			tail -1 ${LOG}
		fi
	fi

	rm -f ${LOG}
}

if [ ${DANGEROUS} ] && [ ! ${FORCE} ]; then
	cat << EOF
The -x option was passed which will result in UNRECOVERABLE DATA LOSS
on on the following block devices:

  /dev/sd[abcd]
  /dev/hda
  /dev/ram0
  /dev/md0
  /dev/dm-0

To continue please confirm by entering YES:
EOF
	read CONFIRM
	if [ ${CONFIRM} != "YES" ] && [ ${CONFIRM} != "yes" ]; then
		exit 0;
	fi
fi

#
# These configurations are all safe and pose no risk to any data on
# the system which runs them.  They will confine all their IO to a
# file in /tmp or a loopback device configured to use a file in /tmp.
#
SAFE_CONFIGS=(						\
	file-raid0 file-raid10 file-raidz file-raidz2	\
	lo-raid0 lo-raid10 lo-raidz lo-raidz2		\
)

#
# These configurations are down right dangerous.  They will attempt
# to use various real block devices on your system which may contain
# data you car about.  You are STRONGLY advised not to run this unless
# you are certain there is no data on the system you care about.
#
DANGEROUS_CONFIGS=(					\
	hda-raid0					\
	sda-raid0					\
	ram0-raid0					\
	md0-raid10 md0-raid5				\
	dm0-raid0					\
)

TMP_CACHE=`mktemp -p /tmp zpool.cache.XXXXXXXX`
${ZFS_SH} zfs="spa_config_path=${TMP_CACHE}" || die "Unable to load modules"

for CONFIG in ${SAFE_CONFIGS[*]}; do
	zpios_test $CONFIG tiny
done

if [ ${DANGEROUS} ]; then
	for CONFIG in ${DANGEROUS_CONFIGS[*]}; do
		zpios_test $CONFIG tiny
	done
fi

${ZFS_SH} -u

exit $FAILS