#!/bin/bash
#
# sccl_list_packages_on_node listet aktive Paket im Script-Cluster eines Nodes auf
#
# Aufruf:
#
# sccl_list_packages_on_node [-a|-s] [-u|-U] [-L] [<node>]
#   -a: all packages (no -a and no -s: only running packages)
#   -s: packages with status
#       respond:
#         <pkgname1> <status>
#         <pkgname2> <status>
#         ...
#   -t: including TSTD packages
#   -T: nur TSTD Pakete
#   -u: unsorted from packages.conf
#   -U: unsorted reverse from packages.conf
#   -L: local node
#
#  <status>:
#    ''    : not running
#    R     : running
#    r     : starting after SETSTATE
#    S     : starting
#    e     : executing
#    E     : Error on last start / executing
#    s     : stopping
#    !     : stopping failed
#    N     : node stopped
#    B     : node booting
#    D     : node disabled
#
# Die Pakete des Knoten <node> werden ausgegeben.
# Ist <node> nicht angegeben, dann des aufrufenden Nodes
#
########################################################################################
#
# ist [<node>] angegeben? wenn ja, dann sccl_list_packages_on_node auf $1 ausfuehren
#
. $(dirname $0)/globals.settings
#
unset LOCALFLAG ALLFLAG UFLAG ALL ADDTSTD ONLYTSTD
OUTFILTER="sort -u"
#
while getopts LastTuU? op; do
  case "$op" in
    L) LOCALFLAG=1;;
    a) ALLFLAG=-a
       ALL=1;;
    s) ALLFLAG=-s
       ALL=2;;
    t) ADDTSTD=1;;
    T) ADDTSTD=1
       ONLYTSTD=1;;
    u) UFLGA="-u"
       OUTFILTER="cat";;
    U) UFLGA="-U"
       OUTFILTER="tac";;
    ?) echo "usage: $MYPRG [-a|-s] [-u|-U] [-L] [<node>]"
       exit 1;;
  esac
done
shift $(( $OPTIND - 1))
#
if [[ $# -gt 1 ]]; then
  echo "usage: $MYPRG [<node>]"
  exit 1
fi
#
NODE=${1:-$THISHOSTNAME}
#
if [[ ($NODE = $THISHOSTNAME || $NODE = $THISFQDN) && -r /etc/sccl/localadminpwd.dat || "$LOCALFLAG" = "1" ]]; then
  if [[ ! -f $PACKAGES ]]; then
    echo "Error: $PACKAGES not found" >&2
    exit 1
  fi
  if [[ "$ALL" = "1" ]]; then
    grep -v "^ *#" $PACKAGES | grep -E "[[:blank:],]$THISHOSTNAME[[:blank:],]|[[:blank:],]$THISHOSTNAME\$|[[:blank:],]$THISFQDN[[:blank:],]|[[:blank:],]$THISFQDN\$" | awk '{print $1}' | $OUTFILTER
  elif [[ "$ALL" = "2" ]]; then
    grep -v "^ *#" $PACKAGES | grep -E "[[:blank:],]$THISHOSTNAME[[:blank:],]|[[:blank:],]$THISHOSTNAME\$|[[:blank:],]$THISFQDN[[:blank:],]|[[:blank:],]$THISFQDN\$" | awk '{print $1}' | while read p; do
      if [[ -s "$LOCKDIR/$p$LOCKEXTENSION" ]]; then
        if [[ -f "$LOCKDIR/$p$PROGRESSEXTENSION" ]]; then
          if grep -Fq ' starting' "$LOCKDIR/$p$PROGRESSEXTENSION"; then
            echo "$p r"
          elif grep -Fq ' stopping failed' "$LOCKDIR/$p$PROGRESSEXTENSION"; then
            echo "$p !"
          else
            echo "$p s"
          fi
        else
          echo "$p R"
        fi
      elif [[ -f "$LOCKDIR/$p$PROGRESSEXTENSION" ]]; then
        if grep -Fq ' executing' "$LOCKDIR/$p$PROGRESSEXTENSION"; then
          echo "$p e"
        else
          echo "$p S"
        fi
      elif [[ -s "$LOCKDIR/$p$LASTERROREXTENSION" ]]; then
        echo "$p E"
      elif [[ -f "$LOCKDIR/node.DISABLED" ]]; then
        echo "$p D"
      elif [[ -f "$LOCKDIR/node.BOOTING" ]]; then
        echo "$p B"
      elif [[ -f "$LOCKDIR/node.STOPPED" ]]; then
        echo "$p N"
      else
        echo "$p"
      fi
    done
  else
    if [[ -z "$ONLYTSTD" ]]; then
      grep -v "^ *#" $PACKAGES | grep -E "[[:blank:],]$THISHOSTNAME[[:blank:],]|[[:blank:],]$THISHOSTNAME\$|[[:blank:],]$THISFQDN[[:blank:],]|[[:blank:],]$THISFQDN\$" | awk '{print $1}' | while read p; do
        if grep -q $PAKETHEADER "$LOCKDIR/$p$LOCKEXTENSION" 2>/dev/null && [[ ! -f "$LOCKDIR/$p$PROGRESSEXTENSION" ]]; then
          echo $p
        fi
      done
    fi
    if [[ -n "$ADDTSTD" ]]; then
      ls /var/clusterlocks/ | sed -n 's|^\(TSTD_.*\)_lock$|\1|p'
    fi
  fi | $OUTFILTER
elif [[ "$ALLFLAG" = "-s" ]]; then
  readnode $NODE "sccl_list_packages_on_node_stat.s3w"
  RET=$?
  if [[ $RET -eq 0 ]]; then
    exit 0
  fi
  if [[ $RET = 16 && $NODE = $THISHOSTNAME ]]; then
    ./sccl_list_packages_on_node -L -s
    exit $?
  elif [[ $RET = 4 ]]; then
    echo "Error: Probably wrong password on connecting to $NODE" >&2
    { readnode $NODE "sccl_list_packages_on_node.s3w"
      RET=$?
    } | sed 's/$/ R/'
    exit $RET
  elif [[ "$HBNODES" = *"$NODE$HBNODE_EXT"* ]]; then
    readnode $NODE$HBNODE_EXT "sccl_list_packages_on_node_stat.s3w"
    RET=$?
    if [[ $RET -eq 0 ]]; then
      exit 0
    fi
    if [[ $RET = 4 ]]; then
      echo "Error: Probably wrong password on connecting to $NODE" >&2
      { readnode $NODE$HBNODE_EXT "sccl_list_packages_on_node.s3w"
        RET=$?
      } | sed 's/$/ R/'
      exit $RET
    fi
  fi
  exit 1
elif ! readnode $NODE "sccl_list_packages_on_node.s3w?allflag=$ALLFLAG&UFLAG=$UFLAG"; then
  if [[ "$HBNODES" = *"$NODE$HBNODE_EXT"* ]]; then
    readnode $NODE$HBNODE_EXT "sccl_list_packages_on_node.s3w?allflag=$ALLFLAG&UFLAG=$UFLAG"
  else
    exit 1
  fi
fi
