#!/bin/sh

STATUS_OK=0
STATUS_WARNING=1
STATUS_CRITICAL=2
STATUS_UNKNOWN=3

#defaults
QCG_NTF_SERVICE_URL=localhost:19001
TIMEOUT="100"
NUM_INVOCATIONS="6"
WAIT_ON_NOTIFY_TIME="1"

PLUGIN_HOME=/usr/libexec/grid-monitoring/probes/org.qoscosgrid/notification
QCG_NTF_HOME=/usr
QCG_CORE_HOME=/usr
QCG_NTF_MODULES=$QCG_NTF_HOME/lib64/qcg-ntf/modules
QCG_CORE_MODULES=$QCG_CORE_HOME/lib64/qcg-core/modules
QCG_NTF_CONFIG_IN=$PLUGIN_HOME/qcg-ntf-client-conf.xml.in

QCG_NTF_MSG_CONTENT=nagios_test_`date +%x-%X`_$RANDOM

usage() {
	echo usage: `basename $0`' (-l url | -H hostname -p port) -t timeout [-T temp_dir ] [-v 0-3]'
}

cleanup() {
	if [ x != x$SUB_ID ]
	then
    		exec 2>&1 && $QCG_NTF_CLIENT -d -z $QCG_NTF_CONFIG -U "id=$SUB_ID" #try to remove subscription
	fi
	if [ x != x$PULL_ADDR ]
	then
    		exec 2>&1 && $QCG_NTF_CLIENT -d -z $QCG_NTF_CONFIG -u $PULL_ADDR -T # try to remove pullpoint
	fi
	[ -f $QCG_NTF_CONFIG ] && rm $QCG_NTF_CONFIG
}

display_fault() {
    FAULT_CODE=`echo "$QCG_OUTPUT" | grep 'FaultCode' | cut -f 10- -d ' '`
    FAULT_STRING=`echo "$QCG_OUTPUT" | grep 'FaultString' | cut -f 10- -d ' '`
    FAULT_DETAIL=`echo "$QCG_OUTPUT" | grep 'FaultDetail' | cut -f 10- -d ' '`
    echo $FAULT_CODE
    echo $FAULT_STRING
    echo $FAULT_DETAIL
}

check_timeout() {
    ELAPSED_TIME=$((`date +%s` - $START_TIME))
    if [ $ELAPSED_TIME -ge $TIMEOUT ] 
    then
        echo QCG STATUS: Test has not been finished after $ELAPSED_TIME seconds!
	    cleanup
        exit $STATUS_WARNING
    fi
}

while getopts ":l:H:t:p:T:v:h" OPTION
do
    case $OPTION in
        l)  
    	    QCG_NTF_URL=$OPTARG
    	    ;;
        H)
            QCG_NTF_HOST=$OPTARG
            ;;
        t)
            TIMEOUT=$OPTARG
            ;;
        p)
            QCG_NTF_PORT=$OPTARG
            ;;
        T)
            TMPDIR=$OPTARG
            ;;
	v)
	    if [ $OPTARG != "0" ]
	    then
	    	QCG_DEBUG=$OPTARG
	    fi
	    ;;
	h)
	    usage;
            exit $STATUS_UNKNOWN
            ;;
        :)
            echo ERROR: Option: "$OPTARG" requires an argument
	    usage;
	    exit $STATUS_UNKNOWN
	    ;;
        ?)
            echo ERROR: Illegal option: "$OPTARG"
	    usage;
	    exit $STATUS_UNKNOWN
	    ;;  
    esac
done


if [ -n "$QCG_NTF_URL" ]
then 
	QCG_NTF_SERVICE_URL=$QCG_NTF_URL
elif [ -n "$QCG_NTF_HOST" ] && [ -n "$QCG_NTF_PORT" ]
then
	QCG_NTF_SERVICE_URL="http://${QCG_NTF_HOST}:${QCG_NTF_PORT}/"
else 
    	echo "Error: Required options not specified (you must use -l or alternatively -H with -p)"
    	usage
    	exit $STATUS_UNKNOWN
fi

TIMEOUT_METHOD=$(($TIMEOUT/$NUM_INVOCATIONS + 1))
START_TIME=`date +%s`
ELAPSED_TIME=0

QCG_NTF_CONFIG=`mktemp -t qcg-ntf-client.XXXX`

sed -e 's|_URL_|'$QCG_NTF_SERVICE_URL'|' \
    -e 's|_TIMEOUT_|'$TIMEOUT_METHOD'|' \
    -e 's|_QCG_NTF_MODULES_|'$QCG_NTF_MODULES'|' \
    -e 's|_QCG_CORE_MODULES_|'$QCG_CORE_MODULES'|' \
 $QCG_NTF_CONFIG_IN > $QCG_NTF_CONFIG

QCG_NTF_CLIENT="$QCG_NTF_HOME/bin/qcg-ntf-client"

if [ ! -x $QCG_NTF_CLIENT ]
then
    echo QCG NTF STATUS: QCG Ntf Client not found!
    rm $QCG_NTF_CONFIG
    exit $STATUS_UNKNOWN
fi

if [ -n "$QCG_DEBUG" ]
then
    echo QCG_NTF_SERVICE_URL=$QCG_NTF_SERVICE_URL
fi

# 1.
#########################
### CREATE PULLPOINT ####i
#########################

