#!/bin/bash
#
# sccl_stop_resource stoppt die Resource, die angegeben ist
#
# Aufruf:
#
# sccl_stop_resource [--force|--clear|--tstkill] [--clusterstop] <resource> <kurzname> <pidsig>
#
# Die Resource <resource> wird gestoppt
# Aufbau des Parameters <resource> siehe Datei resourcen
#
########################################################################################
#
#echo $0 $*
#
. `dirname $0`/globals.functions
#
TSTKILL=0
FORCEFLAG=0
CLEARFLAG=0
STOPFLAG=0
#
unset FORCE CLEAR CLUSTERSTOP
#
while [[ "$1" == --* ]]
 do
  case "$1" in
    --force) FORCEFLAG=1
             FORCE=--force
             shift;;
    --clear) FORCEFLAG=1
             FORCE=--force
             CLEAR=--clear
             CLEARFLAG=1
             shift;;
    --tstkill) FORCEFLAG=1
               FORCE=--force
               CLEAR=--clear
               TSTKILL=1
               CLEARFLAG=1
               shift;;
    --clusterstop) STOPFLAG=1
                   CLUSTERSTOP=--clusterstop
                   shift;;
  esac
done
#
if [[ $# -ne 3 ]]
 then
  echo "usage: $0 <resource> <kurzname> <pidsig>"
  exit 1
fi
#
KURZNAME=$2
PIDSIG=$3
#
SWITCHDAT=/tmp/scclswdt.$PIDSIG
#
set `echo $1 | sed 's/:/ /g'`
#
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
      ./ip_startstop $ROUTE $1 $2 $3 stop
      reduce_lockdat $LOCK $PIDSIG
      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_`echo $1 | sed 's/\//./g'`
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG
     then
      reduce_lockdat $LOCK $PIDSIG
      exit 0
    else
      echo "Lockdatei fuer LOCK:$1 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
  ;;
########################################################################################
# Filesystem dismounten
#
  FS)
    LOCK=FS_`echo $1 | sed 's/\//./g'`
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG
     then
      if ./fs_startstop $FORCE $CLEAR $1 stop
       then
        reduce_lockdat $LOCK $PIDSIG
        exit 0
      fi
    else
      echo "Lockdatei fuer Filesystem $1 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
    echo "Das Filesystem $1 konnte nicht unmounted werden." 
  ;;
########################################################################################
# Filesystem dismounten
#
  FSG)
    LOCK=FSG_`echo $1 | sed 's/\//./g'`
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG
     then
      if ./fsg_startstop $FORCE $CLEAR $1 stop
       then
        reduce_lockdat $LOCK $PIDSIG
        exit 0
      fi
    else
      echo "Lockdatei fuer Filesystem $1 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
    echo "Das Filesystem $1 konnte nicht unmounted werden." 
  ;;
########################################################################################
# NFS-Filesystem dismounten
#
  NFS)
    LOCK=NFS_`echo $1 | sed 's/\//./g'`
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG
     then
      if ./fs_startstop $FORCE $CLEAR --nfs $1 stop
       then
        reduce_lockdat $LOCK $PIDSIG
        exit 0
      fi
    else
      echo "Lockdatei fuer Filesystem $1 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
    echo "Das Filesystem $1 konnte nicht unmounted werden." 
  ;;
########################################################################################
# NFS-Filesystem Gruppe dismounten
#
  NFSG)
    LOCK=NFSG_`echo $1 | sed 's/\//./g'`
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG
     then
      if ./fsg_startstop $FORCE $CLEAR --nfs $1 stop
       then
        reduce_lockdat $LOCK $PIDSIG
        exit 0
      fi
    else
      echo "Lockdatei fuer Filesystem $1 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
    echo "Das Filesystem $1 konnte nicht unmounted werden." 
  ;;
########################################################################################
# SubResource stoppen
#
  RS)
    
    ./sccl_stop_package $FORCE $CLEAR $1 $PIDSIG
    RET=$?
    if [[ $RET = 0 || $RET = 2 ]]
     then
      exit 0
    else
      echo "Das Unterpaket $1 konnte nicht gestoppt werden."
      exit 1
    fi
  ;;
########################################################################################
# Programm stoppen
#
  PRG)
    LOCK=PRG_$KURZNAME`echo $1 | sed 's|/|_|g'`
    if [[ -z "$1" ]]
     then
      STARTSTOPPRG=$STARTSTOPDIR/${KURZNAME}_startstop
    elif echo "$1" | grep -q '/'
     then
      STARTSTOPPRG=$1
    else
      STARTSTOPPRG=$STARTSTOPDIR/$1
    fi
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG
     then
      if $STARTSTOPPRG stop
       then
        reduce_lockdat $LOCK $PIDSIG
        exit 0
      elif [[ $CLEARFLAG = 1 ]]
       then
        reduce_lockdat $LOCK $PIDSIG
        exit 0
      fi
    else
      echo "Lockdatei fuer Programm $1 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
    echo "Das Programm $KURZNAME konnte nicht gestoppt werden."
  ;;
