#!/bin/bash
#
# sccl_start_resource bearbeitet die Resourcen, die hinter einer Resource
# angegeben sind
#
# Aufruf:
#
# sccl_start_resource [--force] [--multi|--execute] [-x <extrapar>] <resource> <kurzname> <pidsig>
#
# Die Resource <resource> wird geprueft und ggf. gestartet.
# [--multi]   : Die PRG Resource darf auf mehreren Knoten laufen
# [--execute] : Nur ausführen, keine Locks setzen
# Aufbau des Parameters <resource> siehe Datei resourcen
#
# Returnwerte: 0: alles OK
#              1: Fehler
#              2: SETSTATE
#
########################################################################################
#
. $(dirname $0)/globals.settings
#
unset FORCE MULTI EXECUTE STARTPARS
while getopts p:x:-:? op; do
  case "$op" in
   p) STARTPARS="$STARTPARS $OPTARG";;
   x) for i in $OPTARG; do
        eval $i
      done;;
   -) case "$OPTARG" in
       force)   FORCE="--force";;
       multi)   MULTI=1;;
       execute) EXECUTE=1;;
       *)       echo "usage: $MYPRG [--force] [--multi|--execute] [--kill] [-p <startpar>] [-x <extrapar>] [-i <initignore>] <resource> <kurzname> <pidsig>"
                exit 1;;
      esac;;
   ?) echo "usage: $MYPRG [-p <startpar>] [-x <extrapar>] [-i <initignore>] <resource> <kurzname> <pidsig>"
      exit 1;;
  esac
