Build precise queries to find exactly what you need
Press ESC to close
Join our next live webinar: “Advanced Nagios Monitoring Techniques” – Register Now
Your review has been submitted and is pending approval.
Three perl scripts to monitor APC, Merlin Guerin and Powerware UPS. Performance data are also provided using groundwork like syntax.
Updated by Alexander Rudolf – added support for external temperature sensor (exttemp…) Hint: expecting the value unit is Celsius (‘1’), if iemStatusProbeTempUnits.1 (.1.3.6.1.4.1.318.1.1.10.2.3.2.1.5.1) is Fahrenheit (‘2’) we will get wrong data – changed battery temperature values from output Before: OK – Smart-UPS RT 8000 RM XL … – TEMPERATURE 27 C – … Now: OK – Smart-UPS RT 8000 RM XL … – BATT TEMP 27 C – EXT TEMP 23 C – … – added warn and crit values to performance data output as well as units – tested with Smart-UPS 5000/8000 and “PowerNet SNMP Agent SW v2.2 compatible”
Updated by Oliver Skibbe: – warn/crit values defined per variable – get watt hour if oid exists (Smart UPS 2200) – calculate remaining time in minutes on battery (bit ugly, but seems working) critical if below $remaining_time_crit value – changed return string to add CRIT/WARN to corresponding failed value – APC: added battery replacement indicator
Before: CRIT – Smart-UPS RT 10000 XL – BATTERY CAPACITY 100% – STATUS NORMAL – OUTPUT LOAD 31% – TEMPERATURE 23 C
After: CRIT – Smart-UPS RT 10000 XL – CRIT BATTERY CAPACITY 50% – STATUS NORMAL – OUTPUT LOAD 31% – TEMPERATURE 23 C
– Added multiline ouput for firmware,manufacture date and serial number FIRMWARE: UPS 05.0 / COM 02.1 / UBL 05.0 / CBL 5.21 (ID17) – MANUFACTURE DATE: 12/12/2012 – SERIAL: DummySerial
Current Version
1.2
Last Release Date
2014-11-26
Owner
Oliver Skibbe
Website
http://oskibbe.blogspot.de
Download URL
https://github.com/riskersen/Monitoring/tree/master/UPS
Compatible With
MGE UPS
POW UPS
These three perl scripts have been modified from a Altinity script to report on : - Global Status - UPS Type - Battery Capacity - Output Load in % - Temperature - Output load in watt hours - Remaining time on battery - Serial number - Manufacture date - Firmware For the three different types of UPS we use : - APC (Smart UPS 3000 RM, 2200, 1500, 5000 and RT10000 XL) - MGE (Merlin Guerin Pulsar Extreme 3000 VA) - Powerware (PW9125) Typical Output : OK - Smart-UPS RT 10000 XL - BATTERY CAPACITY 100% - STATUS NORMAL - OUTPUT LOAD 16% - BATT TEMP 29 C - EXT TEMP 23 C - 62 MINUTES REMAINING FIRMWARE: 476.18.W - MANUFACTURE DATE: 01/27/12 - SERIAL: Dummy Serial|'load'=16%;70;80;; 'temp'=29C;31;33;; 'exttemp'=23C;26;30;; 'remaining_minutes'=62min;;5;; OR: CRITICAL - Smart-UPS RT 10000 XL - CRIT BATTERY REPLACEMENT NEEDED - STATUS NORMAL - OUTPUT LOAD 20% - TEMPERATURE 25 C - 50 MINUTES REMAINING FIRMWARE: 476.18.W - MANUFACTURE DATE: 10/21/12 - SERIAL: ASDF123 Performance data is also provided to graph Load, Remaining time, Temperature and optional: load in Watt hours
I use the ups_acp.pl Script. a) it provides some useful info, thanks b) some parts may be incorrect (don't know enough about SNMP/UPS-APC, guessing from code where it checks the same SNMP value twice) c) code fails to operate with embedded perl when enabled in nagios (which is by default on ubuntu 14/04) I changed quite a bit for what I think is correct for b) and definitely is necessary for c). If I did wrong, then correct my corrections as needed. ;-) Enjoy ====== *** check_ups_apc.pl 2014-03-20 16:58:31.000000000 +0100 --- jjj.pl 2015-02-02 18:34:43.000000000 +0100 *************** *** 39,99 **** # After: CRIT - Smart-UPS RT 10000 XL - CRIT BATTERY CAPACITY 50% - STATUS NORMAL - OUTPUT LOAD 31% - TEMPERATURE 23 C # - Added multiline output for firmware,manufacture date and serial number use Net::SNMP; use Getopt::Std; # DEBUGGING PURPOSE use Data::Dumper; ! $script = "check_ups_apc.pl"; ! $script_version = "1.2"; ! $metric = 1; ! $version = "1"; # SNMP version ! $timeout = 2; # SNMP query timeout # $warning = 100; # $critical = 150; ! $status = 0; ! $returnstring = ""; ! $perfdata = ""; ! ! $community = "public"; # Default community string ! ! $oid_sysDescr = ".1.3.6.1.2.1.1.1.0"; ! $oid_serial_number = ".1.3.6.1.4.1.318.1.1.1.1.2.3.0"; ! $oid_firmware = ".1.3.6.1.4.1.318.1.1.1.1.2.1.0"; ! $oid_manufacture_date = ".1.3.6.1.4.1.318.1.1.1.1.2.2.0"; ! $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_output_status = ".1.3.6.1.4.1.318.1.1.1.4.1.1.0"; ! $oid_output_current = ".1.3.6.1.4.1.318.1.1.1.4.2.4.0"; ! $oid_output_load = ".1.3.6.1.4.1.318.1.1.1.4.2.3.0"; ! $oid_battemperature = ".1.3.6.1.4.1.318.1.1.1.2.2.2.0"; ! $oid_exttemperature = ".1.3.6.1.4.1.318.1.1.10.2.3.2.1.4.1"; ! $oid_remaining_time = ".1.3.6.1.4.1.318.1.1.1.2.2.3.0"; # optional, Smart-UPS 2200 support this ! $oid_current_load_wh = ".1.3.6.1.4.1.318.1.1.1.4.3.6.0"; ! $oid_battery_replacment = ".1.3.6.1.4.1.318.1.1.1.2.2.4.0"; ! $upstype = ""; ! $battery_capacity = 0; ! $output_status = 0; ! $output_current = 0; ! $output_load = 0; ! $battemperature = 0; ! $exttemperature = 0; # crit / warn values ! $remaining_time_crit = 5; ! $output_load_crit = 80; ! $output_load_warn = 70; ! $battemperature_crit = 33; ! $battemperature_warn = 31; ! $exttemperature_crit = 30; ! $exttemperature_warn = 26; ! $battery_capacity_crit = 35; ! $battery_capacity_warn = 65; # Do we have enough information? if (@ARGV var_bind_names()) { *************** *** 233,249 **** --- 243,262 ---- } } + my $firmware; # some useful stuff if (defined($s->get_request($oid_firmware))) { foreach ($s->var_bind_names()) { $firmware = $s->var_bind_list()->{$_}; } } + my $serial_number; if ( defined ( $s->get_request($oid_serial_number))) { foreach ($s->var_bind_names()) { $serial_number = $s->var_bind_list()->{$_}; } } + my $manufacture_date; if ( defined ( $s->get_request($oid_manufacture_date))) { foreach ($s->var_bind_names()) { $manufacture_date = $s->var_bind_list()->{$_}; *************** *** 279,285 **** ####################################################### if (!defined($s->get_request($oid_battery_replacment))) { ! if (!defined($s->get_request($oid_battery_replacement))) { $returnstring = "SNMP agent not responding"; $status = 1; return 1; --- 292,298 ---- ####################################################### if (!defined($s->get_request($oid_battery_replacment))) { ! if (!defined($s->get_request($oid_sysDescr))) { $returnstring = "SNMP agent not responding"; $status = 1; return 1; *************** *** 290,295 **** --- 303,309 ---- return 1; } } + my $battery_replacement; foreach ($s->var_bind_names()) { $battery_replacement = $s->var_bind_list()->{$_}; } *************** *** 308,313 **** --- 322,328 ---- return 1; } } + my $remaining_time; foreach ($s->var_bind_names()) { $remaining_time = $s->var_bind_list()->{$_}; # returns (days),(hours),(minutes),seconds } *************** *** 453,469 **** if ( defined ( $remaining_time ) ) { # convert time to minutes my @a = split(/ /,$remaining_time); ! my $timeUnit = @a[1]; my $minutes = 0; if ( $timeUnit =~ /hour/ ) { # hours returned ! my @minutesArray = split(/:/,@a[2]); ! $minutes = @a[0] * 60; ! $minutes = $minutes + @minutesArray[0]; } elsif ( $timeUnit =~ /minute/ ) { # minutes returned ! $minutes = @a[0]; } else { # seconds returned? $minutes = 0; --- 468,484 ---- if ( defined ( $remaining_time ) ) { # convert time to minutes my @a = split(/ /,$remaining_time); ! my $timeUnit = $a[1]; my $minutes = 0; if ( $timeUnit =~ /hour/ ) { # hours returned ! my @minutesArray = split(/:/,$a[2]); ! $minutes = $a[0] * 60; ! $minutes = $minutes + $minutesArray[0]; } elsif ( $timeUnit =~ /minute/ ) { # minutes returned ! $minutes = $a[0]; } else { # seconds returned? $minutes = 0;
You must be logged in to submit a review.
To:
From: