#!/bin/bash
#
# jobmonitor2uls
#
# Job starten und Ergebnisse, Laufzeit und Start-Stopp-Zeit ans ULS schicken
#
# Aufruf:
# jobmonitor2uls [-d <storepath>] [-S] [-u <timeunit>] [-h <hostname>] [-s <Section>]
#                [-t <Teststep>] [-f|-z|-j|-J|-Z] <job.sh> [Parameter...]
# Defaults:       -u s -h `hostname` -s Jobs -t `basename <job.sh>` job.sh [Parameter...]
###############################################################################
#
if [[ ${PATH#*/usr/local/bin} = $PATH ]]; then
  export PATH=$PATH:/usr/local/bin
fi
#
if [[ $# -lt 1 ]]; then
  echo "usage: `basename $0` [-d <storepath>] [-S] [-u <timeunit>] [-h <hostname>] [-s <Section>] [-t <Teststep>] [-f|-z|-j|-J] <job.sh> [Parameter...]"
  exit 1
fi
#
DT=`date '+%Y-%m-%d %T%:z'`
START=`date '+%Y-%m-%d %H:%M:%S%:z'`
SSEC=$SECONDS
#
SECTION=Jobs
#
STDOUT=/tmp/STDOUT$$.`date '+%s'`.lst
EOUT=/tmp/EOUT$$.`date '+%s'`.lst
if ! touch $STDOUT; then
  STDOUT=/dev/shm/STDOUT$$.`date '+%s'`.lst
  EOUT=/dev/shm/EOUT$$.`date '+%s'`.lst
  if ! touch $STDOUT; then
    STDOUT=/var/tmp/STDOUT$$.`date '+%s'`.lst
    EOUT=/var/tmp/EOUT$$.`date '+%s'`.lst
  fi
fi
#
TUNIT=s
unset TEST_PFAD STOREFLAG FILEFLAG
while getopts d:Su:h:s:t:fzZjJ? op; do
  case "$op" in
    d) TEST_PFAD="-d $OPTARG";;
    S) STOREFLAG=-S;;
    u) TUNIT=$OPTARG;;
    h) SERVER="-h $OPTARG";;
    s) SECTION=$OPTARG;;
    t) TESTSTEP=$OPTARG;;
    f) FILEFLAG=f;;
    z) FILEFLAG=z;;
    Z) FILEFLAG=Z;;
    j) FILEFLAG=j;;
    J) FILEFLAG=J;;
    *) echo "usage: `basename $0` [-d <storepath>] [-S] [-u <timeunit>] [-h <hostname>] [-s <Section>] [-t <Teststep>] [-f|-z|-j|-J|-Z] <job.sh> [Parameter...]"
       exit 0
       ;;
  esac
done
shift $(( $OPTIND - 1))
#
if [[ $# -lt 1 ]]; then
  echo "usage: `basename $0` [-u <timeunit>] [-h <hostname>] [-s <Section>] [-t <Teststep>] [-f|-z|-j|-J|-Z] <job.sh> [Parameter...]"
  exit 1
fi
#
if [[ -z "$TESTSTEP" ]]; then
  TESTSTEP=$(basename "$1")
fi
#
send_test_value $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Start-Stop $DT "Start $START" '{T}'
#
PRG="$1"
shift
touch $STDOUT
touch $EOUT
chmod og-rw $STDOUT $EOUT
"$PRG" "$@" >$STDOUT 2> >(tee $EOUT)
RET=$?
#
END=`date '+%Y-%m-%d %H:%M:%S%:z'`
DAUER=$(( $SECONDS - $SSEC ))
#
LC_ALL=C
export LC_ALL
#
send_test_value $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Start-Stop $DT "Stop $END" '{T}'
case $TUNIT in
  m*) DAUER=`awk 'BEGIN{printf("%.2f", '$DAUER' / 60)}'`
      send_test_value $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Laufzeit $DT "$DAUER" 'min';;
  h*) DAUER=`awk 'BEGIN{printf("%.2f", '$DAUER' / 3600)}'`
      send_test_value $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Laufzeit $DT "$DAUER" 'h';;
  *)  send_test_value $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Laufzeit $DT "$DAUER" 's';;
esac
send_test_value $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Exitwert $DT "$RET" '#'
if [[ -s $STDOUT ]]; then
  case $FILEFLAG in
    f) send_file_value -n stdout.log $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Stdout $DT $STDOUT;;
    z|j|J|Z) send_file_value -$FILEFLAG -n stdout.log $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Stdout $DT $STDOUT;;
    *) if [[ $(stat -c '%s' $STDOUT) -gt 3000 ]]; then
         send_test_value $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Stdout $DT "$(head -50 $STDOUT | head -c 5000)

..." '_'
         send_file_value -n stdout.log $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Stdout $DT $STDOUT
       else
         send_test_value $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Stdout $DT "`cat $STDOUT`" '_'
      fi;;
  esac
fi
if [[ -s $EOUT ]]; then
  case $FILEFLAG in
    f) send_file_value -n errout.log $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Errorout $DT $EOUT;;
    z|j|J|Z) send_file_value -$FILEFLAG -n errout.log $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Errorout $DT $EOUT;;
    *) if [[ $(stat -c '%s' $EOUT) -gt 3000 ]]; then
         send_test_value $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Errorout $DT "$(head -50 $EOUT | head -c 5000)

..." '_'
         send_file_value -n errout.log $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Errorout $DT $EOUT
       else
         send_test_value $TEST_PFAD $STOREFLAG $SERVER "$SECTION" "$TESTSTEP" Errorout $DT "`cat $EOUT`" '_'
       fi;;
  esac
fi
#
rm -f $EOUT $STDOUT
#
exit $RET
