#!/bin/bash
#
# sccl_start_package Startet ein Paket im Script-Cluster
#
# Aufruf:
#
# sccl_start_package [--simulate|--force] [-r] [-p <startpar>] [-x <extrapar>] <resource> <pidsig>
#
# Die Resource <resource> wird gestartet, nachdem alle Abhaengigkeiten
# erfuellt sind. -R: Das Paket soll als Untergeordnete Resource gestartet werden.
#
# exitwerte
#   0: wurde gestartet oder schon laufendes Unterpaket
#   1: läuft schon
#   2: resource nicht erfüllt
#   3: läuft auf anderem Knoten
#   4: starting
#   5: lock kann nicht gesetzt werden
#   6: start abgebrochen
########################################################################################
#
. $(dirname $0)/globals.settings
#
unset FORCE MULTIFLAG EXECUTE CALLPARS SIMULATE RESFLAG IGNORESTARTING
#
while getopts up:Sx:-:w? op; do
  case "$op" in
   u) RESFLAG=1;;
   x) CALLPARS="$CALLPARS -x $OPTARG";;
   p) CALLPARS="$CALLPARS -p $OPTARG";;
   S) IGNORESTARTING=1;;
   -) case "$OPTARG" in
       force) FORCE='--force';;
       simulate) SIMULATE='--simulate';;
       *)     echo "usage: $MYPRG [--simulate|--force] [-p <startpar>] [-x <extrapar>] [-i <initignore>] <package> [<node>]"
              exit 1;;
      esac;;
   ?) echo "usage: $MYPRG [--simulate|--force] [-p <startpar] [-x <extrapar>] [-i <initignore>] <package> [<node>]"
      exit 1;;
  esac
done
#
shift $(( $OPTIND - 1))
#
if [[ ! -f $RESOURCES ]]; then
  exit 1
fi
#
PKG="$1"
PIDSIG="${2:-$(date '+%s')$$$THISHOSTNAME}"
#
PKG="$1"
if grep -q '^'$1'[[:blank:]]' $RESOURCES; then
  eval set `grep '^'$1'[[:blank:]]' $RESOURCES`
else
  echo "Das Paket '$PKG' ist in der $RESOURCES nicht konfiguriert!"
  exit 1
fi
#
PKGNAME=$1
shift
LONGNAME=$1
shift
if [[ "$1" = "MULTI" ]]; then
  MULTIFLAG=1
  MULTEXE=--multi
  shift
elif [[ "$1" = "SWITCH" ]]; then
  shift
elif [[ "$1" = "EXECUTE" ]]; then
  EXECUTE=1
  MULTEXE=--execute
  shift
fi
#
#
# Testen, ob die Resource schon auf diesem Knoten laeuft
#
if [[ -z "$EXECUTE" ]] && ./sccl_test_res_on_node $PKGNAME; then
  echo "$PKGNAME ($LONGNAME) laeuft schon auf $THISHOSTNAME."
  if [[ -n "$RESFLAG" ]]; then                        # Unterresource?
    set_lockdat $PKGNAME $PKGNAME $PIDSIG        # dann nur Lockdatei setzen
    exit 0
  else
    exit 1
  fi
fi
#
# Laeuft noch nicht, dann ggf. starten
#
if [[ -z "$MULTIFLAG$EXECUTE" ]]; then          # darf nicht auf mehreren Knoten laufen?
  if AKTNODE=`./sccl_get_actnode $PKGNAME`; then   # aktuellen Knoten
    echo "$PKGNAME ($LONGNAME) laeuft schon auf $AKTNODE."      # Fehler
    exit 3
  fi