done
#
shift $(( $OPTIND - 1))
#
if [[ $# -ne 3 ]]; then
  echo "usage: $MYPRG [--force] [--multi] [-p <startpar>] [-x <extrapar>] [-i <initignore>] <resource> <kurzname> <pidsig>"
  exit 1
fi
#
RES="$1"
PKGNAME="$2"
PIDSIG="$3"
#
A=${1// /\\ }
eval set ${A//:/ }
#
RESTYP=$1
shift
#
case $RESTYP in
########################################################################################
# IP-Adresse setzen
#
  IP)
    if [[ $# -lt 3 ]]; then
      echo "Falsches Format: $RES"
      echo "IP - Wrong format" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    fi
    LOCK=IP_$2
    if ./sccl_test_resource $LOCK; then
      echo "Die Resource $RES zu $PKGNAME ist schon aktiv."
      echo "IP - resource $RES already active" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    fi
    if $IP_TEST $2; then
      echo "Die IP-Adresse $2 ist schon vorhanden."
      echo "IP - ip-address $2 already active" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    fi
    if [[ "$4" = "ROUTE" ]]; then
      ROUTE=-r
    fi
    if ./ip_startstop $ROUTE $1 $2 $3 start; then
      set_lockdat $LOCK $PKGNAME $PIDSIG
      exit 0
    fi
    echo "Die IP-Adresse $2 konnte nicht gesetzt werden."
    echo "IP - unable to set ip-address $2" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    exit 1 
  ;;
########################################################################################
# Prozess darf nicht laufen
#
  !PROC)
    if [[ "$2" = "WAIT" ]]; then
      if [[ $3 =~ ^[0-9]+$ ]]; then
        MAXWAIT=$3
      else
        MAXWAIT=5
      fi
      SLEEP='sleep 60'
    else
      MAXWAIT=1
      SLEEP=:
    fi
    WAIT=0
    while [[ $WAIT -lt $MAXWAIT ]]; do
      if ! ps -e | grep -Ev 'grep|sccl_start_resource' | grep -q $1; then
        exit 0
      fi
      WAIT=$(( $WAIT + 1 ))
      $SLEEP
    done
    echo "Der Prozess $1 laeuft."
    echo "!PROC - process $1 is running" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    exit 1
  ;;
########################################################################################
# Prozess muss laufen
#
  PROC)
    if [[ "$2" = "WAIT" ]]; then
      if [[ $3 =~ ^[0-9]+$ ]]; then
        MAXWAIT=$3
      else
        MAXWAIT=5
      fi
      SLEEP='sleep 60'
    else
      MAXWAIT=1
      SLEEP=:
    fi
    WAIT=0
    while [[ $WAIT -lt $MAXWAIT ]]; do
      if ps -ef | grep -Ev 'grep|sccl_start_resource' | grep -q $1; then
        exit 0
      fi
      WAIT=$(( $WAIT + 1 ))
      $SLEEP
    done
    echo "Der Prozess $1 laeuft nicht."
    echo "PROC - process $1 not running" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    exit 1
  ;;
########################################################################################
# LOCK: beliebiges Locking von z. B. Rawdevices
#
  LOCK)
    LOCK=LOCK_${1//\//.}
    if ./sccl_test_resource $LOCK; then
      echo "Die Resource $RES:$1 zu $PKGNAME ist schon aktiv."
      echo "LOCK - lock $1 already active" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    fi
    [[ -z "$EXECUTE" ]] && set_lockdat $LOCK $PKGNAME $PIDSIG
    exit 0
  ;;
########################################################################################
# Filesystem
#
  FS)
    LOCK=FS_${1//\//.}
    if ./sccl_test_resource $LOCK; then
      echo "Die Resource $RES zu $PKGNAME ist schon aktiv."
      echo "FS - filesystem $1 already active" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    fi
    if [[ "$2" = "FSCK" ]]; then
      FSCK='--fsck'
    else
      FSCK=''
    fi
    if ./fs_startstop $FORCE $FSCK $1 start; then
      set_lockdat $LOCK $PKGNAME $PIDSIG
      exit 0
    fi
    echo "Das Filesystem $1 konnte nicht gemounted werden."
    echo "FS - error on mounting $1" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    exit 1 
  ;;
########################################################################################
# Filesystem-Gruppe aus /etc/fstab
#
  FSG)
    LOCK=FSG_${1//\//.}
    if ./sccl_test_resource $LOCK; then
      echo "Die Resource $RES zu $PKGNAME ist schon aktiv."
      echo "FSG - filesystemgroup $1 already active" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    fi
    if [[ "$2" = "FSCK" ]]; then
      FSCK='--fsck'
    else
      FSCK=''
    fi
    if ./fsg_startstop $FSCK $1 start; then
      set_lockdat $LOCK $PKGNAME $PIDSIG
      exit 0
    fi
    echo "Die Filesystemgruppe $1 konnte nicht gemounted werden."
    echo "FSG - error on mounting filesystemgroup $1" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    exit 1 
  ;;
########################################################################################
# NFS Filesystem - Unterschied zu FS: darf auf mehreren Knoten gemounted werden
#
  NFS)
    LOCK=NFS_${1//\//.}
    if ./sccl_test_res_on_node $LOCK; then
      echo "Die Resource $RES zu $PKGNAME ist schon aktiv."
      echo "NFS - nfsmount $1 already active" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    fi
    if ./fs_startstop --nfs $1 start; then
      set_lockdat $LOCK $PKGNAME $PIDSIG
      exit 0
    fi
    echo "Das Filesystem $1 konnte nicht gemounted werden."
    echo "NFS - error on mounting $1" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    exit 1 
  ;;
########################################################################################
# NFSG Filesystemgruppe - Unterschied zu FSG: darf auf mehreren Knoten gemounted werden
#
  NFSG)
    LOCK=NFSG_${1//\//.}
    if ./sccl_test_res_on_node $LOCK; then
      echo "Die Resource $RES zu $PKGNAME ist schon aktiv."
      echo "NFSG - filesystemgroup $1 already active" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    fi
    if ./fsg_startstop --nfs $1 start; then
      set_lockdat $LOCK $PKGNAME $PIDSIG
      exit 0
    fi
    echo "Die Filesystemgruppe $1 konnte nicht gemounted werden."
    echo "NFSG - error on mounting filesystemgroup $1" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    exit 1 
  ;;
########################################################################################
# SubResource
#
  RS)
    if ! ./sccl_start_package -u $1 $PIDSIG; then
      echo "Das Unterpaket $1 konnte nicht gestartet werden."
      echo "RS - subpackage $1 already active" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    fi
  ;;
########################################################################################
# Programm starten
#
  PRG)
    LOCK=PRG_$PKGNAME${1//\//_}
    if [[ -z "$1" ]]; then
      STARTSTOPPRG=$STARTSTOPDIR/${PKGNAME}_startstop
    elif [[ "$1" == */* ]]; then
      STARTSTOPPRG=$1
    else
      STARTSTOPPRG=$STARTSTOPDIR/$1
    fi
    if [[ -n "$MULTI" ]]; then
      if ./sccl_test_res_on_node $LOCK; then
        echo "Die Resource $RES zu $PKGNAME laeuft schon auf diesem Knoten."
        echo "PRG - program $1 already active on this node" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
        exit 1
      fi
    else
      if ./sccl_test_resource $LOCK; then
        echo "Die Resource $RES zu $PKGNAME ist schon aktiv."
        echo "PRG - program $1 already active" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
        exit 1
      fi
    fi
    rm -f $SCCLLOGBASE/$LOCK.out
    >$SCCLLOGBASE/$LOCK.out
    ( $STARTSTOPPRG start $STARTPARS >>$SCCLLOGBASE/$LOCK.out 2>&1)&
    PRGPID=$!
    [[ -f "$LOCKDIR/${PACKAGE}_start_progress" ]] && echo "$PIDSIG PRGSTART $PRGPID $STARTSTOPPRG" >>"$LOCKDIR/${PACKAGE}_start_progress"
    tail -f $SCCLLOGBASE/$LOCK.out &
    TAILPID=$!
    if wait $PRGPID; then
      [[ -z "$EXECUTE" ]] && set_lockdat $LOCK $PKGNAME $PIDSIG
      sleep 1
      kill $TAILPID
      exit 0
    fi
    sleep 1
    kill $TAILPID
    if [[ -n "$EXECUTE" ]]; then
      echo "Das Programm $STARTSTOPPRG konnte nicht ausgeführt werden."
      echo "PRG - error on executing $STARTSTOPPRG" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    else
      echo "Das Programm $1 konnte nicht gestartet werden."
      echo "PRG - error on starting $STARTSTOPPRG" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    fi
    exit 1 
  ;;
########################################################################################
# Programm mit Parametern starten
#
  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
    shift
    if [[ -n "$MULTI" ]]; then
      if ./sccl_test_res_on_node $LOCK; then
        echo "Die Resource $RES zu $PKGNAME laeuft schon auf diesem Knoten."
        echo "PRGP - program $STARTSTOPPRG already active on this node" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
        exit 1
      fi
    else
      if ./sccl_test_resource $LOCK; then
        echo "Die Resource $RES zu $PKGNAME ist schon aktiv."
        echo "PRGP - program $STARTSTOPPRG already active" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
        exit 1
      fi
    fi
    rm -f $SCCLLOGBASE/$LOCK.out
    >$SCCLLOGBASE/$LOCK.out
    if [[ $# -lt 1 ]]; then
      ( $STARTSTOPPRG start $STARTPARS "$PKGNAME" >>$SCCLLOGBASE/$LOCK.out 2>&1)&
    else
      ( $STARTSTOPPRG start $STARTPARS "$@" >>$SCCLLOGBASE/$LOCK.out 2>&1)&
    fi
    PRGPID=$!
    [[ -f "$LOCKDIR/${PACKAGE}_start_progress" ]] && echo "$PIDSIG PRGSTART $PRGPID $STARTSTOPPRG" >>"$LOCKDIR/${PACKAGE}_start_progress"
    tail -f $SCCLLOGBASE/$LOCK.out &
    TAILPID=$!
    if wait $PRGPID; then
      [[ -z "$EXECUTE" ]] && set_lockdat $LOCK $PKGNAME $PIDSIG
      sleep 1
      kill $TAILPID
      exit 0
    fi
    sleep 1
    kill $TAILPID
    if [[ -n "$EXECUTE" ]]; then
      echo "Das Programm $STARTSTOPPRG konnte nicht ausgeführt werden."
      echo "PRGP - error on executing $STARTSTOPPRG" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    else
      echo "Das Programm $STARTSTOPPRG konnte nicht gestartet werden."
      echo "PRGP - error on starting $STARTSTOPPRG" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    fi
    exit 1 
  ;;
########################################################################################
# Pakete pruefen
#
  TST)
    LOCK=TST_$PKGNAME
    LOCKD=TSTD_${PKGNAME}_$THISHOSTNAME
    TSTPRG=${2:-$STARTSTOPDIR/${PKGNAME}_test}
    if [[ -n "$MULTI" ]]; then
      echo "Die Resource $RES ist als MULTI gekennzeichnet!"
      echo "TST - error $RES is marked as MULTI" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    elif ./sccl_test_resource $LOCK; then
      echo "Die Resource $RES zu $PKGNAME ist schon aktiv."
      echo "TST - testresource $RES already active" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    elif ./sccl_test_resource $LOCKD; then
      echo "Die Test-Resource $RES zu $PKGNAME ist schon aktiv."
      echo "TST - testprogram $TSTPRG already active" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    fi
    NEXTNODE=`./sccl_get_nextnode $PKGNAME`
    while [[ -n "$NEXTNODE" ]]; do
      if ./sccl_start_tst $LOCKD $PKGNAME ${1:-60} "$TSTPRG" $NEXTNODE; then
        set_lockdat $LOCK $PKGNAME $PIDSIG
        exit 0
      fi
      echo "WARNUNG: Das Test-Programm $1 konnte auf $NEXTNODE nicht gestartet werden."
      NEXTNODE=`./sccl_get_nextnode $PKGNAME $NEXTNODE`
    done
    echo "WARNUNG: Der Test-Knoten konnte nicht bestimmt werden."
    exit 0
  ;;
########################################################################################
# Pakete lokal pruefen und ggf. restarten
#
  STST)
    LOCK=STST_$PKGNAME
    LOCKD=STSTD_${PKGNAME}_$THISHOSTNAME
    TSTPRG=${3:-$STARTSTOPDIR/${PKGNAME}_test}
    if [[ $TSTPRG != /* ]]; then
      TSTPRG="$STARTSTOPDIR/$TSTPRG"
    fi
    if ./sccl_test_res_on_node $LOCK; then
      echo "Die Resource $RES zu $PKGNAME ist schon aktiv."
      echo "STST - testresource $RES already active" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    elif ./sccl_test_res_on_node $LOCKD; then
      echo "Die Restart-Resource $RES zu $PKGNAME ist schon aktiv."
      echo "STST - testprogram $TSTPRG already active" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    fi
    if ./sccl_start_tst -n "${STSTMAX:-${2:-999}}" $LOCKD $PKGNAME ${1:-60} "$TSTPRG"; then
      set_lockdat $LOCK $PKGNAME $PIDSIG
      exit 0
    fi
    echo "Das Restart-Programm $1 konnte nicht gestartet werden."
    echo "STST - error on starting restartprogram $1" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    exit 1 
  ;;
########################################################################################
# Paket testen
#
  CPKG)
    if ! grep -q '^'$1'[[:blank:]]' $RESOURCES; then
      echo "Error: Die Resource $1 ist nicht definiert"
      exit 1
    fi
    if [[ -n "$SCCLINITIGNORE" ]]; then
      if [[ "$SCCLINITIGNORE" == $1:* ]]; then
        exit 0
      fi
    fi
    if ./sccl_test_resource -r $1; then
      exit 0
    fi
    if [[ $3 =~ ^[0-9]+$ ]]; then
      MAXWAIT=$3
    else
      MAXWAIT=5
    fi
    if [[ "$2" == WAIT* ]]; then
      echo -n "wating for starting $1 "
      WAITEND=`date -d "+$MAXWAIT minute" '+%s'`
      while [[ `date '+%s'` -lt $WAITEND ]]; do
        if ./sccl_test_resource -r $1; then
          exit 0
        fi
        echo -n "."
        sleep 5
      done
      echo
    fi
    if [[ "$2" == *START ]]; then
      if ./sccl_test_resource -r $1; then
        exit 0
      fi
      ./sccl_start_bg -I "${scclinitiated:-$THISHOSTNAME} / $PACKAGE" -i "$SCCLINITIGNORE" $1 `get_first_node $1`
      if ./sccl_test_resource -r $1; then
        exit 0
      fi
      echo -n "wating for starting $1 "
      WAITEND=`date -d "+$MAXWAIT minute" '+%s'`
      while [[ `date '+%s'` -lt $WAITEND ]]; do
        if ./sccl_test_resource -r $1; then
          exit 0
        fi
        echo -n "."
        sleep 5
      done
      echo
    fi
    echo "Das Paket $1 muss im Cluster laufen."
    echo "CPKG - package $1 not running" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    exit 1
  ;;
########################################################################################
# Pakete testen
#
  CPKGO)
    if [[ -n "$SCCLINITIGNORE" ]]; then
      if [[ "$SCCLINITIGNORE" == $1:* ]]; then
        exit 0
      fi
    fi
    for i in ${1//,/ }; do
      if ./sccl_test_resource -r $i; then
        exit 0
      fi
    done
    if [[ $3 =~ ^[0-9]+$ ]]; then
      MAXWAIT=$3
    else
      MAXWAIT=5
    fi
    if [[ "$2" == WAIT* ]]; then
      echo -n "wating for starting on one of $1 "
      WAITEND=`date -d "+$MAXWAIT minute" '+%s'`
      while [[ `date '+%s'` -lt $WAITEND ]]; do
        for i in ${1//,/ }; do
          if ./sccl_test_resource -r $i; then
            exit 0
          fi
        done
        echo -n "."
        sleep 5
      done
      echo
    fi
    echo "Eines der Pakete $1 muss im Cluster laufen."
    echo "CPKGO - none of $1 is running" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    exit 1
  ;;
########################################################################################
# Paketestart testen
#
  CPKGW)
    if [[ -n "$SCCLINITIGNORE" ]]; then
      if [[ "$SCCLINITIGNORE" == $1:* ]]; then
        exit 0
      fi
    fi
    if [[ $2 =~ ^[0-9]+$ ]]; then
      WAIT=$2
    else
      echo "Wartezeit nicht angegeben"
      echo "CPKGW - missing sleeptime" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
      exit 1
    fi
    START=$(./sccl_get_start $1)
    if [[ -z "$START" ]]; then
      if [[ $3 =~ ^[0-9]+$ ]]; then
        MAXWAIT=$3
      else
        MAXWAIT=5
      fi
      echo -n "wating for starting $1 "
      WAITEND=$(date -d "+$MAXWAIT minute" '+%s')
      while [[ -z "$START" && $(date '+%s') -lt $WAITEND ]]; do
        START=$(./sccl_get_start $1)
        sleep 5
        echo -n "."
      done
      echo
      if [[ -z "$START" ]]; then
        echo "Das Paket $1 muss im Cluster laufen."
        echo "CPKGW - package $1 not running" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
        exit 1
      fi
    fi
    if [[ $(date '+%s') -lt $(( $START + $WAIT )) ]]; then
      echo "wating $(( $START + $WAIT - $(date '+%s') )) seconds"
      sleep $(( $START + $WAIT - $(date '+%s') ))
    fi
    exit 0
  ;;
########################################################################################
# Paket testen
#
  PKG)
    if ! grep -q '^'$1'[[:blank:]]' $RESOURCES; then
      echo "Error: Die Resource $1 ist nicht definiert"
      exit 1
    fi
    if [[ "$2" = "WAIT" ]]; then
      if [[ $3 =~ ^[0-9]+$ ]]; then
        MAXWAIT=$3
      else
        MAXWAIT=5
      fi
      SLEEP='sleep 60'
    else
      MAXWAIT=1
      SLEEP=:
    fi
    WAIT=0
    while [[ $WAIT -lt $MAXWAIT ]]; do
      if ./sccl_test_res $1; then
        exit 0
      fi
      WAIT=$(( $WAIT + 1 ))
      $SLEEP
    done
    echo "Das Paket $1 muss auf diesem Knoten laufen."
    echo "PKG - package $1 not running" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    exit 1
  ;;
########################################################################################
# Ausschlusspaket auf gleichem Knoten testen
#
  !PKG)
    if ./sccl_test_res $1; then
      if [[ "$2" = "STOP" || "$2" = "SWITCH" ]]; then
        if ! ./sccl_stop -i "$SCCLINITIGNORE" $1; then
          echo "Das Paket $1 Kann nicht gestoppt werden!"
          echo "!PKG - error on stopping $1" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
          exit 1
        fi
        exit 0
      else
        echo "Das Paket $1 darf nicht gleichzeitig laufen!"
        echo "!PKG - package $1 is running" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
        exit 1
      fi
    fi
  ;;
########################################################################################
# Ausschlusspaket im Cluster testen
#
  !CPKG)
    if ./sccl_test_resource $1; then
      if [[ "$2" = "STOP" || "$2" = "SWITCH" ]]; then
        if ! ./sccl_stop -i "$SCCLINITIGNORE" $1; then
          echo "Das Paket $1 kann nicht gestoppt werden!"
          echo "!CPKG - error on stopping $1" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
          exit 1
        fi
        exit 0
      else
        echo "Das Paket $1 darf nicht gleichzeitig laufen!"
        echo "!CPKG - package $1 is running" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
        exit 1
      fi
    fi
  ;;
########################################################################################
# Restart von aktiven Paketen
#
  RST)
    if [[ "$SCCLNORST" = "--norst" ]]; then
      echo "RST wird nicht ausgeführt"
      exit 0
    fi
    if [[ -s "$LOCKDIR/$PKGNAME.RST" || -s "$LOCKDIR/$PKGNAME.LRST" ]]; then
      tac "$LOCKDIR/$PKGNAME.RST" "$LOCKDIR/$PKGNAME.LRST" 2>/dev/null | grep -E "^(${1//,/|})[[:blank:]]" | while read j n; do
        for i in $n; do
          if [[ "$SCCLINITIGNORE" != "$j:$i" ]]; then
            ./sccl_start_bg -S -I "${scclinitiated:-$THISHOSTNAME} / $PACKAGE" $SCCLBOOT -i "$THISINITIGNORE" $j $i
          fi
        done
      done
    elif [[ "$2" = "CLUSTER" ]]; then
      for i in $NODES; do
        ./sccl_restart -I "${scclinitiated:-$THISHOSTNAME} / $PACKAGE" -i "$THISINITIGNORE" $1 $i
      done
    else
      ./sccl_restart -I "${scclinitiated:-$THISHOSTNAME} / $PACKAGE" -i "$THISINITIGNORE" $1
    fi
    exit 0
  ;;
########################################################################################
# wird nur beim Stoppen geprüft
#
  MINPKGS)
    exit 0
  ;;
########################################################################################
# wird nur beim Stoppen geprüft
#
  CSRV)
    exit 0
  ;;
########################################################################################
# Paket als laufend markieren
#
  SETSTATE)
    set_lockdat $PKGNAME $PKGNAME $PIDSIG
    echo "Das Paket '$PACKAGE' wurde auf $THISHOSTNAME gestartet."
    exit 2
  ;;
########################################################################################
# Paket wieder stoppen aber "OK" liefern
#
  TEARDOWN)
    echo "Das Paket '$PACKAGE' wird wieder heruntergefahren."
    exit 3
  ;;
########################################################################################
  *)
    echo "Ungueltiger Resourcetyp $RESTYP in $RES"
    echo "$RESTYP - unknown resourcetype" >"$LOCKDIR/$PKGNAME$LASTERROREXTENSION"
    exit 1
  ;;
esac
