diff --git a/check_msa_hardware-pl/trunk/check_msa_hardware-pl b/check_msa_hardware-pl/trunk/check_msa_hardware-pl new file mode 100644 index 0000000..b64a9c1 --- /dev/null +++ b/check_msa_hardware-pl/trunk/check_msa_hardware-pl @@ -0,0 +1,297 @@ +#! /usr/bin/perl -w +################################################################### +# 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 2 +# 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. +# +# For information : david.barbion@adeoservices.com +#################################################################### +# +# Script init +# + +use strict; +use Switch ; +use List::Util qw[min max]; +use Net::SNMP qw(:snmp); +use FindBin; +use Data::Dumper; +use lib "$FindBin::Bin"; +use lib "/usr/lib/nagios/plugins"; +use lib "/tmp" ; + + +use utils qw($TIMEOUT %ERRORS &print_revision &support); + +use vars qw($PROGNAME); +use Getopt::Long; +use vars qw($opt_h $opt_V $opt_H $opt_C $opt_v $opt_o $opt_c $opt_w $opt_t $opt_p $opt_k $opt_u $opt_l); + +$PROGNAME = $0; +sub print_help (); +sub print_usage (); + +Getopt::Long::Configure('bundling'); +GetOptions + ("h" => \$opt_h, "help" => \$opt_h, + "u=s" => \$opt_u, "username=s" => \$opt_u, + "p=s" => \$opt_p, "password=s" => \$opt_p, + "k=s" => \$opt_k, "key=s" => \$opt_k, + "V" => \$opt_V, "version" => \$opt_V, + "l" => \$opt_l, "longoutput" => \$opt_l, + "v=s" => \$opt_v, "snmp=s" => \$opt_v, + "C=s" => \$opt_C, "community=s" => \$opt_C, + "w=s" => \$opt_w, "warning=s" => \$opt_w, + "c=s" => \$opt_c, "critical=s" => \$opt_c, + "H=s" => \$opt_H, "hostname=s" => \$opt_H); + +if ($opt_V) { + print_revision($PROGNAME,'$Revision: 1.0'); + exit $ERRORS{'OK'}; +} + +if ($opt_h) { + print_help(); + exit $ERRORS{'OK'}; +} + +$opt_H = shift unless ($opt_H); +(print_usage() && exit $ERRORS{'OK'}) unless ($opt_H); + +my $snmp = "1"; +if ($opt_v && $opt_v =~ /^[0-9]$/) { + $snmp = $opt_v; +} + +if ($snmp eq "3") { + if (!$opt_u) { + print "Option -u (--username) is required for snmpV3\n"; + exit $ERRORS{'OK'}; + } + if (!$opt_p && !$opt_k) { + print "Option -k (--key) or -p (--password) is required for snmpV3\n"; + exit $ERRORS{'OK'}; + }elsif ($opt_p && $opt_k) { + print "Only option -k (--key) or -p (--password) is needed for snmpV3\n"; + exit $ERRORS{'OK'}; + } +} + +($opt_C) || ($opt_C = shift) || ($opt_C = "public"); + +my $DS_type = "GAUGE"; +($opt_t) || ($opt_t = shift) || ($opt_t = "GAUGE"); +$DS_type = $1 if ($opt_t =~ /(GAUGE)/ || $opt_t =~ /(COUNTER)/); + + +my $name = $0; +$name =~ s/\.pl.*//g; +my $day = 0; + +#=== create a SNMP session ==== + +my ($session, $error); +if ($snmp eq "1" || $snmp eq "2") { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -community => $opt_C, -version => $snmp); + if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; + } +}elsif ($opt_k) { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -version => $snmp, -username => $opt_u, -authkey => $opt_k); + if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; + } +}elsif ($opt_p) { + ($session, $error) = Net::SNMP->session(-hostname => $opt_H, -version => $snmp, -username => $opt_u, -authpassword => $opt_p); + if (!defined($session)) { + print("UNKNOWN: SNMP Session : $error\n"); + exit $ERRORS{'UNKNOWN'}; + } +} + + +# Here we go ! +my $result ; +my $label ; +my $oid ; +my $unit = ""; +my $return_result ; +my $return_code = 0 ; +my $output ; +my $total_connection = 0; +# parse sysDescr +my $sysdescr = $session->get_request(-varbindlist => [".1.3.6.1.2.1.1.1.0"]) ; +my $outlabel = $sysdescr->{".1.3.6.1.2.1.1.1.0"}.": " ; +my $longoutput = ''; +my $perfdata = ''; + +# define some useful arrays +my %msa_sensors_oids = ( + ".1.3.6.1.3.94.1.8.1.1" => "Sensor unitid", + ".1.3.6.1.3.94.1.8.1.2" => "Sensor index", + ".1.3.6.1.3.94.1.8.1.3" => "Sensor name", + ".1.3.6.1.3.94.1.8.1.4" => "Sensor status", + ".1.3.6.1.3.94.1.8.1.5" => "Sensor info", + ".1.3.6.1.3.94.1.8.1.6" => "Sensor message", + ".1.3.6.1.3.94.1.8.1.7" => "Sensor type", + ".1.3.6.1.3.94.1.8.1.8" => "Sensor characteristic" + ) ; +my %sensor_data_table = ("SENSOR_UNITID" => ".1.3.6.1.3.94.1.8.1.1", + "SENSOR_INDEX" => ".1.3.6.1.3.94.1.8.1.2", + "SENSOR_NAME" => ".1.3.6.1.3.94.1.8.1.3", + "SENSOR_STATUS" => ".1.3.6.1.3.94.1.8.1.4", + "SENSOR_INFO" => ".1.3.6.1.3.94.1.8.1.5", + "SENSOR_MESSAGE" => ".1.3.6.1.3.94.1.8.1.6", + "SENSOR_TYPE" => ".1.3.6.1.3.94.1.8.1.7", + "SENSOR_CHARACTERISTIC" => ".1.3.6.1.3.94.1.8.1.8",) ; + +# all sensors types +my @msa_sensors_type = ("undefined", + "unknown", + "other", + "battery", + "fan", + "power-supply", + "transmitter", + "enclosure", + "board", + "receiver") ; +# all sensors status +my @msa_sensors_status = ("undefined", + "unknown", + "other", + "ok", + "warning", + "failed") ; + +# all sensors characteristics +my @msa_sensors_characteristic = ("undefined", + "unknown", + "other", + "temperature", + "pressure", + "emf", + "currentValue", + "airflow", + "frequency", + "power", + "door" + ) ; + +# get the sensor table +$result = $session->get_table(".1.3.6.1.3.94.1.8") ; +my %msa_sensors_values = %{$result} ; + +my $sensor_id ; +my $key ; +my $value ; +my @msa_sensors ; +my $sensor ; +# create the sensor data table +foreach (keys %msa_sensors_values) { + $value = $key = $sensor_id = $_ ; + $sensor_id =~ s/.*\.([0-9]+)$/$1/; + $key =~ s/(\.[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*).*/$1/ ; + $msa_sensors[$sensor_id]{$key} = $msa_sensors_values{$value}; +} + +# parse the table to get the worse status and append it to the output string. +my $worse_status = 0; +foreach $sensor (@msa_sensors) { + if (defined($sensor)) { + my %sensor_data = %{$sensor} ; + chomp($sensor_data{".1.3.6.1.3.94.1.8.1.6"}); + $worse_status = max($worse_status, $sensor_data{$sensor_data_table{"SENSOR_STATUS"}}) ; + #print Dumper(\%sensor_data); +#Voltage (Controller Module B): 0.00V + if ($sensor_data{".1.3.6.1.3.94.1.8.1.6"} =~ /Temperature.*:\s+(-*\d+)C/) { + + my $temperature = $1; + if ($temperature > 0) { + $longoutput .= "\n" . $sensor_data{".1.3.6.1.3.94.1.8.1.6"}; + my $pd = $sensor_data{".1.3.6.1.3.94.1.8.1.6"}; + $pd =~ s/\:.*$//g; + $pd =~ s/[\(\),]//g; + $pd =~ s/ /_/g; + $perfdata .= "\"$pd\"=$temperature" . "C "; + } else { + } + } elsif ($sensor_data{".1.3.6.1.3.94.1.8.1.6"} =~ /Voltage.*:\s+(\d+\.\d+)V/) { + my $voltage = $1; + if ($1 > 0) { + $longoutput .= "\n" . $sensor_data{".1.3.6.1.3.94.1.8.1.6"}; + my $pd = $sensor_data{".1.3.6.1.3.94.1.8.1.6"}; + $pd =~ s/\:.*$//g; + $pd =~ s/[\(\),]//g; + $pd =~ s/ /_/g; + $perfdata .= "\"$pd\"=$voltage" . "V "; + } else { + } + } elsif ($sensor_data{".1.3.6.1.3.94.1.8.1.6"} =~ /Capacitor Charge.*: 0%/) { + } else { + $longoutput .= "\n" . $sensor_data{".1.3.6.1.3.94.1.8.1.6"}; + } + + #$longoutput .= $sensor_data{".1.3.6.1.3.94.1.8.1.6"} . "\n"; + #print Dumper(\%sensor_data); + # a problem is found + if ($sensor_data{$sensor_data_table{"SENSOR_STATUS"}} > 3) { + $outlabel.=$sensor_data{$sensor_data_table{"SENSOR_MESSAGE"}} ; + $outlabel.=" [".$msa_sensors_type[$sensor_data{$sensor_data_table{"SENSOR_TYPE"}}]."]. " ; + } + } +} + +# get the return_code +switch ($worse_status) { + case 0 { $return_code = -1 ;} + case 1 { $return_code = -1 ;} + case 2 { $return_code = -1 ;} + case 3 { $return_code = 0 ;} + case 4 { $return_code = 1 ;} + case 5 { $return_code = 2 ;} + else { $return_code = -1 } +} + +################################################################################ +switch ($return_code) { + case 0 { $outlabel.="OK"; } + case 1 { $outlabel.="WARNING"; } + case 2 { $outlabel.="CRITICAL"; } + else { $outlabel.="UNKOWN"; } +} +print $outlabel ; +print "$longoutput" if ($opt_l); +print " | $perfdata \n"; +exit($return_code) ; + +sub print_usage () { + print "Usage:"; + print "$PROGNAME\n"; + print " -H (--hostname) Hostname to query - (required)\n"; + print " -C (--community) SNMP read community (defaults to public,\n"; + print " used with SNMP v1 and v2c\n"; + print " -v (--snmp_version) 1 for SNMP v1 (default)\n"; + print " 2 for SNMP v2c\n"; + print " -k (--key) snmp V3 key\n"; + print " -p (--password) snmp V3 password\n"; + print " -u (--username) snmp v3 username \n"; + print " -V (--version) Plugin version\n"; + print " -h (--help) usage help\n"; +} + +sub print_help () { + print "##############################################\n"; + print "# ADEO Services #\n"; + print "##############################################\n"; + print_usage(); + print "\n"; +}