check_ups_battery_replace 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #!/usr/bin/perl
  2. use strict;
  3. use Net::SNMP;
  4. my $TIMEOUT = 30;
  5. $SIG{ALRM} = sub { print "ERROR: No response\n"; exit 3; };
  6. alarm($TIMEOUT);
  7. my $debug = 0;
  8. #eaton
  9. #upsBatteryAbmStatus (Charging(1),Discharging(2),Floating(3),Resting(4),unknown(5),Disconnected(6),Under Test(7),Check Battery(8)) 1.3.6.1.4.1.534.1.2.5.0
  10. #upsTestBatteryStatus (unknown (1),passed (2),failed (3),inProgress (4),notSupported (5),inhibited (6),scheduled (7)) 1.3.6.1.4.1.534.1.8.2.0
  11. my %ups_oids = (
  12. #apc ?
  13. 'apc'=>'.1.3.6.1.4.1.318.1.1.1.2.2.4.0',
  14. #upsTestBatteryStatus
  15. 'eaton'=>'.1.3.6.1.4.1.534.1.8.2.0',
  16. );
  17. exit if (!$ARGV[0]);
  18. my $hostip=$ARGV[0];
  19. my ($session, $error) = Net::SNMP->session(
  20. -hostname => shift || $hostip,
  21. -community => shift || 'public',
  22. -port => shift || '161',
  23. -timeout => 5,
  24. -version => shift || '1',
  25. );
  26. if (!defined($session)) { printf("ERROR: %s.\n", $error); exit 1; }
  27. my %result;
  28. foreach my $key (sort keys %ups_oids) {
  29. my $key_oid = $ups_oids{$key};
  30. my $ret = $session->get_request( -varbindlist => [$key_oid] );
  31. my $value;
  32. if (!$ret) {
  33. #search in subtree
  34. $ret = $session->get_next_request( -varbindlist => [$key_oid] );
  35. my @keys_next = keys %$ret;
  36. if (scalar @keys_next and $keys_next[0]) {
  37. my $get_key = $keys_next[0];
  38. if ($get_key=~/^$key_oid/) {
  39. $value = $ret->{$get_key};
  40. print STDERR "Get-Next for key $key_oid: $get_key => $value\n" if ($debug);
  41. }
  42. }
  43. } else {
  44. $value = $ret->{$key_oid};
  45. print STDERR "Get: $key_oid => $value\n" if ($debug);
  46. }
  47. next if (!defined($value));
  48. $result{$key_oid}{value}=$value;
  49. $result{$key_oid}{vendor}=$key;
  50. last;
  51. }
  52. $session->close;
  53. if (!%result) { printf("OK: Unknown model. \n"); exit 0; }
  54. my $result_ok = 0;
  55. foreach my $key (keys %result) {
  56. next if (!$key);
  57. my $return_value = $result{$key}{value};
  58. next if (!defined($return_value));
  59. $result_ok = 1;
  60. if ($result{$key}{value} eq 'apc' and $return_value > 1) {
  61. print("ERROR!!! Battery requires replacement!\n");
  62. exit 2;
  63. }
  64. #eaton
  65. if ($result{$key}{value} eq 'eaton' and ($return_value == 1 or $return_value ==3)) {
  66. print("ERROR!!! Battery requires replacement!\n");
  67. exit 2;
  68. }
  69. }
  70. if ($result_ok) {
  71. printf("OK. No Battery requires replacement.\n");
  72. exit 0;
  73. }
  74. printf("WARNING! You shouldn't have seen this. If you still see it, something clearly went wrong.\n");
  75. exit 3;