From 2ab18b68b37035027ead3592f201b068f1d81876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1ll=20Gu=C3=B0j=C3=B3n=20Sigur=C3=B0sson?= Date: Thu, 3 Jun 2010 12:03:38 +0000 Subject: [PATCH] check_snmp_apc_ups added to the mix --- check_apcext.pl/trunk/check_snmp_apc_ups | 562 +++++++++++++++++++++++ 1 file changed, 562 insertions(+) create mode 100644 check_apcext.pl/trunk/check_snmp_apc_ups diff --git a/check_apcext.pl/trunk/check_snmp_apc_ups b/check_apcext.pl/trunk/check_snmp_apc_ups new file mode 100644 index 0000000..b524255 --- /dev/null +++ b/check_apcext.pl/trunk/check_snmp_apc_ups @@ -0,0 +1,562 @@ +#!/usr/bin/perl + +# Copyright (C) 2004 Altinity Limited +# E: info@altinity.com W: http://www.altinity.com/ +# +# Edited by Roderick Derks (roderick@r71.nl) +# I changed the output of this plugin so it can bu used with Nagiosgrapher +# to create nice graphs (output is in hours is changed to minutes). +# +# 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. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Adjusted by Roderick Derks (roderick@r71.nl) +# Output of snmp query for remaing battery runtime is in minutes or in hours. This +# is a problem when you want to create some nice graphs because of the different +# output. Now hours are converted to minutes. +# + +use Net::SNMP; +use Getopt::Std; + +$script = "check_snmp_apcups"; +$script_version = "2.1.0"; + +$metric = 1; + +$ipaddress = "192.168.1.1"; # default IP address, if none supplied +$version = "1"; # SNMP version +$timeout = 2; # SNMP query timeout +# $warning = 100; +# $critical = 150; +$status = 0; +$returnstring = ""; + +$community = "public"; # Default community string + + +# .1.3.6.1.4.1. +# enterprises.318.1.1.1.1.1.1.0 = STRING: "SMART-UPS 1000" upsIdent + +# enterprises.318.1.1.1.2.2.1.0 Battery capacity (%) +# enterprises.318.1.1.1.2.2.2.0 Temperature (Celcius) +# enterprises.318.1.1.1.2.2.3.0 Battery runtime remaining +# enterprises.318.1.1.1.2.2.4.0 Battery replace indicator (1=ok, 2=replace) +# enterprises.318.1.1.1.2.2.5.0 Number of battery packs +# enterprises.318.1.1.1.2.2.6.0 Number of bad battery packs + +# enterprises.318.1.1.1.3.2.1.0 Input voltage +# enterprises.318.1.1.1.3.2.4.0 Input frequency +# enterprises.318.1.1.1.3.2.5.0 Reason for last transfer to UPS battery power: + +# enterprises.318.1.1.1.4.2.1.0 Output voltage +# enterprises.318.1.1.1.4.2.2.0 Output frequency +# enterprises.318.1.1.1.4.2.3.0 Output load as % of capacity +# enterprises.318.1.1.1.4.2.4.0 Output current in ampheres + +# enterprises.318.1.1.1.4.2.1.0 Configured voltage +# enterprises.318.1.1.1.8.1.0 Whether agent is communicating with UPS (1) + +$oid_upstype = ".1.3.6.1.4.1.318.1.1.1.1.1.1.0"; +$oid_battery_capacity = ".1.3.6.1.4.1.318.1.1.1.2.2.1.0"; +$oid_battery_temperature = ".1.3.6.1.4.1.318.1.1.1.2.2.2.0"; +$oid_battery_runtimeremain = ".1.3.6.1.4.1.318.1.1.1.2.2.3.0"; +$oid_battery_replace = ".1.3.6.1.4.1.318.1.1.1.2.2.4.0"; +$oid_input_voltage = ".1.3.6.1.4.1.318.1.1.1.3.2.1.0"; +$oid_input_frequency = ".1.3.6.1.4.1.318.1.1.1.3.2.4.0"; +$oid_input_reasonforlasttransfer = ".1.3.6.1.4.1.318.1.1.1.3.2.5.0"; +$oid_output_voltage = ".1.3.6.1.4.1.318.1.1.1.4.2.1.0"; +$oid_output_frequency = ".1.3.6.1.4.1.318.1.1.1.4.2.2.0"; +$oid_output_load = ".1.3.6.1.4.1.318.1.1.1.4.2.3.0"; +$oid_output_current = ".1.3.6.1.4.1.318.1.1.1.4.2.4.0"; +$oid_output_configuredvoltage = ".1.3.6.1.4.1.318.1.1.1.4.2.1.0"; +$oid_comms = ".1.3.6.1.4.1.318.1.1.1.8.1.0"; +$oid_test_result = ".1.3.6.1.4.1.318.1.1.1.7.2.3.0"; +$oid_test_date = ".1.3.6.1.4.1.318.1.1.1.7.2.4.0"; +$oid_sysDescr = ".1.3.6.1.2.1.1.1.0"; + +$upstype = ""; +$battery_capacity = 0; +$battery_temperature = 0; +$battery_runtimeremain = 0; +$battery_replace = ""; +$input_voltage = 0; +$input_frequency = 0; +$input_reasonforlasttransfer = ""; +$output_voltage = 0; +$output_frequency = 0; +$output_load = 0; +$output_current = 0; +$output_configuredvoltage = 0; +$outagecause = ""; +$test_result = ""; +$test_date = ""; + + +# Do we have enough information? +if (@ARGV < 1) { + print "Too few arguments\n"; + usage(); +} + +getopts("h:H:C:w:c:"); +if ($opt_h){ + usage(); + exit(0); +} +if ($opt_H){ + $hostname = $opt_H; +} +else { + print "No hostname specified\n"; + usage(); +} +if ($opt_C){ + $community = $opt_C; +} +else { +} + + + +# Create the SNMP session +my ($s, $e) = Net::SNMP->session( + -community => $community, + -hostname => $hostname, + -version => $version, + -timeout => $timeout, +); + +main(); + +# Close the session +$s->close(); + +if ($returnstring eq ""){ + $status = 3; +} + +if ($status == 0){ + print "Status is OK - $returnstring\n"; + # print "$returnstring\n"; +} +elsif ($status == 1){ + print "Status is a WARNING level - $returnstring\n"; +} +elsif ($status == 2){ + print "Status is CRITICAL - $returnstring\n"; +} +else{ + print "Problem with plugin. No response from SNMP agent.\n"; +} + +exit $status; + + +#################################################################### +# This is where we gather data via SNMP and return results # +#################################################################### + +sub main { + + ####################################################### + + if (!defined($s->get_request($oid_comms))) { + if (!defined($s->get_request($oid_sysDescr))) { + $returnstring = "SNMP agent not responding"; + $status = 1; + return 1; + } + else { + $returnstring = "SNMP OID does not exist"; + $status = 1; + return 1; + } + } + foreach ($s->var_bind_names()) { + $temp = $s->var_bind_list()->{$_}; + } + + if ($temp eq "1"){ + } + else { + append("SNMP agent not communicating with UPS"); + $status = 2; + return 1; + } + + + ####################################################### + + if (!defined($s->get_request($oid_upstype))) { + if (!defined($s->get_request($oid_sysDescr))) { + $returnstring = "SNMP agent not responding"; + $status = 1; + return 1; + } + else { + $returnstring = "SNMP OID does not exist"; + $status = 1; + return 1; + } + } + foreach ($s->var_bind_names()) { + $upstype = $s->var_bind_list()->{$_}; + } + + ####################################################### + + if (!defined($s->get_request($oid_battery_capacity))) { + if (!defined($s->get_request($oid_sysDescr))) { + $returnstring = "SNMP agent not responding"; + $status = 1; + return 1; + } + else { + $returnstring = "SNMP OID does not exist"; + $status = 1; + return 1; + } + } + foreach ($s->var_bind_names()) { + $battery_capacity = $s->var_bind_list()->{$_}; + } + ####################################################### + + if (!defined($s->get_request($oid_battery_temperature))) { + if (!defined($s->get_request($oid_sysDescr))) { + $returnstring = "SNMP agent not responding"; + $status = 1; + return 1; + } + else { + $returnstring = "SNMP OID does not exist"; + $status = 1; + return 1; + } + } + foreach ($s->var_bind_names()) { + $battery_temperature = $s->var_bind_list()->{$_}; + } + ####################################################### + + if (!defined($s->get_request($oid_battery_runtimeremain))) { + if (!defined($s->get_request($oid_sysDescr))) { + $returnstring = "SNMP agent not responding"; + $status = 1; + return 1; + } + else { + $returnstring = "SNMP OID does not exist"; + $status = 1; + return 1; + } + } + foreach ($s->var_bind_names()) { + $battery_runtimeremain = $s->var_bind_list()->{$_}; + } + + # RRD if output is in hours, change it to minutes so we can make a nice graph + if ( $battery_runtimeremain =~ "hour" ) { + $battery_runtimeremain2 = "$battery_runtimeremain"; + $battery_runtimeremain =~s/hour.*//g; + $battery_runtimeremain = $battery_runtimeremain*60; + $battery_runtimeremain = "$battery_runtimeremain minutes"; + } + + ####################################################### + + if (!defined($s->get_request($oid_battery_replace))) { + if (!defined($s->get_request($oid_sysDescr))) { + $returnstring = "SNMP agent not responding"; + $status = 1; + return 1; + } + else { + $returnstring = "SNMP OID does not exist"; + $status = 1; + return 1; + } + } + foreach ($s->var_bind_names()) { + $battery_replace = $s->var_bind_list()->{$_}; + } + ####################################################### + + if (!defined($s->get_request($oid_input_voltage))) { + if (!defined($s->get_request($oid_sysDescr))) { + $returnstring = "SNMP agent not responding"; + $status = 1; + return 1; + } + else { + $returnstring = "SNMP OID does not exist"; + $status = 1; + return 1; + } + } + foreach ($s->var_bind_names()) { + $input_voltage = $s->var_bind_list()->{$_}; + } + ####################################################### + + if (!defined($s->get_request($oid_input_frequency))) { + if (!defined($s->get_request($oid_sysDescr))) { + $returnstring = "SNMP agent not responding"; + $status = 1; + return 1; + } + else { + $returnstring = "SNMP OID does not exist"; + $status = 1; + return 1; + } + } + foreach ($s->var_bind_names()) { + $input_frequency = $s->var_bind_list()->{$_}; + } + ####################################################### + + if (!defined($s->get_request($oid_input_reasonforlasttransfer))) { + if (!defined($s->get_request($oid_sysDescr))) { + $returnstring = "SNMP agent not responding"; + $status = 1; + return 1; + } + else { + $returnstring = "SNMP OID does not exist"; + $status = 1; + return 1; + } + } + foreach ($s->var_bind_names()) { + $input_reasonforlasttransfer = $s->var_bind_list()->{$_}; + } + ####################################################### + + if (!defined($s->get_request($oid_output_voltage))) { + if (!defined($s->get_request($oid_sysDescr))) { + $returnstring = "SNMP agent not responding"; + $status = 1; + return 1; + } + else { + $returnstring = "SNMP OID does not exist"; + $status = 1; + return 1; + } + } + foreach ($s->var_bind_names()) { + $output_voltage = $s->var_bind_list()->{$_}; + } + ####################################################### + + if (!defined($s->get_request($oid_output_frequency))) { + if (!defined($s->get_request($oid_sysDescr))) { $returnstring = "SNMP agent not responding"; + $status = 1; + return 1; + } + else { + $returnstring = "SNMP OID does not exist"; + $status = 1; + return 1; + } + } + foreach ($s->var_bind_names()) { + $output_frequency = $s->var_bind_list()->{$_}; + } + ####################################################### + + if (!defined($s->get_request($oid_output_load))) { + if (!defined($s->get_request($oid_sysDescr))) { + $returnstring = "SNMP agent not responding"; + $status = 1; + return 1; + } + else { + $returnstring = "SNMP OID does not exist"; + $status = 1; + return 1; + } + } + foreach ($s->var_bind_names()) { + $output_load = $s->var_bind_list()->{$_}; + } + ####################################################### + + if (!defined($s->get_request($oid_test_result))) { + if (!defined($s->get_request($oid_sysDescr))) { + $returnstring = "SNMP agent not responding"; + $status = 1; + return 1; + } + else { + $returnstring = "SNMP OID does not exist"; + $status = 1; + return 1; + } + } + foreach ($s->var_bind_names()) { + $test_result = $s->var_bind_list()->{$_}; + } + ####################################################### + + if (!defined($s->get_request($oid_test_date))) { + if (!defined($s->get_request($oid_sysDescr))) { + $returnstring = "SNMP agent not responding"; + $status = 1; + return 1; + } + else { + $returnstring = "SNMP OID does not exist"; + $status = 1; + return 1; + } + } + foreach ($s->var_bind_names()) { + $test_date = $s->var_bind_list()->{$_}; + } + ####################################################### + + $issue = ""; + + if ($input_reasonforlasttransfer eq "1"){ + $outagecause = "No events" + } + elsif ($input_reasonforlasttransfer eq "2"){ + $outagecause = "High line voltage" + } + elsif ($input_reasonforlasttransfer eq "3"){ + $outagecause = "Brownout" + } + elsif ($input_reasonforlasttransfer eq "4"){ + $outagecause = "Loss of mains power" + } + elsif ($input_reasonforlasttransfer eq "5"){ + $outagecause = "Small temporary power drop" + } + elsif ($input_reasonforlasttransfer eq "6"){ + $outagecause = "Large temporary power drop" + } + elsif ($input_reasonforlasttransfer eq "7"){ + $outagecause = "Small spike" + } + elsif ($input_reasonforlasttransfer eq "8"){ + $outagecause = "Large spike" + } + elsif ($input_reasonforlasttransfer eq "9"){ + $outagecause = "UPS self test" + } + elsif ($input_reasonforlasttransfer eq "10"){ + $outagecause = "Excessive input voltage fluctuation" + } + else { + $outagecause = "Cannot establish reason" + } + + + if ($test_result eq "1") { + $test_result_string = "Passed"; + } + elsif ($test_result eq "2") { + $test_result_string = "Failed"; + } + elsif ($test_result eq "4") { + $test_result_string = "In Progress"; + } + else { + $test_result_string = "Unknown"; + } + + + if ($battery_capacity < 50) { + $issue = $issue . "BATTERY CAPACITY WARNING! "; + $status = 1; + } + if ($output_load > 80) { + $status = 1; + $issue = $issue . "OUTPUT LOAD WARNING! "; + } + if ($test_result eq "2") { + $issue = $issue . "SELF TEST FAILED! "; + $status = 1; + } + if ($input_voltage < 1){ + $status = 2; + $issue = $issue . "RUNNING ON BATTERY! "; + } + if ($battery_capacity < 25) { + $issue = $issue . "BATTERY RUNNING LOW! "; + $status = 2; + } + if ($output_load > 90) { + $issue = $issue . "HIGH OUTPUT LOAD! "; + $status = 2; + } + if ($battery_replace eq "2") { + $issue = $issue . "REPLACE BATTERY! "; + $status = 2; + } + + # Modified by Pall Sigurdsson to add some perfdata + # Modified 2010-06-03 + my $perfdata="| 'battery_capacity'=$battery_capacity% 'temperature'=$battery_temperature 'input_voltage'=$input_voltage input_frequency=$input_frequency output_voltage=$output_voltage output_frequency=$output_frequency output_load=$output_load%"; + + + if ($status == 0){ + $temp = sprintf "$upstype - BATTERY:(capacity $battery_capacity%%, temperature $battery_temperature C, runtime $battery_runtimeremain) INPUT:(voltage $input_voltage V, frequency $input_frequency Hz) OUTPUT:(voltage $output_voltage V, frequency $output_frequency Hz, load $output_load%%) SELF TEST:($test_result_string on $test_date) LAST EVENT:($outagecause) $perfdata"; + } + else { + $temp = sprintf "$issue - $upstype - BATTERY:(capacity $battery_capacity%%, temperature $battery_temperature C, runtime $battery_runtimeremain) INPUT:(voltage $input_voltage V, frequency $input_frequency Hz) OUTPUT:(voltage $output_voltage V, frequency $output_frequency Hz, load $output_load%%) LAST EVENT:$outagecause $perfdata "; + } + append($temp); + +} + +#################################################################### +# help and usage information # +#################################################################### + +sub usage { + print << "USAGE"; +----------------------------------------------------------------- +$script v$script_version + +Monitors APC SmartUPS via AP9617 SNMP management card. + +Usage: $script -H -c [...] + +Options: -H Hostname or IP address + -C Community (default is public) + +----------------------------------------------------------------- +Copyright 2004 Altinity Limited + +This program is free software; you can redistribute it or modify +it under the terms of the GNU General Public License +----------------------------------------------------------------- + +USAGE + exit 1; +} + +#################################################################### +# Appends string to existing $returnstring # +#################################################################### + +sub append { + my $appendstring = @_[0]; + $returnstring = "$returnstring$appendstring"; +} +