#!/bin/ksh
#
# check_filesystems
#
# 31.01.08 mod by XARY - added vxfs
# 22.01.08 mod by XARY - added special threshold table and code
# 17.01.08 mod by XARY - added cases for SunOS
# 30.10.07 mod by PST  grep -v /export/oradata
#

OS=$(uname)
HOST=`uname -n`

WLEVEL=90
ELEVEL=95
#
# global WLEVEL and ELEVEL are used only in case
# special thresholds not matched in Th table below
#
# Most exact entries like machine:filesystem take highest preference,
# then *:filesystem, then machine:*, only then fallback to global WLEVEL ELEVEL
#
Th="

	*:/                             92      96
	alaris-test:/                   94      97
	mint-test:/                     94      97
	*:/export/soft                  95      97
	*:/imtf/completed              110     130   # who cares, it's read-only
	imtfex1-cal:/imtf/localdisk     98      99
	imtfex1-cor:/imtf/localdisk     98      99
	titi-cal:/export/sybasedata     92      95   # it's at 90% for years now

"

usage () {
  echo "$(basename $0) [-w <warning> ] [-e <error] [-f <filesystem>] [-d]"
  echo "    if no filesystem is given all filesystems are checked"
}

check_fs () {
  # $1 = filesytem  $2 = warning level  $3 error level

  case $OS in
    AIX)   PUSED=$(df    $1 | awk '$NF~/^\// {print $4}');;
    SunOS) PUSED=$(df -k $1 | awk '$NF~/^\// {print $5}');;
  esac

  PUSED=${PUSED%\%}

  if [ $PUSED -ge $3 ]
  then
    EMSG="${EMSG}Critical $1 ${PUSED}% used\n"
    ESTAT=1
    return
  fi
  if [ $PUSED -ge $2 ]
  then
    WMSG="${WMSG}Warning $1 ${PUSED}% used\n"
    WSTAT=1
    return
  fi
  SMSG="${SMSG}OK $1 ${PUSED}% used\n"
#  echo "$PUSED"
}

if ! set -- $(getopt "w:e:f:d" $*)
then
  usage
  exit 4
fi

while [ x"$1" != x"--" ]
do
  case $1 in
    -e) ELEVEL=$2; shift;;
    -w) WLEVEL=$2; shift;;
    -f) FS=$2; shift;;
    -d) DEBUG=-d;;
    *) echo "Error: Flag '$1' not implemented"; usage; exit 4;;
  esac
  shift
done
shift

if [ -n "$FS" ]
then
  check_fs $FS $WLEVEL $ELEVEL
else

  case $OS in
    AIX)   FSLIST=$(mount    | awk '!/export\/oradata/ && $3 == "jfs2" {print $2}');;
    SunOS) FSLIST=`(df -Fufs; df -Fvxfs; df -Ftmpfs) | awk '!/^\/cdrom\// {print $1}' | sed 's/(.*$//'`;;
  esac

  for FS in $FSLIST; do
    #
    # XARY Fri Dec  5 10:38:43 CET 2008
    # /usr is not supposed to grow unattended.
    # set to 100% by MRB request, confirmed again in Dec. 2008
    #
    if    [ "$OS" == "AIX"   -a   "$FS" == "/usr" ]; then check_fs $FS 100 100
    #
    elif  echo "$Th" | expand | egrep -s $HOST:$FS' ';   then check_fs $FS `echo "$Th" | awk '$1=="'$HOST:$FS'" {print $2" "$3}'`
    elif  echo "$Th" | expand | egrep -s '[*]':$FS' ';   then check_fs $FS `echo "$Th" | awk '$1=="*:'$FS'"     {print $2" "$3}'`
    elif  echo "$Th" | expand | egrep -s $HOST:'[*]' ;   then check_fs $FS `echo "$Th" | awk '$1=="'$HOST:'*"   {print $2" "$3}'`
    else  check_fs $FS $WLEVEL $ELEVEL
    fi
  done
fi


if [ -n "$ESTAT" ]
then
  echo "$EMSG"
  echo "$WMSG"
  echo "$SMSG"
  exit 2
fi
if [ -n "$WSTAT" ]
then
  echo "$WMSG"
  echo "$SMSG"
  exit 1
fi

echo "Filesystems OK"
echo "$SMSG"
exit 0
