#!/bin/bash

IQN=$1
HOST=$2

if [ -z "${IQN}" ]; then
	echo "usage: $0 TargetIQN [Host]"
        echo ""

	exit
fi

if [ ! -z "${HOST}" ]; then
	iscsiadm -m discovery -t sendtargets -o update -p ${HOST} &> /dev/null
	iscsiadm -m node -T ${IQN} -p ${HOST} -l &> /dev/null
	RETURNCODE=$?
else
	iscsiadm -m node -T ${IQN} -l &> /dev/null
	RETURNCODE=$?
fi

sleep 0.5

MULTIPATH=0
IQNTESTLIST=$(grep -h ${IQN} /sys/class/iscsi_session/*/targetname)
for IQNTEST in ${IQNTESTLIST}; do
	if [ "${IQNTEST}" != "${IQN}" ]; then
		echo "IQN login failed"
		echo ""

		exit
	fi

	MULTIPATH=$((MULTIPATH + 1))
done

SESSIONFOLDERLIST=$(grep -l ${IQN} /sys/class/iscsi_session/*/targetname | xargs realpath)

declare -A ADDRESSES
declare -A BLOCKDEVICES
for SESSIONFOLDER in ${SESSIONFOLDERLIST}; do
	SESSION=$(echo "${SESSIONFOLDER}" | sed 's/.*session\([0-9]*\).*/\1/g')
	HOST=$(echo "${SESSIONFOLDER}" | sed 's/.*host\([0-9]*\).*/\1/g')

	SCSIADDRESS=$(echo "${SESSIONFOLDER}" | sed 's/\(.*\)\/iscsi_session.*/\1/g' | xargs ls -1 | grep "target${HOST}" | sed 's/target//g')
	MAJOR=$(echo "${SCSIADDRESS}" | cut -d ":" -f 2)
	MINOR=$(echo "${SCSIADDRESS}" | cut -d ":" -f 3)

	FULLSCSIADDRESS=$(echo "${SESSIONFOLDER}" | sed "s/\(.*\)\/iscsi_session.*/\1\/target${SCSIADDRESS}/g" | xargs ls -1 | grep ":")
	LUN=$(echo "${FULLSCSIADDRESS}" | cut -d ":" -f 4)

	ADDRESS="[${SESSION}]:scsi$HOST:${MAJOR}:${MINOR}:${LUN}"
	ADDRESSES+="${ADDRESS} "

	BLOCKDEVICE=$(echo "${SESSIONFOLDER}" | sed "s/\(.*\)\/iscsi_session.*/\1\/target${SCSIADDRESS}\/${FULLSCSIADDRESS}\/block/g" | xargs ls -1 | xargs printf "/dev/%s")
	BLOCKDEVICES+="${BLOCKDEVICE} "
done

multipath -r
MULTIPATHDEVICE=$(multipath -l ${BLOCKDEVICES[0]} | grep 'mpath' | sed -e 's/^\([a-z]*\) .*/\1/g')
if [ ! -z "${MULTIPATHDEVICE}" ]; then
	BLOCKDEVICE="/dev/mapper/${MULTIPATHDEVICE}"
fi

MOUNTPOINT="/mnt/iSCSI_${IQN}"

mkdir -p ${MOUNTPOINT}

FILESYSTEM=$(blkid ${BLOCKDEVICE})
if [ -z "${FILESYSTEM}" ]; then
	echo "No Filesystem found, initialize using following command:"
	echo "mkfs.ext4 ${BLOCKDEVICE}"
	echo ""
	echo "And mount afterwards using:"
	echo "mount ${BLOCKDEVICE} ${MOUNTPOINT}"
else
	mount -o discard ${BLOCKDEVICE} ${MOUNTPOINT}
	RETURNCODE=$?

	if [ "${RETURNCODE}" != "0" ]; then
		echo "IQN:        ${IQN}"
		for ADDRESS in ${ADDRESSES}; do
			echo "Address:    ${ADDRESS}"
		done
		echo "Device:     ${BLOCKDEVICE}"
		echo "Mountpoint: ${MOUNTPOINT}"
		echo "Mounting failed"
	else
		echo "IQN:        ${IQN}"
		for ADDRESS in ${ADDRESSES}; do
			echo "Address:    ${ADDRESS}"
		done
		echo "Device:     ${BLOCKDEVICE}"
		echo "Mountpoint: ${MOUNTPOINT}"
		echo "Mounting succeeded"
	fi
fi

echo ""

