#!/bin/bash
#
# sccl_stop_resource_simulate stoppt die Resource, die angegeben ist
#
# Aufruf:
#
# sccl_stop_resource_simulate [--force|--clear|--tstkill] [--clusterstop] [-p <stoppars>] <resource> <kurzname> <pidsig>
#
# Die Resource <resource> wird gestoppt
# Aufbau des Parameters <resource> siehe Datei resourcen
#
# Exitcodes: 0: OK
#            1: Fehler
#            2: MINPKGS oder CSRV verletzt
#           99: LOCKNOTFOUND
########################################################################################
#
. $(dirname $0)/globals.settings
#
TSTKILL=0
FORCEFLAG=0
CLEARFLAG=0
STOPFLAG=0
#
unset FORCE CLEAR CLUSTERSTOP STOPPARS
#
while getopts p:-:? op; do
  case "$op" in
    p) STOPPARS="$STOPPARS $OPTARG";;
    -) case "$OPTARG" in
          force)   FORCEFLAG=1
                   FORCE='--force';;
          clear)   FORCEFLAG=1
                   FORCE='--force'
                   CLEAR='--clear'
                   CLEARFLAG=1;;
          tstkill) FORCEFLAG=1
                   FORCE='--force'
                   CLEAR='--clear'
                   TSTKILL=1
                   CLEARFLAG=1;;
          clusterstop) STOPFLAG=1
                   CLUSTERSTOP='--clusterstop';;
          *)       echo "usage: $MYPRG [--force|--clear|--tstkill] [--clusterstop] [-p <stoppars>] <resource> <kurzname> <pidsig>"
                   exit 1;;
       esac;;
    ?) echo "usage: $MYPRG [--force|--clear|--tstkill] [--clusterstop] [-p <stoppars>] <resource> <kurzname> <pidsig>";;
  esac
done
shift $(( $OPTIND - 1))
#
if [[ $# -ne 3 ]]; then
  echo "usage: $MYPRG <resource> <kurzname> <pidsig>"
  exit 1
fi
#
RES=$1
PKGNAME=$2
PIDSIG=$3
#
SWITCHDAT=/tmp/scclswdt.$PIDSIG
#
A=${1// /\\ }
eval set ${A//:/ }
#
RESTYP=$1
shift
#
case $RESTYP in
########################################################################################
# IP-Adresse herunterfahren
#
  IP)
    if [[ $# -lt 3 ]]; then
      echo "Falsches Format: $RESTYP"
      exit 1
    fi
    LOCK=IP_$2
    echo "IP Adresse $2 wird heruntergefahren."
    if [[ "$4" = "ROUTE" ]]; then
      ROUTE=-r
    fi
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG; then
      echo "ip_startstop $ROUTE $1 $2 $3 stop"
      exit 0
    else
      echo "Lockdatei fuer IP-Adresse $2 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
  ;;
########################################################################################
# Prozess darf im Cluster nicht laufen
#
  !PROC)
    exit 0
  ;;
########################################################################################
# Prozess muss laufen
#
  PROC)
    exit 0
  ;;
########################################################################################
# Raw-Device koennen nicht geloescht werden, daher nur Lockdatei loeschen
#
  LOCK)
    LOCK=LOCK_${1//\//.}
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG; then
      exit 0
    else
      echo "Lockdatei fuer LOCK:$1 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
  ;;
########################################################################################
# Filesystem dismounten
#
  FS)
    LOCK=FS_${1//\//.}
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG; then
      echo "fs_startstop $FORCE $CLEAR $1 stop"
      exit 0
    else
      echo "Lockdatei fuer Filesystem $1 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
  ;;
########################################################################################
# Filesystem dismounten
#
  FSG)
    LOCK=FSG_${1//\//.}
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG; then
      echo "fsg_startstop $FORCE $CLEAR $1 stop"
      exit 0
    else
      echo "Lockdatei fuer Filesystem $1 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
  ;;
########################################################################################
# NFS-Filesystem dismounten
#
  NFS)
    LOCK=NFS_${1//\//.}
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG; then
      echo "fs_startstop $FORCE $CLEAR --nfs $1 stop"
      exit 0
    else
      echo "Lockdatei fuer Filesystem $1 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
  ;;
########################################################################################
# NFS-Filesystem Gruppe dismounten
#
  NFSG)
    LOCK=NFSG_${1//\//.}
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG; then
      echo "fsg_startstop $FORCE $CLEAR --nfs $1 stop"
      exit 0
    else
      echo "Lockdatei fuer Filesystem $1 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
  ;;
########################################################################################
# SubResource stoppen
#
  RS)
    
    echo "sccl_stop_package $FORCE $CLEAR $1 $PIDSIG"
    exit 0
  ;;
########################################################################################
# Programm stoppen
#
  PRG)
    LOCK=PRG_$PKGNAME${1//\//_}
    if [[ -z "$1" ]]; then
      STARTSTOPPRG=$STARTSTOPDIR/${PKGNAME}_startstop
    elif [[ "$1" == */* ]]; then
      STARTSTOPPRG=$1
    else
      STARTSTOPPRG=$STARTSTOPDIR/$1
    fi
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG; then
      echo "$STARTSTOPPRG stop $STOPPARS"
      exit 0
    else
      echo "Lockdatei fuer Programm $1 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
  ;;
########################################################################################
# Programm mit Parametern stoppen
#
  PRGP)
    LOCK=PRGP_${PKGNAME}_`echo "$RES" | md5sum | cut -d ' ' -f 1`
    if [[ -z "$1" ]]; then
      STARTSTOPPRG=$STARTSTOPDIR/${PKGNAME}_startstop
    elif [[ "$1" == */* ]]; then
      STARTSTOPPRG=$1
    else
      STARTSTOPPRG=$STARTSTOPDIR/$1
    fi
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG; then
      if [[ -n "$2" ]]; then
        shift
        echo "$STARTSTOPPRG stop $STOPPARS $@"
        exit 0
      else
        echo "$STARTSTOPPRG stop $STOPPARS $PKGNAME"
        exit 0
      fi
    else
      echo "Lockdatei fuer Programm $1 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
  ;;
########################################################################################
# Test-Programm stoppen
#
  TST)
    LOCK=TST_$PKGNAME
    LOCKD=TSTD_${PKGNAME}_$THISHOSTNAME
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG; then
      exit 0
    else
      echo "Lockdatei fuer Test-Programm $PKGNAME nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
  ;;
########################################################################################
# Restart-Programm stoppen
#
  STST)
    LOCK=STST_$PKGNAME
    LOCKD=STSTD_${PKGNAME}_$THISHOSTNAME
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG; then
      exit 0
    else
      echo "Lockdatei fuer Restart-Programm $PKGNAME nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
  ;;
