#!/bin/bash
#
# sccl_stop stoppt ein Paket im Script-Cluster
#
# Aufruf:
#
# sccl_stop [--simulate|--force|--clear|--tstkill] [--clusterstop] [-w <secs>] [--norst] [-p <stoppars>] [-r] <paketname> [<node>]
#
# Das Paket <paketname> wird auf dem Knoten <node> gestoppt.
# ist --force angegeben, dann werden alle Resourcen des Paketes auf
# dem angegebenen <node> beendet. Andernfalls wird der aktive
# Knoten bestimmt.
#
########################################################################################
#
. $(dirname $0)/globals.settings
#
unset SCCLINITIGNORE FORCE RETVALUE RETERROR CLEAR CLUSTERSTOP CALLPARS STOPPARS SIMULATE CALLEXT ENABLETRAPS WAITSTOP SCCLNORST allnodes
while getopts I:i:P:p:Rr-:w:? op; do
  case "$op" in
   i) SCCLINITIGNORE="$OPTARG";;
   I) export scclinitiated="$OPTARG";;
   p) STOPPARS="$STOPPARS $OPTARG"
      for i in $OPTARG; do
        CALLPARS="$CALLPARS -p $i"
      done;;
   r) RETVALUE=1;;
   R) RETERROR='SCCL-Error: '
      unset RETVALUE;;
   w) WAITSTOP="$OPTARG";;
   -) case "$OPTARG" in
       all)         allnodes='--all';;
       force)       FORCE='--force';;
       clear)       CLEAR='--clear';;
       tstkill)     CLEAR='--tstkill';;
       clusterstop) CLUSTERSTOP='--clusterstop';;
       enable-traps) ENABLETRAPS=1;;
       simulate)    SIMULATE='--simulate'
                    CALLEXT='_simulate';;
       norst) export SCCLNORST='--norst';;
       *)           echo "usage: $MYPRG [--simulate|--force|--clear|--tstkill] [--clusterstop] [--norst] [-p <stoppars>] [-r] [-w] <package> [<node>]"
                    exit 1;;
      esac;;
   ?) echo "usage: $MYPRG [--simulate|--force|--clear|--tstkill] [--clusterstop] [--norst] [-p <stoppars>] [-r] [-w] <package> [<node>]"
      exit 1;;
  esac
