#!/bin/bash
PSTORAGE_ISCSI_LIB=/usr/libexec/vstorage-iscsi/vstorage_functions
ROOT=""
TARGET_NAME=""
PORTAL_ADDR=""
USER=""
ARGS="${@}"

DEFAULT_IQN_PREFIX="iqn.2014-06.com.vstorage"

function print_usage {
        exec 1>&2
	echo "Create iSCSI target on shared storage."
        echo "Usage:"
	echo " $CTL_TOOL create -n,--name NAME -a,--address ADDR [-a,--address ADDR]"
	echo "                       [-u,--user USER]"
        echo "Options:"
	echo "  -n,--name NAME          name for new target"
	echo "  -a,--address ADDR       address for new target."
	echo "  -u,--user USER          user name for CHAP authentication."

        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
				;;
			"-u"|"--user")
				[ -z "${2}" ] && print_usage
				USER="${2}"
				shift
				shift
				;;
                        "-n"|"--name")
				[ -z "${2}" ] && print_usage
				TARGET_NAME="${2}"
				shift
				shift
				;;
			"-a"|"--address")
				[ -z "${2}" ] && print_usage
				if [ -z "$PORTAL_ADDR" ] ; then
					PORTAL_ADDR="${2}"
				else
					PORTAL_ADDR="${PORTAL_ADDR} ${2}"
				fi
				shift
				shift
				;;
			"-h"|"--help")
				print_usage
				;;
                        *)
                                echo "Unknown option '${1}'." 1>&2
                                print_usage
                                ;;
                esac
        done

	TARGET_NAME=`echo $TARGET_NAME | sed "s#\s##g" 2>/dev/null`

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

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

	PORTAL_ADDR=`${SCSI_TRANSPORT}_validate_addr "$PORTAL_ADDR"`
	[ -z "$PORTAL_ADDR" ] && print_usage
}

function build_iqn {
	local name="$1"
	local iqn_prefix="$DEFAULT_IQN_PREFIX"
	local checked_name=`echo $name | idn --quiet --profile='iSCSI' --stringprep 2>/dev/null`
	if [ "$checked_name" != "$name" ] ; then
		echo "The specified name '$name' contains prohibited symbols" 1>&2
		exit 2
	fi

	echo "$checked_name" | grep -e "^iqn\." 2>/dev/null
	if [ $? -eq 0 ]; then
		echo "The name must not start from 'iqn.'" 1>&2
		exit 2
	fi

	[ -f "$ISCSI_ROOT/iqn.prefix" ] && iqn_prefix=`head -n 1 "$ISCSI_ROOT/iqn.prefix" 2>/dev/null`

	echo "$iqn_prefix:$checked_name"
	return 0
}

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}

ISCSI_ROOT=`pcs_iscsi_get_root "${ROOT}"`
pcs_iscsi_check_root yes

IQN=`build_iqn $TARGET_NAME`
if [ $? -ne 0 ] ; then
	echo "Unable build iqn for name '$TARGET_NAME'" 1>&2
	exit 1
fi

pcs_iscsi_lock_exec pcs_iscsi_make_target $IQN "$PORTAL_ADDR" "$USER"
RET=$?
if [ $RET -ne 0 ] ; then
	echo "Unable create target $IQN" 1>&2
	exit $RET
fi
echo "IQN: $IQN"
exit 0