########################################################################################
# Paket testen
#
  CPKG)
    exit 0
  ;;
########################################################################################
# Pakete testen
#
  CPKGO)
    exit 0
  ;;
########################################################################################
# Paket testen
#
  CPKGW)
    exit 0
  ;;
########################################################################################
# Paket muss vorhanden sein
#
  PKG)
    exit 0
  ;;
########################################################################################
# Ausschlusspaket gegebenenfalls neu starten
#
  !PKG)
    exit 0
  ;;
########################################################################################
# Paket testen
#
  !CPKG)
    exit 0
  ;;
########################################################################################
# Restart von aktiven Paketen
# Beim Stoppen werden diese Pakete gestoppt, wenn sie laufen
#
  RST)
    if [[ "$2" = "CLUSTER" ]]; then
      for j in $(sed -rn "s/^(${1//,/|})[[:blank:]].*/\\1/p" $PACKAGES | tac); do
        if RNODES="`./sccl_get_actnode $j`"; then
          for i in $RNODES; do
            sccl_stop --simulate $j $i
          done
        fi
      done
    else
      for j in $(sed -rn "s/^(${1//,/|})[[:blank:]].*/\\1/p" $PACKAGES | tac); do
        if ./sccl_test_res_on_node $j; then
          sccl_stop --simulate $j $THISHOSTNAME
        fi
      done
    fi
    exit 0
  ;;
########################################################################################
# beim Stoppen müssen mindestens MINPKG Pakete weiterlaufen
#
  MINPKGS)
    if [[ $FORCEFLAG  = 1 ]]; then
      exit 0
    fi
    REG=$1
    MINNUM=$2 
    NUM=$(./sccl_list_cluster -p | grep -Ec "$REG")
    if [[ $NUM -gt $MINNUM ]]; then
      exit 0
    else
      exit 2
    fi
  ;;
########################################################################################
# beim Stoppen dürfen die Pakete aus CSRV nicht laufen
#
  CSRV)
    if [[ $FORCEFLAG  = 1 ]]; then
      exit 0
    fi
    RET=0
    for i in ${1//,/ }; do
      if ./sccl_test_resource $i; then
        echo "Das Paket $i läuft noch"
        if [[ -z "$CLUSTERSTOP" ]]; then
          exit 2
        fi
        RET=2
      fi
    done
    if [[ $RET = 0 ]]; then
      exit 0
    fi
    if [[ -n "$3" ]]; then
      Z=$(($3 * 6))
    else
      Z=360
    fi
    echo -n "Das Paket darf nicht gestoppt werden, weil $1 noch laufen."
    exit 0
  ;;
########################################################################################
# Paket als laufend markieren
#
  SETSTATE)
    exit 0
  ;;
########################################################################################
# Paket wieder stoppen
#
  TEARDOWN)
    exit 0
  ;;
########################################################################################
  *)
    echo "Ungueltiger Resourcetyp $RESTYP"
  ;;
esac
exit 0
