#!/bin/bash
#
# flush_test_values
#
# Verzeichnis (/var/tmp/uls) mit den gespeicherten ULS-Werten als .fpz-Datei
# verpackt ans ULS senden.
#
# Aufruf:
#
# flush_test_values [-t] [-h <checkhost>] [-f] [-s <seks>|-S] [-u <ulsserver:port>] [<Verzeichnis>]
#
###################################################################################
#
unset WS USRV FORCE NOEXTRAWAIT CHECKHOST TESTCONNECTION
while getopts th:fSs:u:? op
 do
  case "$op" in
    t) TESTCONNECTION=1;;
    h) CHECKHOST="$OPTARG";;
    f) FORCE=1;;
    S) NOEXTRAWAIT=1;;
    s) if echo "$OPTARG" | grep -q '^[0-9][0-9]*$'
        then
         WS="$OPTARG"
       fi
       NOEXTRAWAIT=1
       ;;
    u) USRV="$OPTARG"
       ;;
    *) echo "usage: `basename $0` [-t] [-h <checkhost>] [-f] [-s <seks>] [-u <ulsserver:port>] [<path>]"
       exit 1;;
  esac
done
shift $(( $OPTIND - 1))
#
if [[ -f /etc/uls/uls.conf ]]
 then
  . /etc/uls/uls.conf
else
  ULSHOSTNAME=`hostname`
fi
#
if [[ -n "$USRV" ]]
 then
  ULSSERVER="$USRV"
  ULSSERVER2=""
fi
#
if [[ -n "$TESTCONNECTION" ]]
 then
  if [[ "${ULSSERVER:-STORE}" = "STORE" ]]
   then
    echo "There is no ULS-Server configured."
    exit 1
  fi
  if STATUS=`httpget -tc 5 $SFLAGS -u logging -p lgput -s $ULSSERVER get_status.s2w?hostname=${CHECKHOST:-$ULSHOSTNAME}`
   then
    echo "$STATUS"
    exit 0
  else
    echo "Error on connecting ULS-Server at $ULSSERVER"
  fi
  exit 1
fi
#
if [[ -z "$ULS_TMP_PATH" ]]
 then
  ULS_TMP_PATH=/var/tmp/uls
fi
#
if [[ -z "$ULS_STORE_PATH" ]]
 then
  ULS_STORE_PATH=/var/tmp/uls-store
fi
#
SEND_PATH="$1"
if [[ -n "$SEND_PATH" ]]
 then
  if echo "$SEND_PATH" | grep -vq '^/'
   then
    SEND_PATH="`pwd`/$SEND_PATH"
  fi
fi
#
if [[ -n "$WS" ]]
 then
  SWAIT="$WS"
elif echo "$SENDWAIT" | grep -vq '^[0-9][0-9]*$'
 then
  SWAIT=10
else
  SWAIT=$SENDWAIT