done
shift $(( $OPTIND - 1))
#
if [[ $# -lt 1 ]]; then
  echo "usage: $MYPRG [--simulate|--force|--clear|--tstkill] [--clusterstop] [--norst] [-p <stoppars>] [-r] [-w] <package> [<node>]"
  if [[ -n "$RETERROR" ]]; then
    echo "${RETERROR}Fehlerhafter Aufruf"
  fi
  exit 1
fi
#
if [[ -z "$FORCE" ]]; then
  if ! grep -q '^'$1'[[:blank:]]' $PACKAGES; then
    echo "${RETERROR}$1 ist kein Paket."
    exit 1
  fi
fi
#
if [[ ! -f $PACKAGES ]]; then
  echo "${RETERROR}$PACKAGES fehlt." >&2
  exit 1
fi
#
if [[ "$SCCLINITIGNORE" = "$1:$THISHOSTNAME" ]]; then
  echo "ignoring stopping loop."
  exit 0
fi
#
if [[ $# -ge 2 ]]; then
  NODE=$(tr '[:upper:]' '[:lower:]' <<<$2)
else
  if NODE=`sccl_get_actnode $1`; then
    if [[ $NODE == *" "* ]]; then
      if [[ -n "$allnodes" ]]; then
        ret=0
        if [[ -t 1 ]]; then
          for n in $NODE; do
            echo "Node $n"
            callnode $n "sccl_stop$CALLEXT.s3w?force=$FORCE&norst=$SCCLNORST&clear=$CLEAR&paket=$1&node=$NODE&initignore=$SCCLINITIGNORE&stoppars=$STOPPARS&waitstop=$WAITSTOP&initiated=${scclinitiated:-$THISHOSTNAME}&scclerrorflag=-R" | tee /dev/tty | grep -Eq '^SCCL-Error|^RETURNVALUE [12]'
            if [[ $? -ne 0 ]]; then
              ret=1
            fi
            echo
          done
        else
          for n in $NODE; do
            echo "Node $n"
            callnode $n "sccl_stop$CALLEXT.s3w?force=$FORCE&norst=$SCCLNORST&clear=$CLEAR&paket=$1&node=$NODE&initignore=$SCCLINITIGNORE&stoppars=$STOPPARS&waitstop=$WAITSTOP&initiated=${scclinitiated:-$THISHOSTNAME}&scclerrorflag=-R" | sed '/^SCCL-Error/h;/^RETURNVALUE [12]/h;${x;/./{x;q1};x;q0}'
            if [[ $? -ne 0 ]]; then
              ret=1
            fi 
            echo
          done
        fi
        exit $ret
      else
        echo "${RETERROR}Das Paket $1 laeuft mehrfach im Cluster, der Knoten muss angegeben werden."
        exit 1
      fi
    fi
  else
    echo "${RETERROR}Das Paket $1 ist im Cluster nicht aktiv."
    if [[ "$FORCE" = "--force" || "$CLEAR" = "--clear" ]]; then
      echo "Der Node muss mit angegeben werden: $0 $FORCE$CLEAR $1 <node>"
    fi
    exit 1
  fi
fi
#
if [[ `id -u` != 0 ]]; then
  if [[ -t 1 ]]; then
    callnode $NODE "sccl_stop$CALLEXT.s3w?force=$FORCE&norst=$SCCLNORST&clear=$CLEAR&paket=$1&node=$NODE&initignore=$SCCLINITIGNORE&stoppars=$STOPPARS&waitstop=$WAITSTOP&initiated=${scclinitiated:-$THISHOSTNAME}&scclerrorflag=-R" | tee /dev/tty | grep -Eq '^SCCL-Error|^RETURNVALUE [12]'
    [[ $? -ne 0 ]]
  else
    callnode $NODE "sccl_stop$CALLEXT.s3w?force=$FORCE&norst=$SCCLNORST&clear=$CLEAR&paket=$1&node=$NODE&initignore=$SCCLINITIGNORE&stoppars=$STOPPARS&waitstop=$WAITSTOP&initiated=${scclinitiated:-$THISHOSTNAME}&scclerrorflag=-R" | sed '/^SCCL-Error/h;/^RETURNVALUE [12]/h;${x;/./{x;q1};x;q0}'
  fi
  exit
fi
#
export THISINITIGNORE="$1:$THISHOSTNAME"
export SCCLINITIGNORE="${SCCLINITIGNORE:-$THISINITIGNORE}"
#
if [[ "$2" != "THISNODE" && $NODE != $THISHOSTNAME && $NODE != $THISFQDN ]]; then
  if [[ -t 1 ]]; then
    callnode $NODE "sccl_stop$CALLEXT.s3w?force=$FORCE&norst=$SCCLNORST&clear=$CLEAR&paket=$1&node=$NODE&initignore=$SCCLINITIGNORE&stoppars=$STOPPARS&waitstop=$WAITSTOP&initiated=${scclinitiated:-$THISHOSTNAME}&scclerrorflag=-R" | tee /dev/tty | grep -Eq '^SCCL-Error|^RETURNVALUE [12]'
    [[ $? -ne 0 ]]
  else
    callnode $NODE "sccl_stop$CALLEXT.s3w?force=$FORCE&norst=$SCCLNORST&clear=$CLEAR&paket=$1&node=$NODE&initignore=$SCCLINITIGNORE&stoppars=$STOPPARS&waitstop=$WAITSTOP&initiated=${scclinitiated:-$THISHOSTNAME}&scclerrorflag=-R" | sed '/^SCCL-Error/h;/^RETURNVALUE [12]/h;${x;/./{x;q1};x;q0}'
  fi
else
  LOGFILE=$SCCLLOGBASE/$SCCLLOGNAME${1}_stop.log
  #
  PACKAGE=$1
  export PACKAGE
  STARTTIME=`starttime $PACKAGE`
  #
  if [[ -z "$ENABLETRAPS" ]]; then
    trap '' 1 2 3 6
  fi
  if [[ -n "$ULS" ]]; then
    DATETIME=`date '+%Y-%m-%d %H:%M:%S'`
    #                                            Sektion  Teststep        Detail       Date Time Wert            Einheit
    send_test_value -h DOMAIN:$THISHOSTNAME:SCCL $CLUSTER Packages:$PACKAGE Server       $DATETIME $THISHOSTNAME   "_"
    send_test_value -h DOMAIN:$THISHOSTNAME:SCCL $CLUSTER Packages:$PACKAGE "start-stop" $DATETIME "Stop"          "_"
    if [[ -n "$scclinitiated" ]]; then
      send_test_value -h DOMAIN:$THISHOSTNAME:SCCL $CLUSTER Packages:$PACKAGE "initiated" $DATETIME  "$scclinitiated" "_"
    fi
  fi
  set -o pipefail
  ./sccl_stop_package ${WAITSTOP+-w} $WAITSTOP -P ${SIMULATE:-$FORCE} $CLEAR $CLUSTERSTOP $CALLPARS $PACKAGE 2>&1 | tee "$LOGFILE"
  RET=$?
  if [[ $RET -eq 0 ]]; then
    if [[ ! -z "$STARTTIME" ]]; then
      echo
      if [[ -n "$ULS" ]]; then
        FDATETIME=`date '+%Y-%m-%d %H:%M:%S'`
        send_test_value -h DOMAIN:$THISHOSTNAME:SCCL $CLUSTER Packages:$PACKAGE "message" $DATETIME "Stoped" "_"
        send_test_value -h DOMAIN:$THISHOSTNAME:SCCL $CLUSTER Packages:$PACKAGE "finished" $DATETIME "$FDATETIME" "{DT}"
      fi
    fi
    if [[ -n "$SIMULATE" ]]; then
      echo "Der Stopp des Paketes '$PACKAGE' wurde auf $THISHOSTNAME simuliert."
    else
      echo "Das Paket '$PACKAGE' wurde auf $THISHOSTNAME gestoppt."
    fi
  else
    if [[ $RET -eq 2 ]]; then
      echo "${RETERROR}Das Paket ist noch als Unterpaket aktiv."
    elif [[ -n "$STARTTIME" ]]; then
      if [[ -n "$ULS" ]]; then
        FDATETIME=`date '+%Y-%m-%d %H:%M:%S'`
        send_test_value -h DOMAIN:$THISHOSTNAME:SCCL $CLUSTER Packages:$PACKAGE "message" $DATETIME "ERROR (Stop)" "_"
        send_test_value -h DOMAIN:$THISHOSTNAME:SCCL $CLUSTER Packages:$PACKAGE "finished" $DATETIME "$FDATETIME" "{DT}"
        if which xz &>/dev/null; then
          xz -c "$LOGFILE" | send_stdin_file -h DOMAIN:$THISHOSTNAME:SCCL $CLUSTER Packages:$PACKAGE "logfile" $DATETIME "${LOGFILE##*/}.xz"
        else
          gzip -c "$LOGFILE" | send_stdin_file -h DOMAIN:$THISHOSTNAME:SCCL $CLUSTER Packages:$PACKAGE "logfile" $DATETIME "${LOGFILE##*/}.gz"
        fi
      fi
      echo
      echo "${RETERROR}Das Paket '$PACKAGE' konnte nicht gestoppt werden."
    fi
    if [[ -n "$RETVALUE" ]]; then
      echo "RETURNVALUE 1"
    fi
    exit 1
  fi
fi
