#!/bin/bash
#
# send_file_value
#
# Speichert logginginformationen in der Loggingdatenbank ueber einen httpget-Aufruf
#
# Aufruf:
#
# send_file_value [-U|-z|-j|-J|-Z] [-R] [-c charset] [-C contentchset|-G] [-n filename] [-d storepath] [-S] [-h host] [-s acc] [-a] section teststep details date time [<Datei>]
#
###################################################################################
#
if [[ -f /etc/uls/uls.conf ]]; then
  . /etc/uls/uls.conf
fi
#
if [[ -z "$ULSSERVER" ]]; then
  ULSSERVER="STORE"
fi
#
ULSSEND="STORE"
ACC="all"
if [[ ${LC_CTYPE:-$LANG} =~ [Uu][Tt][Ff]-?8 ]]; then
  CHARSET="utf8"
else
  CHARSET="latin1"
fi
#
if which xz &>/dev/null; then
  DEFCOMPRESS=xz
  DEFCOMPRESSEXT='.xz'
elif which bzip2 &>/dev/null; then
  DEFCOMPRESS=bzip2
  DEFCOMPRESSEXT='.bzip2'
elif which gzip &>/dev/null; then
  DEFCOMPRESS=gzip
  DEFCOMPRESSEXT='.gz'
else
  unset DEFCOMPRESS
fi
#
BFILE=/var/tmp/ULSBUF.$$
#
unset APPEND APP COMPRESS COMPRESSEXT REMOVE FILENAME NOCOMPRESSS READFROMSTDIN BUFFER CTCHARSET GUESSCTC GUESSEDCTC
#
while getopts n:ZzjJURIb:c:C:Gd:Sh:s:a? op; do
  case "$op" in
    b) BUFFER="-b $OPTARG -B $BFILE";;
    c) CHARSET="$OPTARG";;
    C) CTCHARSET=";$OPTARG";;
    G) GUESSCTC=1;;
    n) FILENAME="$OPTARG";;
    d) ULS_TMP_PATH=$(readlink -f "$OPTARG");;
    S) ULSSEND="$ULSSERVER";;
    h) ULSHOSTNAME="$OPTARG";;
    s) ACC=$OPTARG;;
    a) APPEND=_append
       APP=A;;
    z) COMPRESS=gzip
       COMPRESSEXT='.gz';;
    I) READFROMSTDIN=1;;
    j) COMPRESS=bzip2
       COMPRESSEXT='.bz2';;
    J) COMPRESS=xz
       COMPRESSEXT='.xz';;
    R) REMOVE=1;;
    U) NOCOMPRESS=1;;
    Z) if [[ -n "$DEFCOMPRESS" ]]; then
         COMPRESS=$DEFCOMPRESS
         COMPRESSEXT=$DEFCOMPRESSEXT
       fi;;
    *) echo "usage: $(basename $0) [-aSzjJZURI] [-b bufflen] [-c <charset>] [-C <ctcharset>|-G]
                       [-d <storepath>] [-h <hostname>] [-s <access>]
                       [-n <filename>] <section> <teststep> <detail> <date> <time> <path>
  -a            append data
  -S            send immediately
  -z            compress with gzip
  -j            compress with bzip2
  -J            compress with xz
  -Z            compress with xz, bzip2 or gzip if installed
  -U            no compression
  -I            read content from stdin
  -R            remove source after sending
  -b buflen     buffer unsended data
  -c charset    characterset (filename)
  -C ctcharset  content characterset
  -d storepath  store data in storepath and don't send to uls
  -G            guess content characterset (no function with -I)
  -h hostname   set hostname
  -n filename   set uls-filename
  -s access     set accessright
  section       uls-section
  testsep       uls-teststep
  detail        uls-detail
  date          date
  time          time
  path          path to file"
       exit 1;;
  esac
