Created
September 8, 2011 13:28
-
-
Save antonlindstrom/1203382 to your computer and use it in GitHub Desktop.
nagios check for linux software raid
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl -w | |
# vim:ts=4 | |
# | |
# Check RAID status. Look for any known types | |
# of RAID configurations, and check them all. | |
# Return CRITICAL if in a DEGRADED state, since | |
# if the whole array has failed you'll have already noticed it! | |
# Return UNKNOWN if there are no RAID configs that can be found. | |
# Return WARNING if rebuilding or initialising | |
# | |
# S Shipway, university of auckland | |
# | |
# Thanks to M Carmier for megaraid section | |
# | |
# Version 1.1 : IPS; Solaris, AIX, Linux software RAID; megaide | |
# Version 2.0 : Added megaraid, mpt (serveraid), aacli (serveraid) | |
use strict; | |
use Getopt::Long; | |
use vars qw($opt_v $opt_d $opt_h $opt_W $opt_S); | |
my (%ERRORS) = ( OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3, WARN => 1, CRIT => 2 ); | |
my ($VERSION) = "2.0"; | |
my ( $message, $status ); | |
my (@ignore); | |
##################################################################### | |
sub print_usage () { | |
print "Usage: check_raid [list of devices to ignore]\n"; | |
print " check_raid -v\n"; | |
print " check_raid -h\n"; | |
} | |
sub print_help () { | |
print "check_raid, Revision: $VERSION \n"; | |
print "Copyright (c) 2004-2006 S Shipway | |
This plugin reports the current server's RAID status | |
"; | |
print_usage(); | |
} | |
##################################################################### | |
# return true if parameter is not in ignore list | |
sub valid($) { | |
my ($v) = $_[0]; | |
$v = lc $v; | |
foreach (@ignore) { return 0 if ( ( lc $_ ) eq $v ); } | |
return 1; | |
} | |
##################################################################### | |
sub check_mdstat { | |
my ($l); | |
my ( $s, $n, $f ); | |
open MDSTAT, "</proc/mdstat" or return; | |
while ( $l = <MDSTAT> ) { | |
if ( $l =~ /^(\S+)\s+:/ ) { $n = $1; $f = ''; next; } | |
if ( $l =~ /(\S+)\[\d+\]\(F\)/ ) { $f = $1; next; } | |
if ( $l =~ /\s*.*\[([U_]+)\]/ ) { | |
$s = $1; | |
next if ( !valid($n) ); | |
if ( $s =~ /_/ ) { | |
$status = $ERRORS{CRITICAL}; | |
$message .= "md:$n:$f:$s "; | |
} | |
else { | |
$message .= "md:$n:$s "; | |
} | |
} | |
} | |
close MDSTAT; | |
} | |
##################################################################### | |
$ENV{'BASH_ENV'} = ''; | |
$ENV{'ENV'} = ''; | |
Getopt::Long::Configure('bundling'); | |
GetOptions( | |
"v" => \$opt_v, | |
"version" => \$opt_v, | |
"h" => \$opt_h, | |
"help" => \$opt_h, | |
"d" => \$opt_d, | |
"debug" => \$opt_d, | |
"W" => \$opt_W, | |
"warnonly" => \$opt_W | |
); | |
@ignore = @ARGV if (@ARGV); | |
if ($opt_v) { | |
print "check_raid Revision: $VERSION\n"; | |
exit $ERRORS{'OK'}; | |
} | |
if ($opt_h) { print_help(); exit $ERRORS{'OK'}; } | |
if ($opt_W) { | |
$ERRORS{CRITICAL} = $ERRORS{WARNING}; | |
} | |
$status = $ERRORS{OK}; | |
$message = ''; | |
check_mdstat if ( -f "/proc/mdstat" ); | |
if ($message) { | |
if ( $status == $ERRORS{OK} ) { | |
print "OK: "; | |
} | |
elsif ( $status == $ERRORS{WARNING} ) { | |
print "WARNING: "; | |
} | |
elsif ( $status == $ERRORS{CRITICAL} ) { | |
print "CRITICAL: "; | |
} | |
print "$message\n"; | |
} | |
else { | |
$status = $ERRORS{UNKNOWN}; | |
print "No RAID configuration found.\n"; | |
} | |
exit $status; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment