#!/bin/bash
#
# purpose:    watching over sm_engine
#
# usage:      start from $APL/wd/bin/shepherd, 
#             does not suppouse to be start manually
#             runs from appliction [apl] user
# 
# logic:    
#   0.  exit if SM disabled
#   1.  check /var$APL/wd/status
#   2.  start sm_engine if KEEP = run
#   3.  stop  sm_engine if KEEP = stop
#   4.  if KEEP = run check PID directory for old files
#       kill process if pidage > engine TIMEOUT
#   
# CONF -----------------------------------
APL=/opt/sarch
KEEP=$APL/var/wd/keep
LOG=$APL/var/log/sm/sm_sheoherd.log
PIDPATH=$APL/var/sm/pids
ENGINE=$APL/sm/bin/sm_engine
ENGINEPID=$PIDPATH/sm_engine.pid
CACHECTL="sudo $APL/cache/bin/cachectl"
ENABLE_CACHE="$APL/cache/etc/enable"
SLEEP=3
TIMEOUT=60

Log() {
 echo `date +'%Y%m%d %H:%M:%S'`  $1 >> $LOG
}

#-----------------------------------------------------------------------
# return 0 if sm_engine is running
#-----------------------------------------------------------------------
running_ () {
  [ -f  $ENGINEPID ]          || return 1
  pid=`cat $ENGINEPID`
  [ -z "$pid"    ]            && return 2
  [ "$pid" -gt 1 ]            || return 2
# proc=`ps -p $pid -o comm=`              # it does not work with OS X
# [ "$proc" != 'sm_engine' ]  && return 3 #
  ps -p $pid -o command= | grep -q sm_engine
  [ $? != 0 ] && return 3
  return 0
}

running () {              # repeat if fails 
  running_ && return 0
  sleep 1                 # recheck after 1 sec
  running_
}

cache_start () {          # switch on cache
  [ -f "$ENABLE_CACHE" ] || return 0
  Log "activating cache"
  $CACHECTL start
  df /vasm/cache 2>/dev/null | egrep -sq "cache$"
  [ $? != 0 ] && {
     Log "ERR: Cache is not activated"
     return 1
  }
  return 0 
}

cache_stop () {          #switch on cache
  Log "de-activating cache"
  $CACHECTL stop
}

#-----------------------------------------------------------------------
# stop SM engine
#-----------------------------------------------------------------------
Kill_SM () {
 SIG=$1
 if [ "$SIG" == '-9' ]; then
    ps -au apl -o pid,user,args | grep '/opt/sarch/sm/bin/sm_' | grep apl | 
      grep -v sm_shepherd |  cut -c 1-6 | xargs kill -9 >/dev/null 2>&1
 else 
    ps  -au apl -o pid,user,command | grep $ENGINE | grep -v grep | cut -c 1-6 | xargs kill >/dev/null 2>&1
 fi
}

#-----------------------------------------------------------------------
# usage: Action start|stop
#-----------------------------------------------------------------------
Action () {
  Log "Action: $1"
  case "$1" in
    start)
           Kill_SM
           cache_start
           sleep 2
           Log "starting  $ENGINE"
           $ENGINE >/dev/null 2>&1 &
           sleep 7
           ;;
     stop)
           Kill_SM
           sleep 5
           Kill_SM -9
           sleep 2
           cache_stop
           ;;
  esac
}

Get_keep () {
   keep=stop
   [ -f  $KEEP ] &&  keep=`cat $KEEP`
   case "$keep" in
     run) echo run  ;;
       *) echo stop ;;
   esac
}

# MAIN ------------------------------------------------------------------
ps -ef | grep -v grep | grep -v " $$ "| grep -q $0
[ $? == 0 ]     && {
  Log "$? :Concurent run is detected. Exiting.."
  exit 2
}


Log 'Shepherd shepherds the sm_engine'

while [ 1 ]; do
  keep=`Get_keep`;
  if [ $keep = run ]; then
     if ! running; then    
       Action start
     fi
  fi
  if [ $keep = stop ]; then
     if running; then
       Action stop
     fi
  fi 
  sleep $SLEEP
done;

