#!/bin/bash
#
# sccl_stop_package stoppt eine Resource im Script-Cluster
#
# Aufruf:
#
# sccl_stop_package [--simulate|--force|--clear|--tstkill] [--clusterstop] [-p <stoppar>] [-w <secs>] <resource> [<pidsig>]
#
# Die Resource <resource> wird gestopt, nachdem alle Abhaengigkeiten
# gestoppt sind.
#
########################################################################################
#
. $(dirname $0)/globals.settings
#
unset PKGSTOP FORCE CLUSTERSTOP CALLPARS SIMULATE WAITSTOP
while getopts p:Pw:-: op; do
  case "$op" in
   p) CALLPARS="$CALLPARS -p $OPTARG";;
   P) PKGSTOP=1;;
   w) WAITSTOP="$OPTARG";;
   -) case "$OPTARG" in
       force)   FORCE='--force';;
       clear)   FORCE='--clear';;
       tstkill) FORCE='--tstkill';;
       simulate) SIMULATE='--simulate';;
       clusterstop) CLUSTERSTOP='--clusterstop';;
       *)       echo "usage: $MYPRG [--simulate|--force|--clear|--tstkill] [--clusterstop] [-p <stoppar>] [-w <secs>] <resource> [<pidsig>]"
                exit 1;;
     esac;;
   *) echo "usage: $MYPRG [--simulate|--force|--clear|--tstkill] [--clusterstop] [-p <stoppar>] [-w <secs>] <resource> [<pidsig>]"
      exit 1;;
  esac
done
shift $(( $OPTIND - 1))
#
if [[ $# -lt 1 ]]; then
  echo "usage: $MYPRG [--simulate|--force|--clear|--tstkill] [--clusterstop] [-p <stoppar>] [-w <secs>] <resource> [<pidsig>]"
  exit 1
fi
#
if [[ -f "$LOCKDIR/$1$LOCKEXTENSION" ]]; then
  PIDSIG=`grep "^$PKGPIDSIGHEADER" "$LOCKDIR/$1$LOCKEXTENSION" | cut -f 2 -d:`
  RES=`grep "^$PKGRESHEADER" "$LOCKDIR/$1$LOCKEXTENSION" | cut -f 2- -d:`
else
  if [[ -z "$FORCE" ]]; then
    echo "Das Paket $1 laeuft nicht auf $THISHOSTNAME."
    exit 0
  fi
fi
#
UPIDSIG=${2:-$PIDSIG}
#
if [[ -z "$RES" ]]; then
  if [[ ! -f $RESOURCES ]]; then
    exit 1
  fi
  S=`grep '^'$1'[[:blank:]]' $RESOURCES`
  if [[ -z "$S" ]]; then
    echo "$1 nicht in $RESOURCES gefunden."
    exit 1
  fi
  eval set $S
else
  eval set $RES
fi
#
PKGNAME=$1
LONGNAME=$2
shift 2
if [[ "$1" = "MULTI" || "$1" = "SWITCH" ]]; then
  shift
elif [[ "$1" = "EXECUTE" ]]; then
  echo "$PKGNAME ($LONGNAME) ist ein EXECUTE Paket und kann nicht gestoppt werden."
  exit 0
fi
#
if [[ -z "$SIMULATE" ]]; then
  #
  SWITCHDAT=/tmp/scclswdt.$PIDSIG
  rm -f $SWITCHDAT
  #
  if [[ -n "$WAITSTOP" ]]; then
    Z=0
    while [[ $Z -lt $WAITSTOP ]]; do
      set_progress $PKGNAME 'stopping'
      SR=$?
      if [[ $SR = 0 ]]; then
        break
      elif [[ $SR != 1 && $SR != 4 ]]; then
        exit 4
      fi
      Z=$(( $Z + 1 ))
      sleep 1
      if [[ $SR = 4 && ! -f "$LOCKDIR/$PKGNAME$LOCKEXTENSION" ]]; then
        exit 0
      fi
    done
    if [[ $SR != 0 ]]; then
      exit 4
    fi
  else
    set_progress $PKGNAME 'stopping'
    SR=$?
    if [[ $SR -ne 0 ]]; then
      [[ $SR -eq 4 ]] && echo "Das Paket wird schon gestoppt"
      exit 4
    fi
  fi
  #
  if last_lock $PKGNAME $UPIDSIG || [[ -n "$PKGSTOP" ]]; then
    #
    echo "$PKGNAME ($LONGNAME) wird gestoppt."
    #
    ./sccl_stop_res_rev $FORCE $NOSWITCH $CLUSTERSTOP $CALLPARS $PKGNAME "$PIDSIG" "$@"
    RET=$?
    if [[ $RET = 0 || $RET = $LOCKNOTFOUND ]]; then
      rm -f "$LOCKDIR/$PKGNAME$LOCKEXTENSION"
      # Wenn Pakete gestartet werden muessen (!PKG:<name>:SWITCH), dann
      # jetzt
      if [[ -s $SWITCHDAT ]]; then
        while read pkg initignore; do
          ./sccl_start_bg -i "$initignore" $pkg
        done <$SWITCHDAT
        rm -f $SWITCHDAT
      fi
      del_progress $PKGNAME
      exit 0
    elif [[ $RET = 2 ]]; then
      echo "$PKGNAME ($LONGNAME) darf nicht gestoppt werden."
      del_progress $PKGNAME
      exit 1
    elif [[ $RET = 3 ]]; then
      echo "$PKGNAME ($LONGNAME) darf nicht gestoppt werden und läuft nur teilweise."
      update_progress $PKGNAME 'stopping' 'failed'
      exit 1
    else
      echo "$PKGNAME ($LONGNAME) konnte nicht gestoppt werden."
      update_progress $PKGNAME 'stopping' 'failed'
      exit 1
    fi
  else
    reduce_lockdat $PKGNAME $UPIDSIG
    del_progress $PKGNAME
    exit 2
  fi
  del_progress $PKGNAME
  #
else
  if last_lock $PKGNAME $UPIDSIG || [[ -n "$PKGSTOP" ]]; then
    #
    echo "$PKGNAME ($LONGNAME) Stopp wird simuliert."
    #
    ./sccl_stop_res_rev_simulate $CALLPARS $PKGNAME "$PIDSIG" "$@"
    RET=$?
    if [[ $RET = 0 || $RET = $LOCKNOTFOUND ]]; then
      exit 0
    elif [[ $RET = 2 ]]; then
      echo "$PKGNAME ($LONGNAME) darf nicht gestoppt werden."
      exit 1
    elif [[ $RET = 3 ]]; then
      echo "$PKGNAME ($LONGNAME) darf nicht gestoppt werden und läuft nur teilweise."
      exit 1
    else
      echo "$PKGNAME ($LONGNAME) konnte nicht gestoppt werden."
      exit 1
    fi
  fi
fi
