#!/bin/bash

. /etc/rc.conf
. /etc/rc.d/functions

# general config
[ -f /etc/conf.d/open-iscsi ] && . /etc/conf.d/open-iscsi

# Set defaults if settings are missing
[ -z "${ISCSID_ARGS}" ] && ISCSID_ARGS=""
[ -z "$SEC_BEFORE_MOUNT" ] && SEC_BEFORE_MOUNT=2
[ -z "$ISCSIADM_EXTRAARGS" ] && ISCSIADM_EXTRAARGS=""
DAEMON_NAME="open-iscsi"
ISCSIADM=/sbin/iscsiadm
PIDFILE=/var/run/iscsid.pid

case "$1" in
    start)
        modprobe -q iscsi_tcp &>/dev/null
        modprobe -q ib_iser &>/dev/null

        stat_busy "Starting Open-iSCSI daemon"
        /sbin/iscsid ${ISCSID_ARGS}
        if [ $? -ne 0 ]; then
            stat_fail
            exit 2
        else
            add_daemon $DAEMON_NAME
            stat_done
        fi

        if [ -n "$SERVER" ]; then
            stat_busy "Discovering targets"
            $ISCSIADM -m discovery -t sendtargets -p $SERVER $ISCSIADM_EXTRAARGS > /dev/null
            if [ $? -ne 0 ]; then
                stat_fail
                exit 3
            else
                stat_done
            fi

            stat_busy "Login to all portals"
            $ISCSIADM -m node -L all > /dev/null
            if [ $? -ne 0 ]; then
                stat_fail
                exit 4
            else
                stat_done
            fi

            if [[ "$MOUNT" != "" ]]; then
                # wait n seconds to settle
                sleep $SEC_BEFORE_MOUNT
                status "Mounting devices"
                for MTPT in ${MOUNT[@]}; do
                    stat_busy "mounting $MTPT"
                    mount $MTPT
                    sleep 1
                    if [ $? -eq 0 ]; then
                        stat_done
                    else
                        stat_fail
                    fi
                done
            else
                status "No devices to mount defined"
            fi
        fi
        ;;
    stop)
        if [[ "$MOUNT" != "" ]]; then
                status "Unmounting devices"
            # unmounting in reverse order
            LEN=${#MOUNT[@]}
            while [ $LEN -ne 0 ]; do
                let LEN=$LEN-1;
                UMOUNT="$UMOUNT ${MOUNT[$LEN]}";
            done
            for MTPT in $UMOUNT; do
                MOUNTED=$(mount|grep -c `/usr/bin/readlink -mns $MTPT`)
                if [ $MOUNTED -ne 0 ]; then
                    stat_busy "unmounting $MTPT"
                    umount $MTPT
                    sleep 1
                    if [ $? -eq 0 ]; then
                        stat_done
                    else
                        stat_fail
                        exit 5
                    fi
                else
                    status "$MTPT not mounted"
                fi
            done
            sleep 2
        else
            status "No devices to unmount defined"
        fi

        $ISCSIADM -m session $> /dev/null
        if [ $? -eq 0 ]; then
            stat_busy "Logout to all portals"
            $ISCSIADM -m node -U all > /dev/null
            if [ $? -ne 0 ]; then
                stat_fail
                exit 6
            else
                stat_done
            fi
        fi

        stat_busy "Stopping Open-iSCSI daemon"
        [ -f $PIDFILE ] && kill -9 `cat $PIDFILE` &> /dev/null
        if [ $? -ne 0 ]; then
            stat_fail
        else
            rm -f $PIDFILE
            killall iscsid > /dev/null
            rm_daemon $DAEMON_NAME
            stat_done
        fi
        ;;
    status)
    	status "Open-iSCSI status"
        ck_daemon $DAEMON_NAME
    	status "Available portals on node"
        echo
        echo -ne "   " 
        /sbin/iscsiadm -m node
        echo
    	status "Connected portals for this session"
        echo
        echo -ne "   " 
        /sbin/iscsiadm -m session
        echo
        ;;
    statusv)
    	status "Open-iSCSI status"
        ck_daemon $DAEMON_NAME
        status "Detailed session info"
        echo
        $ISCSIADM -m session -P 2
        echo
        ;;
    restart)
        $0 stop
        sleep 2
        $0 start
        ;;
    *)
        echo "usage: $0 {start|stop|status|statusv|restart}"
        ;;
esac
exit 0
