#!/bin/ksh
#
# Copyright (c) 2013, Haukur Kristinsson
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of Haukur Kristinsson nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL Haukur Kristinsson BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
############################################################################
# Made for AIX (Any Version) (Korn Shell). #
# Depends on /usr/sysv/bin/df and the default /usr/bin/df. #
# Build: v0.6 November 2013. #
# ------------------------------------------------------------------------ #
# Usage: ./check_filesystems_space -w [warning] -c [critical] #
# [[ -p type pattern]] [[ -e "filesystems to exclude" ]] [[ -v ]]#
# [warning] : Percentages for WARNING (MANDATORY) #
# [critical] : Percentages for CRITICAL (MANDATORY) #
# [type pattern] : default is "jfs" (OPTIONAL) #
# [filesystems to exclude] : filesystems seperated with a white space #
# -- Changelog ----------------------------------------------------------- #
# v0.6 - Refactoring. Adding perf output. Adding exclude option. Getopts. #
# v0.5 - Small output change and a new server-side parser #
# v0.4 - Include only filesystem type matching a grep pattern #
# This was needed to exclude mounted nfs filesystems #
# v0.3 - For loop could terminate to soon as it breaks after proc #
############################################################################
COUNT=0
OUTPUT=""
MOUNTTYPE="jfs" # Default type is the pattern jfs (also matches jfs2 etc.)
WARNING=
CRITICAL=
EXCLUDE=""
VERBOSE=0
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4
EXITSTATUS=$STATE_UNKNOWN # Default Exit Code as UNKNOWN.
###
### Print out usage help.
###
usage()
{
cat << EOF
usage: $0 options
Filesystems check for AIX V0.6
OPTIONS:
-h Show this message
-w Warning level in percentage (without %).
-c Critical level in percentage (without %).
-p Pattern for filesystem type. Default is jfs* (matches jfs and jfs2).
-e List of filesystems that need to be excluded (seperated with whitespaces). Example -e "/ /tmp /etc" for excluding /, /tmp and /etc filesystems.
-v verbose output (all filesystem status OK;WARNING;CRITICAL)
EOF
}
###
### Check if a filesystem is in the exclusion list.
###
###
### prints integer 0, if not in the list. Otherwise 1.
###
isexcluded() {
FILESYSTEM=$(echo $1 | cut -d: -f1)
MATCHED=0
for e in $EXCLUDE; do
if [ $FILESYSTEM = $e ]
then
MATCHED=1
fi
done
print $MATCHED
}
### GETOPTS
while getopts "h:w:c:p:e:v" OPTION
do
case $OPTION in
h)
usage
exit 1
;;
w)
WARNING=$OPTARG
;;
c)
CRITICAL=$OPTARG
;;
e)
EXCLUDE=$OPTARG
;;
p)
MOUNTTYPE=$OPTARG
;;
v)
VERBOSE=1
;;
?)
usage
exit
;;
esac
done
### Mandatory Arguments are WARNING and CRITICAL flags.
if [[ -z $WARNING ]] || [[ -z $CRITICAL ]]
then
usage
exit 1
fi
### Iteration of file systems.
if [ -n "$WARNING" ] && [ -n "$CRITICAL" ] && [ -n "MOUNTTYPE" ]
then
rawSysVDFRESULTS=`/usr/sysv/bin/df -n | grep -i $MOUNTTYPE | awk -F\: '{print ""$1":"$2""}' | tr -d '\t' | tr -d ' '`
for fs in $rawSysVDFRESULTS
do
ISFILESYSTEMEXCLUDED=`isexcluded $fs`
set -A array $(echo $fs | tr ':' '\n')
FMOUNT=${array[0]}
FTYPE=${array[1]}
SIZE=`df -k $FMOUNT|grep $FMOUNT|awk '{ print $4; }'`
PRC=`echo $SIZE | tr -d "%"`
if [ $ISFILESYSTEMEXCLUDED -eq 1 ]
then
continue
elif [ $PRC -gt $CRITICAL ]
then
OUTPUT=`echo $OUTPUT "CRITICAL:$STATE_CRITICAL:$fs:$SIZE:$FTYPE "`
COUNT=`expr $COUNT + 1`
if [ $EXITSTATUS -ne 2 ]
then
EXITSTATUS=$STATE_CRITICAL
fi
elif [ $PRC -gt $WARNING ]
then
OUTPUT=`echo $OUTPUT "WARNING:$STATE_WARNING:$fs:$SIZE:$FTYPE "`
COUNT=`expr $COUNT + 1`
if [ $EXITSTATUS -eq 2 ]
then
EXITSTATUS=$STATE_CRITICAL
else
EXITSTATUS=$STATE_WARNING
fi
elif [ $VERBOSE -eq 1 ]
then
OUTPUT=`echo $OUTPUT "OK:$STATE_OK:$fs:$SIZE:$FTYPE "`
fi
done
fi
### Decide what is included in the output.
if [ $COUNT -gt 0 ]
then
echo $OUTPUT
else
if [ $VERBOSE -eq 1 ]
then
echo $OUTPUT
else
echo "OK:FileSystemsOK"
EXITSTATUS=$STATE_OK
fi
fi
### Exit with appropriate exit code.
exit $EXITSTATUS