########################################################################################
# Programm mit Parametern stoppen
#
  PRGP)
    LOCK=PRGP_$KURZNAME_`echo "$*" | md5sum | cut -d ' ' -f 1`
    if [[ -z "$1" ]]
     then
      STARTSTOPPRG=$STARTSTOPDIR/${KURZNAME}_startstop
    elif echo "$1" | grep -q '/'
     then
      STARTSTOPPRG=$1
    else
      STARTSTOPPRG=$STARTSTOPDIR/$1
    fi
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG
     then
      if [[ -n "$2" ]]
       then
        shift
        if $STARTSTOPPRG stop "$@"
         then
          reduce_lockdat $LOCK $PIDSIG
          exit 0
        fi
      else
        if $STARTSTOPPRG stop $KURZNAME
         then
          reduce_lockdat $LOCK $PIDSIG
          exit 0
        fi
      fi
      if [[ $CLEARFLAG = 1 ]]
       then
        reduce_lockdat $LOCK $PIDSIG
        exit 0
      fi
    else
      echo "Lockdatei fuer Programm $1 nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
    echo "Das Programm $STARTSTOPPRG konnte nicht gestoppt werden."
  ;;
########################################################################################
# Test-Programm stoppen
#
  TST)
    LOCK=TST_$KURZNAME
    LOCKD=TSTD_${KURZNAME}_$THISHOSTNAME
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG
     then
      if [[ $TSTKILL = 1 ]]
       then
        reduce_lockdat $LOCK $PIDSIG
        exit 0
      elif ./sccl_stop_tst $LOCKD
       then
        reduce_lockdat $LOCK $PIDSIG
        exit 0
      elif [[ $CLEARFLAG = 1 ]]
       then
        reduce_lockdat $LOCK $PIDSIG
        exit 0
      fi
    else
      echo "Lockdatei fuer Test-Programm $KURZNAME nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
    echo "Das Programm $KURZNAME konnte nicht gestoppt werden."
  ;;
########################################################################################
# Restart-Programm stoppen
#
  STST)
    LOCK=RST_$KURZNAME
    LOCKD=RSTD_${KURZNAME}_$THISHOSTNAME
    if test_lockdat $FORCEFLAG $LOCK $PIDSIG
     then
      if [[ $TSTKILL = 1 ]]
       then
        reduce_lockdat $LOCK $PIDSIG
        exit 0
      elif ./sccl_stop_stst $LOCKD
       then
        reduce_lockdat $LOCK $PIDSIG
        exit 0
      elif [[ $CLEARFLAG = 1 ]]
       then
        reduce_lockdat $LOCK $PIDSIG
        exit 0
      fi
    else
      echo "Lockdatei fuer Restart-Programm $KURZNAME nicht gefunden!"
      exit $LOCKNOTFOUND
    fi
    echo "Das Programm $KURZNAME konnte nicht gestoppt werden."
  ;;
########################################################################################
# Paket testen
#
  CPKG)
    exit 0
  ;;
########################################################################################
# Ausschlusspaket gegebenenfalls neu starten
#
  !PKG)
    if [[ "$2" = "SWITCH" && $STOPFLAG = 0 ]]
     then
      echo $1 >>$SWITCHDAT
    fi
    exit 0
  ;;
########################################################################################
# Paket testen
#
  !CPKG)
    exit 0
  ;;
########################################################################################
# Paket muss vorhanden sein
#
  PKG)
    exit 0
  ;;
########################################################################################
# Restart von aktiven Paketen
# Beim Stoppen werden diese Pakete gestoppt, wenn sie laufen
#
  RST)
    if [[ "$2" = "CLUSTER" ]]
     then
      for j in `echo $1 | sed 's/,/ /g'`
       do
        if RNODES="`./sccl_get_aktnode $j`"
         then
          echo "$j $RNODES" >>$LOCKDIR/$KURZNAME.RST
          for i in $RNODES
           do
            ./sccl_stop $CLUSTERSTOP $j $i
          done
        fi
      done
    else
      for j in `echo $1 | sed 's/,/ /g'`
       do
        if ./sccl_test_res_on_node $j
         then
          echo "$j $THISHOSTNAME" >>$LOCKDIR/$KURZNAME.RST
          ./sccl_stop $FORCE $CLEAR $CLUSTERSTOP $j $THISHOSTNAME
        fi
      done
    fi
    exit 0
  ;;
########################################################################################
# Paket als laufend markieren
#
  SETSTATE)
    exit 0
  ;;
########################################################################################
  *)
    echo "Ungueltiger Resourcetyp $RESTYP"
  ;;
esac
  exit 1