fi
#
# Laeuft nicht im Cluster oder darf mehrfach gestartet werden
#
unset SETSTATE RES
if [[ -z "$SIMULATE" ]]; then
  #
  if [[ -n "$EXECUTE" ]]; then
    if ! set_progress $PKGNAME 'executing'; then
      [[ -z "$IGNORESTARTING" ]] && echo "Das Paket '$PKGNAME' wird schon ausgeführt"
      exit 4
    fi
  else
    set_progress $PKGNAME 'starting'
    R=$?
    if [[ $R != 0 ]]; then
      if [[ $R = 4 ]]; then
        [[ -z "$IGNORESTARTING" ]] && echo "Das Paket '$PKGNAME' wird schon gestartet"
        exit 4
      elif [[ -n "$SCCLBOOT" && $R = 1 ]]; then
        echo -n "Auf Paketstart warten"
        WAITEND=$(date -d "+${BOOTWAITSTART:-5} minute" '+%s') 
        while [[ `date '+%s'` -lt $WAITEND && -f "$LOCKDIR/$PKGNAME$PROGRESSEXTENSION" ]]; do
          echo -n "."
          sleep 5
        done
        if ./sccl_test_res_on_node $PKGNAME; then
          echo
          echo "Paket läuft"
          exit 1
        fi
      fi
      exit 5
    fi
  fi
  #
  while [[ $# -ge 1 ]]; do
    if [[ -f "$LOCKDIR/${PACKAGE}_start_progress" ]] && grep -q "^$PIDSIG KILLSTART" "$LOCKDIR/${PACKAGE}_start_progress"; then
      R=6
    else
      ./sccl_start_resource $FORCE $MULTEXE $CALLPARS "$1" $PKGNAME $PIDSIG    # einzelne Res. hochfahren
      R=$?
    fi
    if [[ $R != 0 ]]; then
      if [[ $R = 2 ]]; then
        SETSTATE=1
      elif [[ -z "$SETSTATE" ]]; then
        if [[ $R = 6 ]]; then
          echo "Der Start wurde abgebrochen"
        elif [[ $R != 3 ]]; then
          echo "Die Resource $1 zu $PKGNAME ($LONGNAME) ist nicht erfuellt."
          R=2
        fi
        if [[ -z "$EXECUTE" ]]; then
          echo "Das Paket wird wieder beendet."
          eval ./sccl_stop_res_rev $PKGNAME $PIDSIG $RES     # Fehler, dann alle gestarteten
                                                         # Res. wieder stoppen
        fi
        del_progress $PKGNAME
        exit $R
      fi
    fi
    RES="$RES $1"                                      # gestartete Res. merken
    shift
  done
  #
  if [[ -f "$LOCKDIR/$PKGNAME.RST" ]]; then
    rm "$LOCKDIR/$PKGNAME.RST"
    ./sccl_dist_lockfile -d $PKGNAME.RST
  fi
  [[ -f "$LOCKDIR/$PKGNAME.LRST" ]] && rm "$LOCKDIR/$PKGNAME.LRST"
  #
  if [[ -z "$EXECUTE" ]]; then
    set_lockdat $PKGNAME $PKGNAME $PIDSIG
    if [[ -z "$RESFLAG" ]]; then
      echo $PAKETHEADER$LONGNAME >>"$LOCKDIR/$PKGNAME$LOCKEXTENSION"
    fi
    echo $PKGPIDSIGHEADER$PIDSIG >>"$LOCKDIR/$PKGNAME$LOCKEXTENSION"
    echo $PKGRESHEADER`grep '^'$PKGNAME'[[:blank:]]' $RESOURCES` >>"$LOCKDIR/$PKGNAME$LOCKEXTENSION"
    echo "$PKGNAME ($LONGNAME) ist auf dem Knoten $THISHOSTNAME gestartet."
  else
    echo "$PKGNAME ($LONGNAME) wurde auf dem Knoten $THISHOSTNAME ausgeführt."
  fi
  del_progress $PKGNAME
else
  while [[ $# -ge 1 ]]; do
    ./sccl_start_resource_simulate $FORCE $MULTEXE $CALLPARS "$1" $PKGNAME $PIDSIG
    R=$?
    if [[ $R != 0 ]]; then
      if [[ $R = 2 ]]; then
        SETSTATE=1
      elif [[ -z "$SETSTATE" ]]; then
        if [[ $R != 3 ]]; then
          echo "Die Resource $1 zu $PKGNAME ($LONGNAME) ist nicht erfuellt."
          R=2
        fi
        if [[ -z "$EXECUTE" ]]; then
          echo "Das Paket wird wieder beendet."
          eval ./sccl_stop_res_rev_simulate $PKGNAME $PIDSIG $RES     # Fehler, dann alle gestarteten
                                                                       # Res. wieder stoppen
        fi
        exit $R
      fi
    fi
    RES="$RES $1"                                      # gestartete Res. merken
    shift
  done
  if [[ -z "$EXECUTE" ]]; then
    echo "Der Start von $PKGNAME ($LONGNAME) auf dem Knoten $THISHOSTNAME wurde simuliert."
  else
    echo "Die Ausführung von $PKGNAME ($LONGNAME) wurde auf dem Knoten $THISHOSTNAME simuliert."
  fi
fi