fi
#
store()
{ ST=".$$"
  if [[ -n "$ULS_COPY_PATH" ]]
   then
    if [[ ! -d "$ULS_COPY_PATH" ]]
     then
      mkdir -m 1777 -p "$ULS_COPY_PATH"
      [[ -n "$ULS_COPY_USER" ]] && chown "$ULS_COPY_USER" "$ULS_COPY_PATH"
    fi
    if [[ -d "$ULS_COPY_PATH" ]]
     then
      COPY_DAT="$ULS_COPY_PATH"/`date '+%FT%T'`.$$.uls
    else
      COPY_DAT=""
    fi
  else
    COPY_DAT=""
  fi
  if cd "$ULS_STORE_PATH" 2>/dev/null || (mkdir -m 1777 -p "$ULS_STORE_PATH" && cd "$ULS_STORE_PATH" && [[ -z "$ULS_STORE_USER" ]] || chown "$ULS_STORE_USER" "$ULS_STORE_PATH") && cd "$ULS_STORE_PATH" 2>/dev/null
   then
    umask 077
    if [[ `ls "$1"/* 2>/dev/null | wc -l` -gt 0 ]]
     then
      DT=`date '+%y%j%H%M%S-'`
      for i in "$1"/*
       do
        if [[ "${i%.uls}" != "$i" ]]
         then
          N="$ULS_STORE_PATH/$DT${i##*/}"
        else
          N="$ULS_STORE_PATH/${i##*/}"
        fi
        if [[ -n "$ULS_STORE_USER" ]]
         then
          touch "$N"
          chown "$ULS_STORE_USER" "$N"
        fi
        cat "$i" >> "$N"
        if [[ -n "$COPY_DAT" ]]
         then
          if [[ "${i%.uls}" != "$i" ]]
           then
            cat "$i" >>"$COPY_DAT"
            [[ -n "$ULS_COPY_USER" ]] && chown "$ULS_COPY_USER" "$COPY_DAT"
          else
            cp "$i" "$ULS_COPY_PATH"
            [[ -n "$ULS_COPY_USER" ]] && chown -R "$ULS_COPY_USER" "$ULS_COPY_PATH"
          fi
        fi
        rm "$i"
      done
      sleep 1
      rm -r "$1"
      if [[ -d "$1" ]]
       then
        sleep 30
        rm -r "$1"
      fi
    elif [[ "$1" != "$ULS_TMP_PATH" ]]
     then
      rmdir "$1"
    fi
  else
    echo "Kann Lokales ULS-Verzeichnis: $ULS_STORE_PATH nicht anlegen!"
    exit 1
  fi
}
#
if [[ `id -u` -ne 0 ]]
 then
  if [[ -z "$SEND_PATH" ]]
   then
    echo "ERROR: $USER hat keine root-Rechte!"
    exit 1
  fi
  if [[ -d "$SEND_PATH" ]]
   then
    if [[ `id -u` -ne 0 && `ls -dn "$SEND_PATH" | awk '{print $3}'` -ne `id -u` ]]
     then
      echo "ERROR: $USER ist nicht der Owner des Verzeichnisses $1."
      exit 1
    fi
    if [[ -n "$WS" ]]
     then
      sleep $WS
    fi 
    if [[ "$ULSSERVER" = "STORE" && -n "$ULS_STORE_USER" || -n "$ULS_COPY_PATH" && -n "$ULS_COPY_USER" ]]
     then
      if ! cd "$ULS_TMP_PATH" 2>/dev/null
       then
        mkdir -m 1777 -p "$ULS_TMP_PATH"
        if ! cd "$ULS_TMP_PATH" 2>/dev/null
         then
          echo "Kann Lokales ULS-Verzeichnis: $ULS_TMP_PATH nicht anlegen!"
          exit 1
        fi
      fi
      mv "$1"/* .
      rmdir "$1"
      echo "Values stored"
      exit 0
    fi
  else
    echo "ERROR: $SEND_PATH ist kein Verzeichnis!"
    exit 1
  fi
fi
#
if [[ ! -d "${SEND_PATH:-$ULS_TMP_PATH}" ]]
 then
  exit 0
fi
# 
if [[ "${ULSSERVER:-STORE}" = "STORE" ]]
 then
  if [[ -n "$SEND_PATH" ]]
   then
    store "$SEND_PATH"
  else
    mv "$ULS_TMP_PATH" "$ULS_TMP_PATH.$$"
    mkdir -m 1777 -p "$ULS_TMP_PATH"
    sleep $SWAIT
    store "$ULS_TMP_PATH.$$"
  fi
  exit 0
fi
#
if [[ -z "$NOEXTRAWAIT" ]]
 then
  if which usleep >/dev/null 2>&1
   then
    usleep $(( $RANDOM * 1000 ))
  else
    sleep $(( $RANDOM % 30 ))
  fi
fi
if STATUS=`httpget $SFLAGS -u logging -p lgput -s $ULSSERVER get_status.s2w?hostname=${CHECKHOST:-$ULSHOSTNAME}`
 then
  if [[ "$STATUS" = "OK" ]]
   then
    if [[ -n "$SEND_PATH" ]]
     then
      TMPDIR="$SEND_PATH"
    else
      if [[ -d "$ULS_STORE_PATH" && `ls "$ULS_STORE_PATH"/* 2>/dev/null | wc -l` -gt 0 ]]
       then
        ( STMPDIR="$ULS_STORE_PATH.`date '+%s'`.$$"
          mv "$ULS_STORE_PATH" "$STMPDIR"
          sleep 1
          if cd "$STMPDIR"
           then
            if [[ `cat *.uls 2>/dev/null | wc -l` -lt ${MAX_VALUES_TO_FLUSH:-2000000} ]]
             then
              RET=`filepack -d . | gzip -1 | httpget $SFLAGS -u logging -p lgput -s -mf "ulsdat.fpz" -m- -mn ULSDATA $ULSSERVER "put_test_fpz.s2w"`
              if [[ "$RET" = "OK" ]]
               then
                cd .. && rm -rf "$STMPDIR"
              else
                if cd "$ULS_STORE_PATH" 2>/dev/null || (mkdir -m 1777 -p "$ULS_STORE_PATH" && cd "$ULS_STORE_PATH" && [[ -z "$ULS_STORE_USER" ]] || chown "$ULS_STORE_USER" "$ULS_STORE_PATH") && cd "$ULS_STORE_PATH" 2>/dev/null
                 then
                  mv "$STMPDIR"/* .
                  cd .. && rmdir "$STMPDIR"
                fi
                date >>/var/tmp/flush_test_values.err
                echo "Error on sending values from $STMPDIR" >>/var/tmp/flush_test_values.err
                echo $RET >>/var/tmp/flush_test_values.err
              fi
            else
              echo "Unable to send more then ${MAX_VALUES_TO_FLUSH:-2000000} values."
              echo "The values are stored in  '$STMPDIR'."
            fi
          fi
        )
      fi
      TMPDIR="$ULS_TMP_PATH.`date '+%s'`.$$"
      mv "$ULS_TMP_PATH" "$TMPDIR"
      mkdir -m 1777 -p "$ULS_TMP_PATH"
      sleep $SWAIT
    fi
    if cd "$TMPDIR"
     then
      if [[ -n "$FORCE" ]]
       then
        LINES=1
      else
        LINES=`cat *.uls 2>/dev/null | wc -l`
      fi
      if [[ $LINES -lt ${MAX_VALUES_TO_FLUSH:-2000000} ]]
       then
        RET=`filepack -d . | gzip -1 | httpget $SFLAGS -u logging -p lgput -s -mf "ulsdat.fpz" -m- -mn ULSDATA $ULSSERVER "put_test_fpz.s2w"`
        if [[ "$RET" != "OK" ]]
         then
          cd ..
          if [[ -z "$USRV" ]]
           then
            store $TMPDIR
          fi
          echo "Error: $RET"
        else
          if [[ -n "$ULSSERVER2" ]]
           then
            filepack -d . | gzip -1 | httpget $SFLAGS -u logging -p lgput -s -mf "ulsdat.fpz" -m- -mn ULSDATA $ULSSERVER2 "put_test_fpz.s2w"
          fi
          cd /
          if [[ -n "$ULS_COPY_PATH" ]]
           then
            if [[ ! -d "$ULS_COPY_PATH" ]]
             then
              mkdir -m 700 -p "$ULS_COPY_PATH"
              [[ -n "$ULS_COPY_USER" ]] && chown "$ULS_COPY_USER" "$ULS_COPY_PATH"
            fi
            if [[ -d "$ULS_COPY_PATH" ]]
             then
              COPY_DAT="$ULS_COPY_PATH"/`date '+%FT%T'`.$$.uls
              for i in `ls "$TMPDIR/"`
               do
                if [[ "${i%.uls}" != "$i" ]]
                 then
                  cat "$TMPDIR/$i" >>"$COPY_DAT"
                  [[ -n "$ULS_COPY_USER" ]] && chown "$ULS_COPY_USER" "$COPY_DAT"
                else
                  cp "$TMPDIR/$i" "$ULS_COPY_PATH"
                  [[ -n "$ULS_COPY_USER" ]] && chown -R "$ULS_COPY_USER" "$ULS_COPY_PATH"
                fi
              done
            fi
          fi
          sleep 1
          rm -r "$TMPDIR"
          if [[ -d "$TMPDIR" ]]
           then
            sleep 30
            rm -r "$TMPDIR"
          fi
        fi
      else
        echo "Es koennen nur ${MAX_VALUES_TO_FLUSH:-2000000} Werte gesendet werden!"
        echo "Das Verzeichnis $TMPDIR enthaelt die nicht gesendeten Werte."
      fi
    fi
    exit 0
  else
    echo "Error: $STATUS"
  fi
fi
if [[ -n "$SEND_PATH" && -z "$USRV" ]]
 then
  store "$SEND_PATH"
fi
