#!/bin/bash
#set -x
#LANG=C

###########################################
# Copyright (c) 2009 SIOS Technology, Inc. 
###########################################
#
# Title:    quickCheck template
#
# Usage:    quickCheck -t tagname -i id
#
#           where:
#           "tagname" is the resource tag name
#           "id" is the resource ID
#
###########################################
# Change History:
#
# Date        Init Details
# ----------- ---- -------
# 09/11/2009  mkt  Initial code.


############################################
#  یΏۃp[^ݒ   ([U`)   #
############################################
APP=""                    # یΏۃAvP[V
VHOSTNAME=""              # z IP AhXɑΉzXg

APP_START=""              # NR}h
APP_START_ARGS=""         # NR}ḧ

APP_STOP=""               # ~R}h
APP_STOP_ARGS=""          # ~R}ḧ

APP_FORCE_STOP=""         # ~R}h
APP_FORCE_STOP_ARGS=""    # ~R}ḧ

APP_CHECK[0]=""           # mFR}h1
APP_CHECK_ARGS[0]=""      # LR}ḧ

# APP_CHECK[1]=""         # mFR}h2
# APP_CHECK_ARGS[1]=""    # LR}ḧ


##########################
# p[^       #
##########################
TAG=$APP
TTAG=
TIMEOUT=
STATUS=
DEFAULT_TIMEOUT=12   # XNvg^CAEgl  22 - 10 b
START_SUCCESS_CODE=0 # mFR}h̋NԂ̖߂l
STOP_SUCCESS_CODE=0  # mFR}h̒~Ԃ̖߂l
CHECK_RETRY_CODE=12  # mFR}h̃gCKvȖ߂l
DEBUG=
lklog="/opt/LifeKeeper/out/log"


##################
# ^O擾     #
##################
while [ $# != 0 ]
do
        case "$1" in
        -t*)
                TAG="$2"
                shift
                ;;
        esac
        shift
done


####################
# ݒt@CKp #
####################
DEFAULT_FILE="/etc/default/LifeKeeper"
if [ -z "$LKROOT" ]
then
        PATH=
        . $DEFAULT_FILE
        LKROOT=${LKROOT:=/opt/LifeKeeper}
        PATH=${PATH:=$LKROOT/bin:/usr/bin:/usr/sbin:/bin:/sbin}
        export LKROOT PATH
fi

# fobO[hݒ
DEBUG=$(eval echo '$'$TAG"_DEBUG")
if [ -n "$DEBUG" ]; then
        echo "$TAG : DEBUG MODE ON" >> $lklog
        set -x
fi

# ^CAEgݒ
TTAG=$(echo $TAG | sed "s/[^A-Za-z0-9_]/_/g")
TTAG_TIMEOUT=$(eval echo '$'$TTAG'_TIMEOUT')
if [ -z "$TTAG_TIMEOUT" ]; then
        TIMEOUT=$DEFAULT_TIMEOUT
else
        TIMEOUT=$(( $TTAG_TIMEOUT - 10 )) # Generic ARK ̃^CAEg
                                         # XNvg`̃^C
                                         # AEg͏Kv܂B
        # echo "$TAG : Timeout set to $TIMEOUT sec." >> $lklog
fi


############
# Function #
############

# N
APP_start()
{
        echo "$(date +'[%Y/%m/%d %H:%M:%S]') : $TAG starting on $HOSTNAME"  >> $lklog
        $APP_START $APP_START_ARGS >> $lklog 2>&1 &
        wait $!
}

# ~
APP_stop()
{
        echo "$(date +'[%Y/%m/%d %H:%M:%S]') : $TAG stopping on $HOSTNAME"  >> $lklog
        $APP_STOP $APP_STOP_ARGS >> $lklog 2>&1 &
        wait $!
}

# mF
# : `FbNƈl
# ߂l: ,ƓlBs,ĎR}h̖߂lB
APP_check()
{
        local S_CODE=$1
        local RET=1
        for (( CNT=0 ; $CNT < ${#APP_CHECK[@]} ; CNT=$CNT+1 )) ;
                do
                if [ -x "${APP_CHECK[$CNT]}" ]; then
                        ${APP_CHECK[$CNT]} ${APP_CHECK_ARGS[$CNT]}  >> /dev/null 2>&1 &
                        wait $!
                        RET=$?
                else
                        RET=255 # R}hȂ΃G[
                fi
                
                case "$RET" in
                        $S_CODE)  ;; # Ɏ̃`FbN֐i
                        *)  return $RET  ;; # G[
                esac
        done
        
        return $S_CODE;
}

# ~
APP_force_stop()
{
        if [ -n "$APP_FORCE_STOP" ]; then
                $APP_FORCE_STOP $APP_FORCE_STOP_ARGS >> $lklog 2>&1 &
                wait $!
        fi
}

# ^CAEgKp
# : XNvg̃^CAEgb
setalarm()
{
        (
                sleep $1; 
                (ps $$ | grep $0) && kill -INT $$; 
                (ps $$ | grep $0) && sleep $1; 
                (ps $$ | grep $0) && kill -KILL $$
        ) > /dev/null 2>&1 &
}

# ^CAEg㏈
handlealarm()
{
        echo "$(date +'[%Y/%m/%d %H:%M:%S]') : $TAG Script was hung. Forcibly terminating."  >> $lklog
        
        # g̒~ (SIGTERM -> SIGKILL)
        if [ "$(ps $$ > /dev/null 2>&1; echo $?)" -ne 1 ]
        then
                kill -TERM $$
                sleep 5
                if [ "$(ps $$ > /dev/null 2>&1; echo $?)" -ne 1 ]
                then
                     echo "$(date +'[%Y/%m/%d %H:%M:%S]') : $TAG Script was still hung. sending KILL signal"  >> $lklog
                     kill -KILL $$
                fi
        fi
        exit 1
}


#####################
# Main (quickCheck) #
#####################

# Xe[^X`FbN
STAT=$(/opt/LifeKeeper/bin/ins_list -t $TAG | cut -f7 $'-d\001')
if [ $STAT != ISP ]
then
        echo "resource $TAG is not ISP status" >> $lklog
        exit 0
fi


# Set timeout
trap 'handlealarm' INT
setalarm $TIMEOUT


# NmF܂̓^CAEgŃ[vI
while true
do
        APP_check $START_SUCCESS_CODE
        STATUS=$?
        
        case "$STATUS" in
                $START_SUCCESS_CODE) # Ď O.K.
                    exit 0 ;;
                $CHECK_RETRY_CODE) # gC
                    # ҂
                    sleep 5
                    continue ;;
                *)  # Ďs
                    echo "$(date +'[%Y/%m/%d %H:%M:%S]') "$TAG" : ERROR: quickCheck FAILED ret="$STATUS"" >> $lklog
                    # Go to local recovery
                    exit 1 ;;
        esac
done

exit 1

