#!/usr/bin/perl # # check_hpacucli # # Copyright © 2012 Philip Garner, Technophobia Limited. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # 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. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Orginaly written by John Carroll for use with BCNU. # Cannibalised by Phil Garner for Nagios. # # This plugin was written for and at the expense of Technophobia Limited # and is being made available with there authorisation. # # Authors: Phil Garner - phil.garner@technophobia.com # John Carroll - john.carroll@technophobia.com # # v0.1 06/03/2012 # v0.2 11/06/2012 change file opp test on hpacucli # v0.3 12/11/2012 add -w # v0.4 23/11/2013 Fix for 5.14+ depreciations # # NOTES: Requires Perl Module Nagios::Plugin & hpacucli to be installed # Nagios user will need sudo access - suggest adding line below to # sudoers: # nagios ALL=(ALL) NOPASSWD: /usr/sbin/hpacucli # # In sudoers if requiretty is on (off state is default) # you will also need to add the line below # Defaults:nagios !requiretty # use strict; use warnings; use Nagios::Plugin; # These may need changing depending on the configuration of your system my $hpacucli = '/usr/sbin/hpacucli'; my $sudo = '/usr/bin/sudo'; my $np = Nagios::Plugin->new( shortname => 'check_hpacucli', version => '0.3', usage => "Usage: %s \n\t\t--help for help\n", license => "License - GPL v3 see code for more details", url => "http://www.technophobia.com", blurb => "Blurb: \tNagios plugin that checks HP RAID controller status with hpacucli, \trequires CPAN module Nagios::Plugin & hpacucli to be installed. \tTo work it will need a sudoers line see NOTES in code for details.", ); # Define Extra Args $np->add_arg( spec => 'informative|i', help => 'Adds information on each check even if OK', required => 0, ); $np->add_arg( spec => 'warnonly|w=s', help => 'comma seperated list of things to warn on and not crit (default)', required => 0, ); my ( $slot, $fh, $fh2, @warn_only ); $np->getopts; my $warn_only_list = $np->opts->warnonly; if ( defined $warn_only_list ) { @warn_only = split( /,/, $warn_only_list ); } # Check sudo is installed and executable if ( !-x $sudo ) { $np->nagios_exit( UNKNOWN, "No executable sudo at $sudo" ); } # Check hpacucli is installed if ( !-e $hpacucli ) { $np->nagios_exit( UNKNOWN, "No hpacucli at $hpacucli" ); } # Get controller status open( $fh, "$sudo $hpacucli controller all show status|" ) or $np->nagios_exit( CRITICAL, "Failed to run hpacucli" ); # Spin through output foreach my $line (<$fh>) { if ( $line =~ m/Another instance of hpacucli is running! Stop it first\./i ) { $np->nagios_exit( CRITICAL, "Another instance of hpacucli is running!" ); } elsif ( $line =~ m/Slot (\d+)/i ) { my $slot = $1; # Now get further details on each controller foreach my $PARAM (qw(array physicaldrive logicaldrive)) { open( $fh2, "$sudo $hpacucli controller slot=$slot $PARAM all show status|" ) or $np->add_message( CRITICAL, "Failed to get info for $PARAM slot $slot" ); foreach my $line2 (<$fh2>) { if ( $line2 =~ /^\s*$PARAM.*:\s*(\w+[\w\s]*)$/i ) { my $result = $1; chomp $result; if ( $result ne "OK" ) { chomp $line2; if ( defined $warn_only_list ) { foreach my $warn (@warn_only) { if ( $warn eq $line2 ) { $np->add_message( WARNING, "$line2" ); } else { $np->add_message( CRITICAL, "$line2" ); } } } else { $np->add_message( CRITICAL, "$line2" ); } } elsif ( $np->opts->informative ) { chomp $line2; $np->add_message( OK, "$line2" ); } } } close($fh2) or $np->add_message( CRITICAL, "Failed to get info for $PARAM slot $slot" ); } } else { # Check the overall controller status is OK if ( $line =~ /Status\:\s*([\w\s]+)$/ ) { my $result = $1; chomp $result; if ( $result ne "OK" ) { chomp $line; if ( defined $warn_only_list ) { foreach my $warn (@warn_only) { if ( $warn eq $line ) { $np->add_message( WARNING, "$line" ); } else { $np->add_message( CRITICAL, "$line" ); } } } else { $np->add_message( CRITICAL, "$line" ); } } elsif ( $np->opts->informative ) { chomp $line; $np->add_message( OK, "$line" ); } } } } close($fh) or $np->nagios_exit( CRITICAL, "Failed to run $sudo $hpacucli controller all show status" ); # Output Info and Exit $np->nagios_exit( $np->check_messages() );