#!/usr/bin/perl # downloaded as check_areca from # http://www.nagiosexchange.org/cgi-bin/page.cgi?g=1486.html;d=1 # on 20081001 by weasel. # # local changes: fix path to areca_cli ##################################################### #Program to check the areca RAID controller for the status of the RAID #Created: 2007-11-27 #Version: 1.1.0 #Revised: 2008-07-23 #Revised by: Erinn Looney-Triggs #Author: Erinn Looney-Triggs #Changelog: #1.1: Fixed issue with newer versions of the Areca CLI > 1.72 and #fixed a problem where the RAID name contained spaces #(Reported by Daniel Philipp). Also did a bit of cleanup. ##################################################### use Carp; use English qw( -no_match_vars ); use Getopt::Long; #Grab command line switches use Pod::Usage; use strict; #Do it right use warnings; $ENV{PATH} = '/usr/local/bin:/usr/bin:'; #Safer path my $areca_cli = '/usr/local/sbin/areca-cli'; my $timeout = '10'; #Default timeout of 10 seconds my $VERSION = '1.1.0'; #Version number #Nagios plugin return values, in english my $OK = '0'; my $WARNING = '1'; my $CRITICAL = '2'; my $UNKNOWN = '3'; GetOptions( 'areca_cli|A=s' => \$areca_cli, 'man' => sub { pod2usage(3) }, 'timeout|t=i' => \$timeout, 'usage' => sub { pod2usage(1) }, 'version' => sub { VersionMessage() }, 'help' => sub { pod2usage(1) }, ); sanity_checks(); parse_areca( check_areca() ); sub check_areca{ my @output; #Timer operation. Times out after $timeout seconds. eval { #Set the alarm and set the timeout local $SIG{ALRM} = sub { die "alarm\n" }; alarm $timeout; #Run the command @output = `sudo $areca_cli vsf info`; if ($?){ print "Command: cli vsf info failed, " . "$OS_ERROR $CHILD_ERROR, aborting!\n"; exit $CRITICAL; } #Reset the alarm if successful alarm 0; }; #Test return value and exit if eval caught the alarm if ($EVAL_ERROR) { if ( $EVAL_ERROR eq "alarm\n" ) { print "Operation timed out after $timeout seconds.\n"; exit $CRITICAL; } else { print "An unknown error has occured: $EVAL_ERROR \n"; exit $UNKNOWN; } } return @output; } sub parse_areca{ my @output = @_; my $abnormal; #Holds count of non-normal returns my @pertinent_lines = grep (/\s\d+\s/, @output); for my $line (@pertinent_lines){ #Strip of leading spaces $line =~ s/^\s+//; #Split the line into discrete parts my ( $number, $level, $capacity, $state, ) = (split (/\s+/, "$line"))[0,-4,-3,-1]; #If the state is normal continue on in loop if (lc $state eq "normal"){ print "|Controller number: $number RAID level: $level " . "Capacity: $capacity State: $state| "; } #If state is abnormal continue on in loop but add 1 to $abnormal else{ print "|Controller number: $number RAID level: $level " . "Capacity: $capacity State: $state| "; $abnormal++; } } #If any abnormalities exist ext with a critical error. if ($abnormal){ exit $CRITICAL; } else { exit $OK; } return; #This should never be reached } sub sanity_checks{ if (! -e $areca_cli){ print "$areca_cli does not exist, aborting!\n"; exit $CRITICAL; } if (! -x $areca_cli){ print "$areca_cli is not executable by the running user, aborting!\n"; exit $CRITICAL; } return; #This should never be reached } #Version message information displayed in both --version and --help sub main::VersionMessage { print <<"EOF"; This is version $VERSION of check_areca. Copyright (c) 2007-2008 Erinn Looney-Triggs (erinn.looneytriggs\@gmail.com). All rights reserved. This module is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License. See http://www.fsf.org/licensing/licenses/gpl.html This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. EOF exit 1; } __END__ =head1 NAME check_areca - Checks the status of an Areca RAID via the Areca CLI utility. =head1 VERSION This documentation refers to check_areca version 1.1.0 =head1 USAGE check_areca.pl =head1 REQUIRED ARGUMENTS None =head1 OPTIONS --areca_cli (-A) Set the location of the Areca cli executable. --help Display usage information. --man Display the entire POD documentation --timeout (-t) Sets the timeout, defaults to 10 seconds. --usage Display usage information (same as --help) --version Display the version number =head1 DESCRIPTION This is a Nagios plugin that runs the Areca CLI to check the status of the RAID controller. It then parses the resultant exit information and passes the output to NRPE. =head1 DIAGNOSTICS =head2 Command: cli vsf info failed, aborting! For some reason the command trying to be run failed. Try running it by hand and seeing if it runs properly. =head2 Operation timed out after seconds. Running the command failed after a certain amount of time (defaults to 10 seconds). Try using the --timeout (-t) switch and increasing the timeout threshold. Also try running the command by hand and see if it is hanging. =head2 An unknown error has occurred: Just what it says, running the cli command threw an unknown error and the process died. Run the CLI command by hand and see if you receive proper output. =head2 does not exist, aborting! The binary that the script is looking to run does not exist. By default check_areca looks in /usr/local/areca/bin/ for the cli. However, you can change this default by setting the --areca_cli (-A) flag from the command line =head2 is not executable by the running user, aborting! The cli program was found but it is not executable by the current user, usually this is the nagios user. =head1 CONFIGURATION AND ENVIRONMENT The Areca cli program should be available on the system. By default check_areca looks in /usr/local/areca/bin/cli for the cli. You can set the location using the --areca_cli (-A) flag from the command line. It is helpful to have an Areca RAID controller on the system being checked. =head1 DEPENDENCIES check_areca depends on the following modules: POSIX Standard Perl 5.8 module Getopt::Long Standard Perl 5.8 module Pod::USAGE Standard Perl 5.8 module =head1 INCOMPATIBILITIES None known yet. =head1 BUGS AND LIMITATIONS Bugs, never heard of 'em ;). If you encounter any bugs let me know. (erinn.looneytriggs@gmail.com) =head1 AUTHOR Erinn Looney-Triggs (erinn.looneytriggs@gmail.com) =head1 LICENCE AND COPYRIGHT Copyright (c) 2007-2008 Erinn Looney-Triggs (erinn.looneytriggs@gmail.com). All rights reserved. This module is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License. See L. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.