#!/bin/bash
#
# /etc/init.d/iscsi
#
### BEGIN INIT INFO
# Provides:          iscsi
# Required-Start:    $network
# Should-Start:      iscsitarget
# Required-Stop:     $network
# Should-Stop:       iscsitarget
# Default-Start:     3 5
# Default-Stop:      
# Short-Description: iSCSI initiator daemon
# Description:       The iSCSI initator is used to create and
#                    manage iSCSI connections to a iSCSI Target.
#                    
### END INIT INFO

CONFIG_FILE=/etc/iscsi/iscsid.conf
DAEMON=/sbin/iscsid
ISCSIADM=/sbin/iscsiadm
ARGS="-c $CONFIG_FILE -n"

# Source LSB init functions
. /etc/rc.status

# Reset status of this service
rc_reset

iscsi_login_all_nodes()
{
	echo -n "Setting up iSCSI targets: "
	$ISCSIADM -m node --loginall=automatic 2> /dev/null
	if [ $? == 19 ] ; then
	    rc_failed 6
	fi
	rc_status -v
}

iscsi_logout_all_nodes()
{
	echo -n "Closing all iSCSI connections: "
	# Logout from all sessions marked automatic
	if ! $ISCSIADM -m node --logoutall=automatic 2> /dev/null; then
		if [ $? == 19 ] ; then
		    RETVAL=6
		else
		    RETVAL=1
		fi
		rc_failed $RETVAL
	fi
	rc_status -v

	# Not sure whether this is still needed
	sleep 1
	return ${RETVAL:-0}
}

iscsi_umount_all_luns()
{
    local d m dev p s

    cat /proc/mounts | sed -ne '/^\/dev\/.*/p' | while read d m t o x; do 
	if [ "$m" = "/" ] ; then 
	    continue;
	fi
	if [ -L "$d" ] ; then
	    d=$(readlink -f $d)
	fi
	dev=${d##/dev}

	if [ "${dev##/sd}" = "$dev" ] ; then
	    continue;
	fi
	p="/sys/block${dev%%[0-9]*}"

	if [ ! -d ${p} ] && [ ! -d ${p}/device ] ; then
	    continue;
	fi

	s=$(cd -P ${p}/device && echo $PWD)

	case "$s" in
	    */session[0-9]*/*)
		# This is an iSCSI device
		umount "$m"
	    ;;
	esac
    done
}

iscsi_list_all_nodes()
{
    # Check for active sessions
    if $ISCSIADM -m session > /dev/null; then
	return 0
    fi
    echo "Active connections:"
    $ISCSIADM -m session | while read proto num PORTAL TARGET ; do
	PORTAL=${PORTAL%,*}
	echo -e "\t$TARGET at $PORTAL"
    done
}

case "$1" in
    start)
	if checkproc $DAEMON ; then
	    RETVAL=0
	else
	    echo -n "Starting iSCSI initiator service: "
	    modprobe iscsi_tcp
	    modprobe -q ib_iser
	    startproc $DAEMON $ARGS
	    RETVAL=$?
	    rc_status -v
	fi
	if [ "$RETVAL" == "0" ]; then
	    iscsi_login_all_nodes
	fi
	;;
    stop)
	iscsi_umount_all_luns
	echo -n "Stopping iSCSI initiator service: "
	if iscsi_logout_all_nodes ; then
	    killproc -KILL $DAEMON
	    RETVAL=$?
	else
	    RETVAL=1
	fi
	if [ "$RETVAL" == "0" ]; then
	    status=0
	    modprobe -r iscsi_tcp
	    if [ "$?" -ne "0" -a "$?" -ne "1" ]; then
	    	status=1
	    fi
	    modprobe -q -r ib_iser
            if [ "$?" -ne "0" -a "$?" -ne "1" ]; then
	        status=1 
            fi
	    rc_failed $status
	else
	    rc_failed $RETVAL
	fi
	rc_status -v
	;;
    status)
	echo -n "Checking for iSCSI initiator service: "
	if checkproc $DAEMON ; then
	    rc_status -v
	    iscsi_list_all_nodes
	else
	    rc_failed 3
	    rc_status -v
	fi
	;;
    restart|reload)
	$0 stop
	sleep 1
	$0 start
	;;
    *)
	echo "Usage: $0 {start|stop|status|restart|reload}"
	exit 1
	;;
esac
rc_exit

