#! /bin/bash
# Kill session(s) for given iSCSI hosts

SCSI_HOST=/sys/class/scsi_host

print_usage()
{
	echo
        echo "Usage: iscsi-kill-session  [-i host_id]"
        echo "-i : Kill session only on specific host ID"
}

is_num()
{
	case "$1" in
	-*[!0-9]*) rval=0;;
	*) rval=1;;
	esac
}

find_host_ids()
{
	i=0
	if [ $opt_i ]; then
		hosts=host$opt_i
		if [ ! -e $SCSI_HOST/$hosts ]; then
			echo "Host $opt_i does not exist"
			exit 1
		fi
	else
		read -p "Kill all sessions - are you sure??? " user_is_sure
		if [ $user_is_sure = "y" -o $user_is_sure = "Y" ]; then
			hosts=`ls -1 $SCSI_HOST/`
		else
			echo "Not confirmed - exiting."
			exit 1
		fi
	fi
	for host in $hosts; do
		host=$SCSI_HOST/$host
		proc_name=`cat $host/proc_name`
		if [ "$proc_name" = "iscsi-sfnet" ]; then
			host_no=${host:${#SCSI_HOST} + 5}
			host_ids[$i]=$host_no
			let "i += 1"
		elif [ $opt_i ]; then
			echo "Device is not an iSCSI device"
		fi
	done
}

while getopts i: opt; do
case $opt in
    i)
	if [ $OPTARG ]; then
		is_num $OPTARG
		if [ $rval -eq  1 ];then
			opt_i=$OPTARG
		else
			print_usage
			exit 1
		fi
	else
		print_usage
		exit 1
	fi;;
   ?)
	print_usage
	exit 1;;
esac
done

cat /proc/devices | grep -q iscsictl
if [ $? -ne 0 ]; then
	echo "###############################################################################"
	echo "iSCSI driver is not loaded"
	echo "###############################################################################"
	exit
fi

declare -a host_ids
find_host_ids
no_hosts=${#host_ids[*]}

i=0
while [ $i -lt $no_hosts ]; do
	echo 5 > $SCSI_HOST/host${host_ids[$i]}/connfail_timeout
	echo 5 > $SCSI_HOST/host${host_ids[$i]}/reset_timeout
	echo 5 > $SCSI_HOST/host${host_ids[$i]}/abort_timeout
	echo 1 > $SCSI_HOST/host${host_ids[$i]}/shutdown
	let "i += 1"
done
