#!/bin/bash

# DEFAULTS ########################
QCG_PORT=8443
MAX_ITERATIONS=20
SLEEP_INTERVAL=6
QCG_TEST_JOB=/usr/libexec/grid-monitoring/probes/org.qoscosgrid/broker/nagios-test.xml
QCG_DESC_TYPE=X


export QCG_ENV_PROXY_DURATION_MIN=1

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

# FUNCTIONS ########################
function log
{
    if [ -n "$QCG_VERBOSE" ]
    then
        echo $1
    fi
}

function error_if_not_set
{
    if [ -z $1 ]; then
	echo $2
	exit $3
    fi
}

function error_if_not_exist
{
    if [ ! -f $1 ]; then
	echo "No such file: " $1
	exit $STATUS_UNKNOWN
    fi
}

# ENVIRONMENT #####################################

QCG_PROBE_LOCATION=`dirname $0`


# OPTIONS #######################
while getopts "H:d:p:t:x:n:m:i:l:vVj:" OPTION
do
     case $OPTION in
         H) export QCG_HOST=$OPTARG;;
         d) export QCG_DESC_TYPE=$OPTARG;;
         x) export X509_USER_PROXY=$OPTARG;;
         p) export QCG_PORT=$OPTARG;;
         n) export QCG_ENV_DN=$OPTARG;;
         l) export QCG_ENV_URL=$OPTARG;;
         v) export QCG_VERBOSE=true;;
         j) export QCG_TEST_JOB=$OPTARG;;
         m) export MAX_ITERATIONS=$OPTARG;;
         i) export SLEEP_INTERVAL=$OPTARG;;
         t) ;;
         V) cat $QCG_PROBE_LOCATION/README
            exit 0;;  
         :)
             echo "xx option "$OPTARG" requires argument"
             echo "use: "`basename $0`" -V for help"
             exit $STATUS_UNKNOWN;;
     esac
done


# DEBUG INFO ###################################

log QCG_PROBE_LOCATION=$QCG_PROBE_LOCATION
log QCG_HOST=$QCG_HOST
log QCG_PORT=$QCG_PORT
log QCG_URL=$QCG_ENV_URL
log X509_USER_PROXY=$X509_USER_PROXY
log QCG_DN=$QCG_ENV_DN
log QCG_TEST_JOB=$QCG_TEST_JOB

# CHECKS AND SETTINGS ###############################
if [ -z "$QCG_HOST" ] && [ -z "$QCG_ENV_URL" ]; then
        echo "Either Hostname or URL must be set"
        echo "Use `basename $0` -V for options"
        exit $STATUS_UNKNOWN
fi

error_if_not_set "$QCG_ENV_DN" "distiguished name not set" $STATUS_UNKNOWN
error_if_not_set "$X509_USER_PROXY" "User proxy not set" $STATUS_UNKNOWN
error_if_not_set "$QCG_TEST_JOB" "Test job is not set" $STATUS_UNKNOWN

error_if_not_exist "$X509_USER_PROXY"
error_if_not_exist "$QCG_TEST_JOB"

[[ -z "$QCG_ENV_URL" ]] && export QCG_ENV_URL="httpg://$QCG_HOST:$QCG_PORT/qcg/services/"
log QCG_ENV_URL=$QCG_ENV_URL

# JOB SUBMISSION ###############################
QCG_RESPONSE=`qcg-client submit_job -$QCG_DESC_TYPE $QCG_TEST_JOB`
log SUBMIT_RESPONSE="$QCG_RESPONSE"

JOB_ID=`echo "$QCG_RESPONSE" | grep jobId | cut -d '=' -f 2`
log JOB_ID="$JOB_ID"
error_if_not_set "$JOB_ID" "CRITICAL: Failed to connect to the QCG!" $STATUS_CRITICAL

# STATUS CHECK ##################################
for i in `seq 0 $MAX_ITERATIONS`
do
    QCG_RESPONSE=`qcg-client task_status $JOB_ID`
    log "$QCG_RESPONSE"

    STATUS=`echo "$QCG_RESPONSE" | grep Status: | cut -d ' ' -f 2`
    DESCRIPTION=`echo "$QCG_RESPONSE" | grep Description:`
    
    log "ITERATION=$i STATUS=$STATUS DESCRIPTION=$DESCRIPTION"
    
    case $STATUS in
        FINISHED)
            echo "OK: QCG-BROKER is working properly [Task has FINISHED]"
            exit $STATUS_OK;;
        FAILED)
            break;;
        *)
            sleep $SLEEP_INTERVAL;;
    esac
done

echo WARNING: Task has not been finished! [STATUS="$STATUS" "$DESCRIPTION"]

exit $STATUS_WARNING
