Home Directory

Search Exchange

Search All Sites

Nagios Live Webinars

Let our experts show you how Nagios can help your organization.

Contact Us

Phone: 1-888-NAGIOS-1
Email: sales@nagios.com

Login

Remember Me

Directory

Aposwolf

Reviews(3)
byAposwolf, December 27, 2017
I modified the script, now there is also a -m or --metric flag, where you can select which format the warn and crit input and the echo output should be (KB, MB, GB or TB)
Here it is:

#!/bin/sh
#
# ## Plugin for Nagios to monitor directory size
# ## Written by Gerd Stammwitz (http://www.enbiz.de/)
# ##
# ## - 20040727 coded and tested for Solaris and Linux
# ## - 20041216 published on NagiosExchange
# ## - 20070710 modified by Jose Vicente Mondejar to add perfdata option
#
#
# ## You are free to use this script under the terms of the Gnu Public License.
# ## No guarantee - use at your own risc.
#
#
# Usage: ./check_dirsize -d -w -c
#
# ## Description:
#
# This plugin determines the size of a directory (including sub dirs)
# and compares it with the supplied thresholds.
# It might also be used to monitor a regular file instead of a directory.
#
# ## Output:
#
# The plugin prints the size of the directory in KB followed by "ok" or
# either "warning" or "critical" if the corresponing threshold is reached.
#
# Exit Codes
# 0 OK Directory size checked and everything is ok
# 1 Warning Directory size above "warning" threshold
# 2 Critical Directory size above "critical" threshold
# 3 Unknown Invalid command line arguments or could not determine directory size
#
# Example: check_dirsize -d . -w 1000 -c 1400
#
# 121 KB - ok (exit code 0)
# 1234 KB - warning (exit code 1)
# 1633 KB - critical (exit code 2)


# Paths to commands used in this script. These
# may have to be modified to match your system setup.

PATH=""

DU="/usr/bin/du"
CUT="/usr/bin/cut"
WC="/usr/bin/wc"

PROGNAME=`/usr/bin/basename $0`
PROGPATH=`echo $0 | /bin/sed -e 's,[\\/][^\\/][^\\/]*$,,'`
REVISION="Revision 1.1"
AUTHOR="(c) 2004,2007 Gerd Stammwitz (http://www.enbiz.de/)"

# Exit codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4

print_revision() {
echo "$REVISION $AUTHOR"
}

print_usage() {
echo "Usage: $PROGNAME -d|--dirname [-w|--warning ] [-c|--critical ] [-f|--perfdata] [-m|--metric ]"
echo "Usage: $PROGNAME -h|--help"
echo "Usage: $PROGNAME -V|--version"
echo ""
echo " must be KB, MB, GB or TB"
}

print_help() {
print_revision $PROGNAME $REVISION
echo ""
echo "Directory size monitor plugin for Nagios"
echo ""
print_usage
echo ""
}

# Make sure the correct number of command line
# arguments have been supplied

if [ $# -lt 1 ]; then
print_usage
exit $STATE_UNKNOWN
fi

# Grab the command line arguments

thresh_warn=""
thresh_crit=""
metric="KB"
perfdata=0
exitstatus=$STATE_WARNING #default
while test -n "$1"; do
case "$1" in
--help)
print_help
exit $STATE_OK
;;
-h)
print_help
exit $STATE_OK
;;
--version)
print_revision $PROGNAME $VERSION
exit $STATE_OK
;;
-V)
print_revision $PROGNAME $VERSION
exit $STATE_OK
;;
--dirname)
dirpath=$2
shift
;;
-d)
dirpath=$2
shift
;;
--warning)
thresh_warn=$2
shift
;;
-w)
thresh_warn=$2
shift
;;
--critical)
thresh_crit=$2
shift
;;
-c)
thresh_crit=$2
shift
;;
--metric)
metric=$2
shift
;;
-m)
metric=$2
shift
;;
-f)
perfdata=1
;;
-perfdata)
perfdata=1
;;
*)
echo "Unknown argument: $1"
print_usage
exit $STATE_UNKNOWN
;;
esac
shift
done

##### Get size of specified directory
error=""
duresult=`$DU -s $dirpath 2>&1` || error="Error"
if [ ! "$error"="" ]; then
errtext=`echo $duresult | $CUT -f3 -d":"`
echo "$error:$errtext"
exit $STATE_UNKNOWN
fi

