#!/bin/bash
#
# osd_login : This script is part of the autologin feature
#             mandated by the pnfs-objects standard.
# It is called from objlayoutdriver.ko in the kernel.

# Copyright (C) 2012, Sachin Bhamare <sbhamare@panasas.com>
# Copyright (C) 2012, Boaz Harrosh <bharrosh@panasas.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA

umask 022

PATH="/sbin:/usr/sbin:/bin:/usr/bin"

iscsiadm=/sbin/iscsiadm

PARENT_PID=$BASHPID
WATCHDOG_TIMEOUT=15

protocol=""
portal=""
uri=""
osdname=""
systemid=""

usage()
{
	echo "Usage: $0 -u <URI> -o <OSDNAME> -s <SYSTEMID>"
	echo "Options:"
	echo  "-u		target uri e.g. iscsi://<ip>:<port>"
	echo  "-o		osdname of the target OSD"
	echo  "-s		systemid of the target OSD"
}

parse_cmdline()
{
	argc=$#
	if [ $# -lt 3 ]; then
		usage
		exit 1
	fi

	# parse the input arguments
	while getopts "u:o:s:" options; do
	    case $options in
		u ) uri=$OPTARG;;
		o ) osdname=$OPTARG;;
		s ) systemid=$OPTARG;;
		\? ) usage
			exit 1;;
		* )  usage
			exit 1;;
	    esac
	done

	echo "-u : $uri"
	echo "-o : $osdname"
	echo "-s : $systemid"

	protocol=`echo $uri | awk -F ':' '{print $1}'`
	portal=`echo $uri | awk -F '//' '{print $2}'`
}

watchdog()
{
	timeout=$1
	portal=$2

	sleep $timeout
	if kill -9 $PARENT_PID; then
	    echo "watchdog : Timed out (>$timeout seconds) while login into $portal" | logger -t "osd_login"
	fi
	echo "watchdog: exiting .."
	exit 2
}

login_iscsi_osd()
{
	echo "login into: $1"
	if ! $iscsiadm -m discovery -o nonpersistent -t sendtargets -p $1 --login; then
		echo "$iscsiadm -m discovery -t sendtargets -p $1 --login returned error $? !"
		sleep 1;
	fi
}

echo "============= osd_login ========="
echo "progname : $0"
parse_cmdline "$@"
echo "protocol: $protocol"
echo "portal: $portal"

watchdog $WATCHDOG_TIMEOUT $portal &
watchdog_pid=$!

case $protocol in
iscsi)
	login_iscsi_osd $portal |& logger -t "osd_login"
	;;
*)
	echo "Error: protocol $protocol not supported !" | logger -t "osd_login"
	;;
esac

kill -9 $watchdog_pid
exit 0