QCG_OUTPUT=`exec 2>&1 && $QCG_NTF_CLIENT -d -z $QCG_NTF_CONFIG -C`
PULL_ADDR=`echo "$QCG_OUTPUT" | grep pullAddr | cut -d \' -f 2`

if [ -n "$QCG_DEBUG" ]
then
    echo PULL_ADDR=$PULL_ADDR
fi

if [  "$QCG_DEBUG" == "3" ]
then
    echo "$QCG_OUTPUT"
fi

if [ -z $PULL_ADDR ]
then
    echo QCG STATUS: Failed to create pullpoint:
    display_fault
    cleanup
    exit $STATUS_CRITICAL
fi

# 2.
#########################
####### SUBSCRIBE #######
#########################

check_timeout

QCG_OUTPUT=`exec 2>&1 && $QCG_NTF_CLIENT -d -z $QCG_NTF_CONFIG -S "cons=$PULL_ADDR top=http://schemas.qoscosgrid.org/comp/2011/04/notification/topic;//*;Full mc=boolean(//smc:ActivityState/smc:ActivityId=\"$QCG_NTF_MSG_CONTENT\");smc=http://schemas.qoscosgrid.org/comp/2011/04/notification/message"`
SUB_ID=`echo "$QCG_OUTPUT" | grep subRef | cut -d \' -f 2`

if [ -n "$QCG_DEBUG" ]
then
    echo SUB_ID=$SUB_ID
fi

if [  "$QCG_DEBUG" == "3" ]
then
    echo "$QCG_OUTPUT"
fi

if [ -z $SUB_ID ]
then
    echo QCG STATUS: Failed to create subscription:
    display_fault
    cleanup
    exit $STATUS_CRITICAL
fi

# 3.
#########################
######## NOTIFY #########
#########################

check_timeout

QCG_OUTPUT=`exec 2>&1 && $QCG_NTF_CLIENT -d -z $QCG_NTF_CONFIG -N "top=http://schemas.qoscosgrid.org/comp/2011/04/notification/topic;ActivityState/TerminalState/Finished;Full msg=<smcm:ActivityState xmlns:smcm=\"http://schemas.qoscosgrid.org/comp/2011/04/notification/message\"><smcm:ActivityId>$QCG_NTF_MSG_CONTENT</smcm:ActivityId><smcm:Status>Finished</smcm:Status><smcm:ExitStatus>0</smcm:ExitStatus></smcm:ActivityState>"`

if [  "$QCG_DEBUG" == "3" ]
then
    echo "$QCG_OUTPUT"
fi

if [ -n "`echo "$QCG_OUTPUT" | grep 'FaultCode'`" ]
then
    echo QCG STATUS: Failed to send Notify:
    display_fault
    cleanup
    exit $STATUS_CRITICAL
fi

# 4.
#########################
###### GETMESSAGES ######
#########################


while true # we may need to wait for processing of asynchronous notify 
do
	check_timeout
	sleep $WAIT_ON_NOTIFY_TIME
	QCG_OUTPUT=`exec 2>&1 && $QCG_NTF_CLIENT -d -z $QCG_NTF_CONFIG -u $PULL_ADDR -M "max=1"`
	MSG=`echo "$QCG_OUTPUT" | grep "$QCG_NTF_MSG_CONTENT" | cut -d \' -f 2`

	if [ -n "$QCG_DEBUG" ]
	then
		echo MSG=$MSG
	fi

	if [  "$QCG_DEBUG" == "3" ]
	then
		echo "$QCG_OUTPUT"
	fi

	if [ -z "$MSG" ]
	then
		FAULT_CODE=`echo "$QCG_OUTPUT" | grep 'FaultCode' | cut -f 10- -d ' '`
		if [ -z "$FAULT_CODE" ]
		then 
			continue
		fi
		echo QCG STATUS: Failed to get messages:
    		display_fault
		cleanup
		exit $STATUS_CRITICAL
	else
		break
	fi
	
done
# 5.
#########################
###### UNSUBSCRIBE ######
#########################

check_timeout

QCG_OUTPUT=`exec 2>&1 && $QCG_NTF_CLIENT -d -z $QCG_NTF_CONFIG -U "id=$SUB_ID"`

if [  "$QCG_DEBUG" == "3" ]
then
    echo "$QCG_OUTPUT"
fi

if [ -z "`echo "$QCG_OUTPUT" | grep 'Unsubscribed'`" ]
then
    echo QCG STATUS: Failed to unsubscribe:
    display_fault
    cleanup
    exit $STATUS_CRITICAL
fi
SUB_ID=

# 6.
#########################
### DESTROYPULLPOINT ####
#########################

check_timeout

QCG_OUTPUT=`exec 2>&1 && $QCG_NTF_CLIENT -d -z $QCG_NTF_CONFIG -u $PULL_ADDR -T`

if [  "$QCG_DEBUG" == "3" ]
then
    echo "$QCG_OUTPUT"
fi

if [ -z "`echo "$QCG_OUTPUT" | grep 'PullPoint destroyed'`" ]
then
    echo QCG STATUS: Failed to destroy pullpoint:
    display_fault
    cleanup
    exit $STATUS_CRITICAL
fi
PULL_ADDR=

cleanup

ELAPSED_TIME=$((`date +%s` - $START_TIME))
echo QCG Notification test finished successfully after $ELAPSED_TIME seconds.
exit $STATUS_OK