done
shift $(( $OPTIND - 1))
#
#
if [[ $# -ne 6 ]]; then
  echo "usage: `basename $0` [-z|-j|-J|-Z|-U] [-R] [-c charset] [-C <ctcharset>|-G] [-n filename] [-d storepath] [-S] [-h hostname] [-s access] [-a] section teststep details date time <path>"
  exit 1
fi
#
if [[ -z "$ULSHOSTNAME" ]]; then
  ULSHOSTNAME=`hostname`
fi
#
if [[ -n "$COMPRESS" ]] && ! which $COMPRESS &>/dev/null; then
  COMPRESS=$DEFCOMPRESS
  COMPRESSEXT=$DEFCOMPRESSEXT
elif [[ -z "$NOCOMPRESS" && -z "$COMPRESS" && $6 =~ [.]csv$|[.]cfg$|[.]cnf$|[.]conf$|[.]text$|[.]txt$|[.]html$|[.]xml$|[.]message$|[.]tmp$|[.]log$|[.]sql$|[.]par$|[.]err$|[.]lst$ && ( -n "$READFROMSTDIN" || $(stat -c '%s' "$6") -gt 300 ) ]]; then
  COMPRESS=$DEFCOMPRESS
  COMPRESSEXT=$DEFCOMPRESSEXT
fi
#
unset SENDBFILE
#
if [[ "$ULSSEND" != "STORE" ]]; then
  S=$(sed 's/?/%3f/g;s/#/%23/g;s/!/%21/g;s/\$/%24/g;s/&/%26/g;s/'"'"'/%27/g;s/(/%28/g;s/)/%29/g;s/\*/%2a/g;s/+/%2b/g;s/,/%2c/g;s/=/%3d/g;s/ /%20/g' <<<"$1")
  T=$(sed 's/?/%3f/g;s/#/%23/g;s/!/%21/g;s/\$/%24/g;s/&/%26/g;s/'"'"'/%27/g;s/(/%28/g;s/)/%29/g;s/\*/%2a/g;s/+/%2b/g;s/,/%2c/g;s/=/%3d/g;s/ /%20/g' <<<"$2")
  D=$(sed 's/?/%3f/g;s/#/%23/g;s/!/%21/g;s/\$/%24/g;s/&/%26/g;s/'"'"'/%27/g;s/(/%28/g;s/)/%29/g;s/\*/%2a/g;s/+/%2b/g;s/,/%2c/g;s/=/%3d/g;s/ /%20/g' <<<"$3")
  DA=$4
  TI=$5
  N=$(basename "$6")
  if [[ -n "$COMPRESS" ]]; then
    if [[ -n "$READFROMSTDIN" ]]; then
      RET=`$COMPRESS | httpget $SFLAGS $BUFFER -c -u logging -p lgput -s -mf "$N$COMPRESSEXT" -m- -mn $ULSHOSTNAME $ULSSERVER "put_test_blob$APPEND.s2w?fname=$ULSHOSTNAME&hostname=$ULSHOSTNAME&section=$S&teststep=$T&details=$D&access=$ACC&date=$DA&time=$TI&name=${FILENAME:-$N}$COMPRESSEXT&charset=$CHARSET"`
      HRET=$?
    else
      RET=`$COMPRESS -c "$6" | httpget $SFLAGS $BUFFER -c -u logging -p lgput -s -mf "$N$COMPRESSEXT" -m- -mn $ULSHOSTNAME $ULSSERVER "put_test_blob$APPEND.s2w?fname=$ULSHOSTNAME&hostname=$ULSHOSTNAME&section=$S&teststep=$T&details=$D&access=$ACC&date=$DA&time=$TI&name=${FILENAME:-$N}$COMPRESSEXT&charset=$CHARSET"`
      HRET=$?
    fi
  else
    if [[ -n "$READFROMSTDIN" ]]; then
      RET=`httpget $SFLAGS $BUFFER -c -u logging -p lgput -s -mf "$6" -m- -mn $ULSHOSTNAME $ULSSERVER "put_test_blob$APPEND.s2w?fname=$ULSHOSTNAME&hostname=$ULSHOSTNAME&section=$S&teststep=$T&details=$D&access=$ACC&date=$DA&time=$TI&name=${FILENAME:-$N}&charset=$CHARSET"`
      HRET=$?
    else
      RET=`httpget $SFLAGS $BUFFER -c -u logging -p lgput -s -mf "$6" -mn $ULSHOSTNAME $ULSSERVER "put_test_blob$APPEND.s2w?fname=$ULSHOSTNAME&hostname=$ULSHOSTNAME&section=$S&teststep=$T&details=$D&access=$ACC&date=$DA&time=$TI&name=${FILENAME:-$N}&charset=$CHARSET"`
      HRET=$?
    fi
  fi
  if [[ $HRET -eq 0 && "$RET" = "OK" ]]; then
    if [[ -n "$REMOVE" ]]; then
      rm "$6"
    fi
    exit 0
  fi
  if [[ -s "$BFILE" ]]; then
    SENDBFILE="$BFILE"
    unset COMPRESS READFROMSTDIN
  fi
fi
#
if [[ -z "$ULS_TMP_PATH" ]]; then
  ULS_TMP_PATH=/var/tmp/uls
fi
umask 077
S="`echo \"$1\" | sed 's/\\([\"\\;\\\\]\\)/\\\\\\1/g'`"
T="`echo \"$2\" | sed 's/\\([\"\\;\\\\]\\)/\\\\\\1/g'`"
D="`echo \"$3\" | sed 's/\\([\"\\;\\\\]\\)/\\\\\\1/g'`"
if [[ -n "$FILENAME" ]]; then
  N="`echo \"$FILENAME\" | sed 's/\\([\"\\;\\\\]\\)/\\\\\\1/g'`"
else
  N="`basename \"$6\" | sed 's/\\([\"\\;\\\\]\\)/\\\\\\1/g'`"
fi
ULSTMP="$(dirname $ULS_TMP_PATH)/ULSTMP.$$"
if [[ -n "$SENDBFILE" ]]; then
  mv "$SENDBFILE" "$ULSTMP"
elif [[ -n "$COMPRESS" ]]; then
  if [[ -n "$READFROMSTDIN" ]]; then
    $COMPRESS >"$ULSTMP"
  else
    $COMPRESS -c "$6" >"$ULSTMP"
  fi
else
  if [[ -n "$READFROMSTDIN" ]]; then
    cat >"$ULSTMP"
  else
    cp "$6" "$ULSTMP"
  fi
fi
if [[ -n "$GUESSCTC" ]]; then
  GUESSEDCTC=$(file -zbi "$ULSTMP" | sed -n 's/compressed-encoding=.*//;s/.* charset=\([^ ]*\).*/;\1/p')
fi
ULSDAT=dat-`id -u`.uls
if cd "$ULS_TMP_PATH" 2>/dev/null; then
  test -f $ULSDAT || touch $ULSDAT && chmod 600 $ULSDAT
else
  mkdir -m 1777 -p "$ULS_TMP_PATH"
  if cd "$ULS_TMP_PATH" 2>/dev/null; then
    touch $ULSDAT && chmod 600 $ULSDAT
  else
    echo "Kann Lokales ULS-Verzeichnis: $ULS_TMP_PATH nicht anlegen!"
    rm -f "$ULSTMP"
    exit 1
  fi
fi
#
mv "$ULSTMP" "$N.$$"
echo "L;;;;;;$CHARSET
F$APP;$4 $5;$ULSHOSTNAME;$S;$T;$D;$N.$$;$N$COMPRESSEXT;$ACC${GUESSEDCTC:-$CTCHARSET}" >>$ULSDAT
if [[ -n "$REMOVE" && -z "$READFROMSTDIN" ]]; then
  rm "$6"
fi
exit 0
