#!/bin/sh
#
# This implementation is incomplete: Discovery mode is not implemented and
# the argument handling doesn't follow currently agreed formats. This is mainly
# because rfc4173 does not say anything about iscsi_initiator but open-iscsi's 
# iscsistart needs this.
#

. /lib/dracut-lib.sh

PATH=$PATH:/sbin:/usr/sbin

if getarg rdnetdebug; then
    exec > /tmp/iscsiroot.$1.$$.out
    exec 2>> /tmp/iscsiroot.$1.$$.out
    set -x
fi

# Huh? Empty $1?
[ -z "$1" ] && exit 1

# Huh? Empty $2?
[ -z "$2" ] && exit 1

# Huh? Empty $3? This isn't really necessary, since NEWROOT isn't 
# used here. But let's be consistent
[ -z "$3" ] && exit 1

# root is in the form root=iscsi:[<servername>]:[<protocol>]:[<port>]:[<LUN>]:<targetname>
netif="$1"
root="$2"

# read static conf settings
for conf in conf/conf.d/*; do
    [ -f ${conf} ] && . ${conf}
done

# If it's not iscsi we don't continue
[ "${root%%:*}" = "iscsi" ] || exit 1

# XXX modprobe crc32c should go in the cmdline parser, but I haven't yet
# figured out a way how to check whether this is built-in or not
modprobe crc32c

if getarg iscsi_firmware ; then
	iscsistart -b
	exit 0
fi

# override conf settings by command line options
arg=$(getarg iscsi_initiator)
[ -n "$arg" ] && iscsi_initiator=$arg
arg=$(getarg iscsi_target_name)
[ -n "$arg" ] && iscsi_target_name=$arg
arg=$(getarg iscsi_target_ip)
[ -n "$arg" ] && iscsi_target_ip=$arg
arg=$(getarg iscsi_target_port)
[ -n "$arg" ] && iscsi_target_port=$arg
arg=$(getarg iscsi_target_group)
[ -n "$arg" ] && iscsi_target_group=$arg
arg=$(getarg iscsi_username)
[ -n "$arg" ] && iscsi_username=$arg
arg=$(getarg iscsi_password)
[ -n "$arg" ] && iscsi_password=$arg
arg=$(getarg iscsi_in_username)
[ -n "$arg" ] && iscsi_in_username=$arg
arg=$(getarg iscsi_in_password)
[ -n "$arg" ] && iscsi_in_password=$arg

if [ $root = ${root#iscsi:} ]; then
	iroot=$(getarg iscsiroot)
else
	iroot=${root#iscsi:}
fi

# override conf/commandline options by dhcp root_path
# FIXME this assumes that all values have been provided
OLDIFS="$IFS"
IFS=:
set $iroot
iscsi_target_ip=$1; shift
iscsi_protocol=$1; shift # ignored
iscsi_target_port=$1; shift
iscsi_lun=$1; shift
iscsi_target_name=$*
IFS="$OLDIFS"

# XXX is this needed?
getarg ro && iscsirw=ro
getarg rw && iscsirw=rw
fsopts=${fsopts+$fsopts,}${iscsirw}

if [ -z $iscsi_initiator ]; then
    # XXX Where are these from?
    [ -f /etc/initiatorname.iscsi ] && . /etc/initiatorname.iscsi
    [ -f /etc/iscsi/initiatorname.iscsi ] && . /etc/iscsi/initiatorname.iscsi
    iscsi_initiator=$InitiatorName

    # XXX rfc3720 says 'SCSI Initiator Name: The iSCSI Initiator Name specifies
    # the worldwide unique name of the initiator.' Could we use hostname/ip
    # if missing?
fi

if [ -z $iscsi_target_port ]; then
    iscsi_target_port=3260
fi

if [ -z $iscsi_target_group ]; then
    iscsi_target_group=1
fi

if [ -z $iscsi_initiator ]; then
    # XXX is this correct?
    iscsi_initiator=$(iscsi-iname)
fi

if [ -z $iscsi_lun ]; then
    iscsi_lun=0
fi

echo "InitiatorName='$iscsi_initiator'" > /dev/.initiatorname.iscsi

# FIXME $iscsi_protocol??

echo "iscsi_lun=$iscsi_lun . /bin/mount-lun.sh " > /mount/iscsi.sh

iscsistart -i $iscsi_initiator -t $iscsi_target_name	\
    -g $iscsi_target_group -a $iscsi_target_ip	\
    -p $iscsi_target_port \
    ${iscsi_username+-u $iscsi_username} \
    ${iscsi_password+-w $iscsi_password} \
    ${iscsi_in_username+-U $iscsi_in_username} \
    ${iscsi_in_password+-W $iscsi_in_password}

# now we have a root filesystem somewhere in /dev/sda*
# let the normal block handler handle root=
exit 0
