1
0

check_ups_status 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. my %ups_oids = (
  9. #default
  10. '_default'=>'.1.3.6.1.2.1.33.1.6.3.2',
  11. #apc ?
  12. 'apc'=>'.1.3.6.1.4.1.318.1.1.1.4.1.1',
  13. #eaton
  14. 'eaton'=>'.1.3.6.1.4.1.534.1.4.5.0',
  15. );
  16. my $res_state = {
  17. 'apc' =>{
  18. '1' =>'ERROR Current APC status is unknown(1)',
  19. '2' =>'OK Current APC status is onLine(2)',
  20. '3' =>'WARNING Current APC status is onBattery(3)',
  21. '4' =>'OK Current APC status is onSmartBoost(4)',
  22. '5' =>'WARNING Current APC status is timedSleeping(5)',
  23. '6' =>'WARNING Current APC status is softwareBypass(6)',
  24. '7' =>'ERROR Current APC status is off(7)',
  25. '8' =>'WARNING Current APC status is rebooting(8)',
  26. '9' =>'WARNING Current APC status is switchedBypass(9)',
  27. '10' =>'ERROR Current APC status is hardwareFailureBypass(10)',
  28. '11' =>'WARNING Current APC status is sleepingUntilPowerReturn(11)'
  29. },
  30. 'eaton' => {
  31. '1' => 'UNKNOWN State: other',
  32. '2' => 'OK Offline mode: Load not powered',
  33. '3' => 'OK State normal',
  34. '4' => 'WARNING On bypass',
  35. '5' => 'WARNING On battery',
  36. '6' => 'OK Battery booster',
  37. '7' => 'OK Battery reducer',
  38. '8' => 'WARNING parallelCapacity',
  39. '9' => 'WARNING parallelRedundant',
  40. '10'=> 'OK highEfficiencyMode',
  41. }
  42. };
  43. my $res_retcode = {
  44. 'apc'=>{
  45. '1' =>'2',
  46. '2' =>'0',
  47. '3' =>'1',
  48. '4' =>'0',
  49. '5' =>'1',
  50. '6' =>'1',
  51. '7' =>'2',
  52. '8' =>'1',
  53. '9' =>'1',
  54. '10' =>'2',
  55. '11' =>'1'
  56. },
  57. 'eaton'=>{
  58. '1' =>'3',
  59. '2' =>'0',
  60. '3' =>'0',
  61. '4' =>'1',
  62. '5' =>'1',
  63. '6' =>'0',
  64. '7' =>'0',
  65. '8' =>'1',
  66. '9' =>'1',
  67. '10' =>'0',
  68. }
  69. };
  70. exit if (!$ARGV[0]);
  71. my $hostip=$ARGV[0];
  72. my ($session, $error) = Net::SNMP->session(
  73. -hostname => shift || $hostip,
  74. -community => shift || 'public',
  75. -port => shift || '161',
  76. -timeout => 5,
  77. -version => shift || '1',
  78. );
  79. if (!defined($session)) { printf("ERROR: %s.\n", $error); exit 1; }
  80. my %result;
  81. foreach my $key (sort keys %ups_oids) {
  82. my $key_oid = $ups_oids{$key};
  83. my $ret = $session->get_request( -varbindlist => [$key_oid] );
  84. my $value;
  85. if (!$ret) {
  86. #search in subtree
  87. $ret = $session->get_next_request( -varbindlist => [$key_oid] );
  88. my @keys_next = keys %$ret;
  89. if (scalar @keys_next and $keys_next[0]) {
  90. my $get_key = $keys_next[0];
  91. if ($get_key=~/^$key_oid/) {
  92. $value = $ret->{$get_key};
  93. print STDERR "Get-Next for key $key_oid: $get_key => $value\n" if ($debug);
  94. }
  95. }
  96. } else {
  97. $value = $ret->{$key_oid};
  98. print STDERR "Get: $key_oid => $value\n" if ($debug);
  99. }
  100. next if (!defined($value));
  101. $result{$key_oid}{value}=$value;
  102. $result{$key_oid}{vendor}=$key;
  103. last;
  104. }
  105. $session->close;
  106. if (!%result) { printf("OK: Unknown model. \n"); exit 0; }
  107. my $result_ok = 0;
  108. foreach my $key (keys %result) {
  109. next if (!$key);
  110. my $return_value = $result{$key}{value};
  111. next if (!defined($return_value));
  112. $result_ok = 1;
  113. #apc
  114. if ($result{$key}{vendor} eq 'apc') {
  115. print($res_state->{apc}->{$return_value}."\n");
  116. exit $res_retcode->{apc}->{$return_value};
  117. }
  118. #default
  119. if ($result{$key}{vendor} eq '_default') {
  120. printf("ERROR: Alarm OnBattery detected! %s\n", $return_value);
  121. exit 2;
  122. }
  123. #eaton
  124. if ($result{$key}{vendor} eq 'eaton') {
  125. print($res_state->{eaton}->{$return_value}."\n");
  126. exit $res_retcode->{eaton}->{$return_value};
  127. }
  128. }
  129. printf("OK Alarm OnBattery not found.\n\n");
  130. exit 0;