#!/bin/sh
PSTORAGE_ISCSI_LIB=/usr/libexec/pstorage-iscsi/iscsi_functions
ROOT=""
TARGET_NAME=""
IP_ADDR=""
ARGS="${@}"

function print_usage {
        exec 1>&2
	echo "Create iSCSI target on shared storage."
        echo "Usage:"
	echo " pstorage-iscsi create -n,--name NAME -a,--address ADDR [-a,--address ADDR]"
	echo "                       [-r,--root ROOT_DIR]"
        echo "Options:"
	echo "  -r,--root ROOT_DIR      set ISCSI_ROOT instead of use"
	echo "                          /etc/pstorage/iscsi/config (optional)"
	echo "  -n,--name NAME          name for new target"
	echo "  -a,--address ADDR       address for new target."

        echo " "
        exit 1
}

function parse_args {

	[ ${#} -eq 1 ] && print_usage

        while [ "${#}" -gt 0 ]; do
                case "${1}" in
			"-r"|"--root")
				[ -z "${2}" ] && print_usage
				ROOT="${2}"
				shift
				shift
				;;
                        "-n"|"--name")
				[ -z "${2}" ] && print_usage
				TARGET_NAME="${2}"
				shift
				shift
				;;
			"-a"|"--address")
				[ -z "${2}" ] && print_usage
				if [ -z "$IP_ADDR" ] ; then
					IP_ADDR="${2}"
				else
					IP_ADDR="${IP_ADDR} ${2}"
				fi
				shift
				shift
				;;
			"-h"|"--help")
				print_usage
				;;
                        *)
                                echo "Unknown option '${1}'." 1>&2
                                print_usage
                                ;;
                esac
        done

	if [ -z "$TARGET_NAME" ] ; then
		echo "Target name (-n,--name) must be specified." 1>&2
		print_usage
	fi

	if [ -z "$IP_ADDR" ] ; then
		echo "At least one address (-a,--address) must be specified." 1>&2
		print_usage
	fi

	tmp_addr="$IP_ADDR"
	IP_ADDR=""
	for addr in $tmp_addr; do
	        # validate addresses
		addr=`echo $addr | cut -d '/' -f 1`
        	/bin/ipcalc -c $addr
	        if [ $? -ne 0 ] ; then
        	        echo "Argument of -a,--address '$addr' is wrong." 1>&2
                	print_usage
	        fi
		/bin/ipcalc -c -6 $addr >/dev/null 2>&1
		if [ $? -ne 0 ] ; then
			/bin/ipcalc -c -4 $addr >/dev/null 2>&1
			if [ $? -ne 0 ] ; then
				echo "Argument of -a,--address '$addr' is wrong." 1>&2
				print_usage
			fi
			IP_ADDR="$addr/32 $IP_ADDR"
		else
			IP_ADDR="$addr/64 $IP_ADDR"
		fi
	done
}

function build_iqn {
	local name="$1"
	/bin/date +iqn.%Y-%m.com.pstorage:$name
}

if [ ! -x $PSTORAGE_ISCSI_LIB ] ; then
	echo "Unable find executable $PSTORAGE_ISCSI_LIB" 1>&2
	exit 1
fi

source $PSTORAGE_ISCSI_LIB
[ -f $ISCSI_ETC/config ] && source $ISCSI_ETC/config

parse_args ${ARGS}

[ -n "${ROOT}" ] && ISCSI_ROOT="${ROOT}"

pcs_iscsi_check_root yes

IQN=`build_iqn $TARGET_NAME`
if [ -z "$IQN" ] ; then
	echo "Unable build iqn for name '$TARGET_NAME'" 1>&2
	exit 1
fi
pcs_iscsi_lock_exec pcs_iscsi_make_target $IQN "$IP_ADDR"
RET=$?
if [ $RET -ne 0 ] ; then
	echo "Unable create target $IQN" 1>&2
	exit $RET
fi
echo "IQN: $IQN"
exit 0

