#!/bin/bash

IQN=$1

CheckIQN() {
	IQN=$1

	MULTIPATH=0
	IQNTESTLIST=$(grep -h ${IQN} /sys/class/iscsi_session/*/targetname)
	for IQNTEST in ${IQNTESTLIST}; do
		if [ "${IQNTEST}" != "${IQN}" ]; then
			echo "IQN not found"
			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

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

	MOUNTPOINT=$(grep "${BLOCKDEVICE}" /proc/mounts | head -n 1 | cut -d " " -f 2)

	echo -n "${IQN}: "

	RETURNCODE=0
	if [[ -z "${MOUNTPOINT}" || ! -d "${MOUNTPOINT}" ]]; then
		fsck -f ${BLOCKDEVICE} &> /dev/null
		RETURNCODE=$?
	else
		fsck -nf ${BLOCKDEVICE} &> /dev/null
		RETURNCODE=$?
	fi

	if [ "${RETURNCODE}" -ne "0" ]; then
		echo "ERROR"
		echo "  ${BLOCKDEVICE} contains errors, please check the filesystem"
	else
		echo "OK"
	fi
}

if [[ -z "${IQN}" ]]; then
	IQNLIST=$(cat /sys/class/iscsi_session/*/targetname | sort -u)
	for IQN in ${IQNLIST}; do
		CheckIQN ${IQN}
	done
else
	CheckIQN ${IQN}
fi
