#!/usr/bin/perl
#
# check_ibmrsa2_snmp_system_health
#
# Copyright © 2011 Philip Garner, Sysnix Consultants 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 .
#
# Authors: Phil Garner - phil@sysnix.com & Peter Mottram - peter@sysnix.com
#
#
# v0.1 18-10-2011
#
# NOTES: Requires Perl 5.8 or higher and
# the Perl Modules Nagios::Plugin, SNMP
#
use warnings;
use strict;
use Nagios::Plugin;
use SNMP;
my $np = Nagios::Plugin->new(
shortname => 'check_ibmrsa2_snmp_system_health',
version => '0.1',
usage => "Usage: %s -H -C \n\t--help for help\n",
license => "License - GPL v3 see code for more details",
url => "http://www.sysnix.com",
blurb =>
"\tNagios plugin that checks the system health of IBM RSA II using SNMP,
\trequires Perl 5.8+, CPAN modules Nagios::Plugin and SNMP.",
);
# Args
$np->add_arg(
spec => 'hostaddress|H=s',
help => 'Target host address (RSA address)',
required => 1,
);
$np->add_arg(
spec => 'community|C=s',
help => 'Community password',
required => 1,
);
$np->getopts;
# Set up SNMP Session
my $s = SNMP::Session->new(
DestHost => $np->opts->hostaddress,
Community => $np->opts->community,
Version => 1,
UseNumeric => 1,
) or $np->add_message( CRITICAL, ": Could not creat snmp connection" );
my $snmp_output = $s->get('.1.3.6.1.4.1.2.3.51.1.2.7.1.0');
if ( !defined $snmp_output || $snmp_output !~ m/^\d+$/ ) {
# no response, undef return or non-numeric response so set critical
$np->add_message( CRITICAL, "NO SNMP response or bad reponse" );
$np->nagios_exit( $np->check_messages() );
}
elsif ( $snmp_output != 255 ) {
# Response not 255 so get SNMP info and set critical even if no info
# Set an alert level incase WALK dosn't return any info (being Paranoid).
if ( $snmp_output == 2 or $snmp_output == 4 ) {
$np->add_message( WARNING, "System Status is Warning" );
}
elsif ( $snmp_output == 0 ) {
$np->add_message( CRITICAL, "System Status is Critical" );
}
else {
$np->add_message( CRITICAL, "Unexpeceted system health response" );
}
my %hash;
# do an SNMP walk of the oid to find faults and write data into hash
my $oid = '.1.3.6.1.4.1.2.3.51.1.2.7.2';
my $var = SNMP::Varbind->new( [$oid] );
while ( $var->[0] =~ m/^$oid(\.|$)/ ) {
my $val = $s->getnext($var);
if ( $var->[0] =~ m/\.(\d+)\.(\d+)$/ ) {
if ( $2 == 2 ) {
$hash{$1}{sev} = $val;
}
elsif ( $2 == 3 ) {
$hash{$1}{des} = $val;
}
}
else {
# ERROR pattern match failed this is very bad
$np->add_message( CRITICAL, "ERROR unexpected SNMP response" );
}
}
foreach my $index ( keys %hash ) {
# Spin through hash and add info to messages
my $alert;
if ( defined $hash{$index}{sev}
&& $hash{$index}{sev} =~ m/(critical|warning)/i )
{
$alert = uc($1);
}
else {
$alert = "CRITICAL";
}
if ( defined $hash{$index}{des} && $hash{$index}{des} ne '' ) {
$np->add_message( $alert, ": $hash{$index}{des}" );
}
else {
$np->add_message( $alert, ": Unknown Problem" );
}
}
}
else {
# This only happens if returned 255 so all in theory should be ok
$np->add_message( OK, "No Problems Found" );
}
# and exit
$np->nagios_exit( $np->check_messages() );
# EOF