dirsize=`echo $duresult | $CUT -f1 -d" "`
result="ok"
exitstatus=$STATE_OK

##### Compare with thresholds
calc_value=1
case $metric in
"MB")
calc_value=$((dirsize / 1024))
thresh_warn=$((thresh_warn * 1024))
thresh_crit=$((thresh_crit * 1024))
;;
"GB")
calc_value=$((dirsize / 1024 / 1024))
thresh_warn=$((thresh_warn * 1024 * 1024))
thresh_crit=$((thresh_crit * 1024 * 1024))
;;
"TB")
calc_value=$((dirsize / 1024 / 1024 / 1024))
thresh_warn=$((thresh_warn * 1024 * 1024 * 1024))
thresh_crit=$((thresh_crit * 1024 * 1024 * 1024))
;;
"KB")
calc_value=$dirsize
;;
*)
echo "Wrong Metric! Must be KB, MB, GB or TB!"
exit $STATE_UNKNOWN
;;
esac

if [ "$thresh_warn" != "" ]; then
if [ $dirsize -ge $thresh_warn ]; then
result="warning"
exitstatus=$STATE_WARNING
fi
fi
if [ "$thresh_crit" != "" ]; then
if [ $dirsize -ge $thresh_crit ]; then
result="critical"
exitstatus=$STATE_CRITICAL
fi
fi
if [ $perfdata -eq 1 ]; then
result="$result|'size'=${calc_value};${thresh_warn};${thresh_crit}"
fi

echo "$calc_value $metric - $result"
exit $exitstatus
byAposwolf, December 22, 2017
It works! But somehow in my system not every successful backup is listed via list jobname. I edited the plugin to use status client, for directly connecting to the fd of the client and it's status. Therefore you also have to convert the date. Following changes where made (just copy line to line:

open (JOBLIST,"echo 'status client=$client' | $bconsoleCommand |");

my $latestBackupAge=-1;

while() {
my($line) = $_;
#print $line;
# split into columns (and remove whitespaces)
my ($_dummy,$_jobId,$_level,$_jobFiles,$_jobBytes,$_jobBytesMetric,$_jobStatus,$_finishedDate,$_finishedTime,$_client)=split(/\s+/,$line);
if ( $_jobBytes eq "0" ) {
($_dummy,$_jobId,$_level,$_jobFiles,$_jobBytes,$_jobStatus,$_finishedDate,$_finishedTime,$_client)=split(/\s+/,$line);
}
$_finishedDate =~ s/Dez/Dec/;
$_finishedDate =~ s/Mrz/Mar/;
$_finishedDate =~ s/Okt/Oct/;
$_finishedDate =~ s/Mai/May/;

my $_startTime = "$_finishedDate-$_finishedTime";
if ( $_jobStatus ne "OK" ) {
next; # only jobs which terminated correctly
}
if ( $_client ne "backup_$client" ) {
next; # only jobs for this client
}
if (!( $level eq "*" || $_level eq $level )) {
next; # only jobs for the reqired level (or any if $level="*")
}
my $in_fmt = '%d-%b-%y-%H:%M';
my $out_fmt = '%Y-%m-%d %H:%M:%S';
my $date = Time::Piece->strptime($_startTime, $in_fmt);
my $_startTime = $date->strftime($out_fmt);
my ($_y,$_m,$_d,$_H,$_M,$_S);

($_y,$_m,$_d,$_H,$_M,$_S) = ( $_startTime=~/^(\d{4})\-(\d{2})\-(\d{2})\s+(\d{2}):(\d{2}):(\d{2})$/ );

if (! $_y ) {
next; # require valid startTime
}

my $_startTimeAsUnixtime=timelocal($_S, $_M, $_H, $_d, $_m-1, $_y);
byAposwolf, September 9, 2015
To make it work on windows servers you just have to set the megaclibin variable to your megacli.exe

like

my $megaclibin = 'C:\MegaCLI\config\megacli.exe';

and make it readable for perl

$megaclibin =~ s#\\#/#g;

plus copy the utils.pm from your nagios to the perl lib on the windows server.

Then it works very well! Great job!