Advertisement
josacar

Vtrak 15000 nagios plugin

Sep 22nd, 2011
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 12.25 KB | None | 0 0
  1. #!/usr/bin/perl -w
  2.  
  3. # check_promise_vtrak_15XXXX_chassis.pl   --  Nagios Plugin
  4. #
  5. # By Jose Luis Salas - josacar <at> gmail <dot> com
  6. # Based on the work of Barry O'Donovan - http://www.barryodonovan.com/ - barry <at> opensolutions <dot> ie
  7. # Credits for the Promise MIBs http://www.saintaardvarkthecarpeted.com/promise_gpl/
  8. #
  9. # Changelog:
  10. #       v1.0 - Initial Release
  11. #       v1.1 - Fixes disk ID by using regexp
  12. #            - Added more health checks
  13. #       v1.2 - Fixes cooling fans and temperature sensors
  14. #
  15. # Designed specifically for the VTrak 15000
  16. #
  17. # Usage: ./check_promise_vtrak_15XXXX_chassis.pl <community> <host>
  18. #
  19. # Copyright (c) 2011 Jose Luis Salas
  20. # Copyright (c) 2007 Barry O'Donovan - http://www.barryodonovan.com/
  21. # Copyright (c) 2007 Open Source Solutions Ltd - http://www.opensolutions.ie/
  22. #
  23. # Permission is hereby granted, free of charge, to any person obtaining a copy of
  24. # this software and associated documentation files (the "Software"), to deal in
  25. # the Software without restriction, including without limitation the rights to
  26. # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
  27. # of the Software, and to permit persons to whom the Software is furnished to do
  28. # so, subject to the following conditions:
  29. #
  30. # The above copyright notice and this permission notice shall be included in all
  31. # copies or substantial portions of the Software.
  32. #
  33. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
  34. # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  35. # PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  36. # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  37. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  38. # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  39.  
  40.  
  41. use strict;
  42. use Net::SNMP;
  43.  
  44. my $status;
  45. my $TIMEOUT = 20;
  46.  
  47. my %ERRORS = ('UNKNOWN' , '-1',
  48.               'OK' , '0',
  49.               'WARNING', '1',
  50.               'CRITICAL', '2');
  51.  
  52. my $state = "OK";
  53. my $answer = "";
  54. my $snmpkey;
  55. my $key;
  56. my $community = "public";
  57. my $port = 161;
  58.  
  59. #ptDiskFuncStatus OBJECT-TYPE
  60. #    SYNTAX INTEGER {
  61. #        unknown(-1),
  62. #        functional(0),
  63. #        offline(1),
  64. #        functionalNeedsRebuild(2)
  65. #        warning(3)
  66. #        error(4)
  67. #    }
  68. #    MAX-ACCESS read-only
  69. #    STATUS current
  70. #    DESCRIPTION "Functional Status of Disk"
  71. #    ::= { ptDiskEntry 4 }
  72. my $snmpDiskStatusTable = '1.3.6.1.4.1.7933.1.5.1.2.4.1.4';
  73.  
  74.  
  75. #ptBatteryCapacity OBJECT-TYPE
  76. #       SYNTAX     INTEGER
  77. #       MAX-ACCESS read-only
  78. #       STATUS     current
  79. #       DESCRIPTION "Battery capacity"
  80. #       ::= { ptEnclosureObjs 8 }
  81. my $snmpBatteryStatus = '1.3.6.1.4.1.7933.1.5.3.2.8.0';
  82.  
  83. #ptFanSpeeds OBJECT-TYPE
  84. #       SYNTAX     DisplayString
  85. #       MAX-ACCESS read-only
  86. #       STATUS     current
  87. #       DESCRIPTION "Enclosure fans speed, seperated by blank"
  88. #       ::= { ptEnclosureObjs 7 }
  89. my $snmpCoolingDeviceStatusTable = '.1.3.6.1.4.1.7933.1.5.3.2.7';
  90.  
  91.  
  92. #ptTemperatures OBJECT-TYPE
  93. #       SYNTAX     DisplayString
  94. #       MAX-ACCESS read-only
  95. #       STATUS     current
  96. #       DESCRIPTION "Enclosure temperatures, separated by blank "
  97. #       ::= { ptEnclosureObjs 5 }
  98. my $snmpTemperatureStatusTable = '.1.3.6.1.4.1.7933.1.5.3.2.5';
  99.  
  100. #ptDiskMaintActivity OBJECT-TYPE
  101. #    SYNTAX INTEGER {
  102. #        none(0),
  103. #        rebuilding(1),
  104. #        synchronizing(2)
  105. #    }
  106. #    MAX-ACCESS read-only
  107. #    STATUS current
  108. #    DESCRIPTION "Whether Disk is idle or under maintenance activity"
  109. #    ::= { ptDiskEntry 6 }
  110. my $snmpDrivesRebuilding = '.1.3.6.1.4.1.7933.1.5.1.2.4.1.6';
  111.  
  112. #ptDiskSMARTStatus OBJECT-TYPE
  113. #    SYNTAX INTEGER {
  114. #        unknown(-1),
  115. #        sMARTOK(0),
  116. #        sMARTFail(1),
  117. #        sMARTNotSupported(2),
  118. #        sMARTNotAvailable(3)
  119. #    }
  120. #    MAX-ACCESS read-only
  121. #    STATUS current
  122. #    DESCRIPTION "Disk S.M.A.R.T Status (Self Monitoring Status)"
  123. #    ::= { ptDiskEntry 7 }
  124. my $snmpDrivesSmartStatus = '.1.3.6.1.4.1.7933.1.5.1.2.4.1.7';
  125.  
  126. #ptDiskAssignStatus OBJECT-TYPE
  127. #    SYNTAX INTEGER {
  128. #         unknown(-1),
  129. #         free(0),
  130. #         assigned(1)
  131. #         claimed(2)
  132. #    }
  133. #    MAX-ACCESS read-only
  134. #    STATUS current
  135. #    DESCRIPTION "Whether or not ptDisk is assigned to an RAID Array"
  136. #    ::= { ptDiskEntry 5 }
  137. my $snmpDrivesAssignStatus = '.1.3.6.1.4.1.7933.1.5.1.2.4.1.5';
  138.  
  139. my $hostname;
  140. my $session;
  141. my $error;
  142. my $response = undef;
  143. my $usage;
  144. my $value;
  145.  
  146. my $itn;
  147. my @psu_stats = undef;
  148. my @disk_stats = undef;
  149. my @cooldev_stats = undef;
  150. my @temp_stats = undef;
  151. my $disk = undef;
  152.  
  153. sub setstate {
  154.     my $newstate = shift( @_ );
  155.  
  156.     if( $ERRORS{$newstate} > $ERRORS{$state} )     {
  157.         $state = $newstate;
  158.         return();
  159.     }
  160.    
  161.     if( $newstate eq 'UNKNOWN' && $state eq 'OK' )     {
  162.         $state = $newstate;
  163.         return();
  164.     }
  165. }
  166.  
  167. # Just in case of problems, let's not hang Nagios
  168. $SIG{'ALRM'} = sub {
  169.      print ("ERROR: No snmp response from $hostname\n");
  170.      exit $ERRORS{"UNKNOWN"};
  171. };
  172. alarm($TIMEOUT);
  173.  
  174. $community = shift;
  175. $hostname  = shift;
  176.  
  177. ( $session, $error ) = Net::SNMP->session(
  178.  -hostname  => $hostname,
  179.  -community => $community,
  180.  -port      => $port
  181. );
  182.  
  183. if( !defined( $session ) ) {
  184.     $state='UNKNOWN';
  185.     $answer=$error;
  186.     print ("$state: $answer");
  187.     exit $ERRORS{$state};
  188. }
  189.  
  190. ####################################################################################
  191. # Query the Disk States
  192. ####################################################################################
  193.  
  194. if( !defined( $response = $session->get_table( $snmpDiskStatusTable ) ) ) {
  195.     if( $session->error_status == 2 )     {
  196.         $answer = "Disk State OID not supported.";
  197.     }     else     {
  198.         $answer=$session->error;
  199.     }
  200.     $session->close;
  201.     $state = 'CRITICAL';
  202.     print ( "$state: $answer,$snmpkey" );
  203.     exit $ERRORS{$state};
  204. }
  205.  
  206. $itn = 0;
  207.  
  208. $disk = -1;
  209.  
  210. foreach $snmpkey ( keys %{$response} ) {
  211.     $disk_stats[$itn] = $response->{$snmpkey};
  212.    
  213.  
  214.     if ($snmpkey =~ /(.*)\.(\d+)/){
  215.         $disk = $2;
  216.     }
  217.  
  218.     if( !( $disk_stats[$itn] <= 0 ) ) {
  219.         &setstate('CRITICAL');
  220.         $answer .= "Disk " . ( $disk ) . " in state " . $disk_stats[$itn] . "<br />";
  221.     }
  222.     $itn++;
  223. }
  224.  
  225. ####################################################################################
  226. # Query the SMART Disk State
  227. ####################################################################################
  228.  
  229. if( !defined( $response = $session->get_table( $snmpDrivesSmartStatus ) ) ) {
  230.     if( $session->error_status == 2 )     {
  231.         $answer = "Disk State OID not supported.";
  232.     }     else     {
  233.         $answer=$session->error;
  234.     }
  235.     $session->close;
  236.     $state = 'CRITICAL';
  237.     print ( "$state: $answer,$snmpkey" );
  238.     exit $ERRORS{$state};
  239. }
  240.  
  241. $itn = 0;
  242.  
  243. $disk = -1;
  244.  
  245. foreach $snmpkey ( keys %{$response} ) {
  246.     $disk_stats[$itn] = $response->{$snmpkey};
  247.    
  248.  
  249.     if ($snmpkey =~ /(.*)\.(\d+)/){
  250.         $disk = $2;
  251.     }
  252.  
  253.     if( !( $disk_stats[$itn] == 0 || $disk_stats[$itn] == 3 ) ) {
  254.         &setstate('CRITICAL');
  255.         $answer .= "Disk SMART " . ( $disk ) . " in state " . $disk_stats[$itn] . "<br />";
  256.     }
  257.     $itn++;
  258. }
  259.  
  260. ####################################################################################
  261. # Query the Disk Assign Status
  262. ####################################################################################
  263.  
  264. if( !defined( $response = $session->get_table( $snmpDrivesAssignStatus ) ) ) {
  265.     if( $session->error_status == 2 )     {
  266.         $answer = "Disk State OID not supported.";
  267.     }     else     {
  268.         $answer=$session->error;
  269.     }
  270.     $session->close;
  271.     $state = 'CRITICAL';
  272.     print ( "$state: $answer,$snmpkey" );
  273.     exit $ERRORS{$state};
  274. }
  275.  
  276. $itn = 0;
  277.  
  278. $disk = -1;
  279.  
  280. foreach $snmpkey ( keys %{$response} ) {
  281.     $disk_stats[$itn] = $response->{$snmpkey};
  282.    
  283.  
  284.     if ($snmpkey =~ /(.*)\.(\d+)/){
  285.         $disk = $2;
  286.     }
  287.  
  288.     if( !( $disk_stats[$itn] == 1 || $disk_stats[$itn] == 2 ) ) {
  289.         &setstate('CRITICAL');
  290.         $answer .= "Disk Assignation " . ( $disk ) . " in state " . $disk_stats[$itn] . "<br />";
  291.     }
  292.     $itn++;
  293. }
  294.  
  295.  
  296. ####################################################################################
  297. # Query the Disk Rebuild Status
  298. ####################################################################################
  299.  
  300. if( !defined( $response = $session->get_table( $snmpDrivesRebuilding ) ) ) {
  301.     if( $session->error_status == 2 )     {
  302.         $answer = "Disk State OID not supported.";
  303.     }     else     {
  304.         $answer=$session->error;
  305.     }
  306.     $session->close;
  307.     $state = 'CRITICAL';
  308.     print ( "$state: $answer,$snmpkey" );
  309.     exit $ERRORS{$state};
  310. }
  311.  
  312. $itn = 0;
  313.  
  314. $disk = -1;
  315.  
  316. foreach $snmpkey ( keys %{$response} ) {
  317.     $disk_stats[$itn] = $response->{$snmpkey};
  318.    
  319.  
  320.     if ($snmpkey =~ /(.*)\.(\d+)/){
  321.         $disk = $2;
  322.     }
  323.  
  324.     if( !( $disk_stats[$itn] == 0 ) ) {
  325.         &setstate('CRITICAL');
  326.         $answer .= "Disk " . ( $disk ) . " is in rebuilding/synchronizing state <br />";
  327.     }
  328.     $itn++;
  329. }
  330.  
  331.  
  332. ####################################################################################
  333. # Query the Battery States
  334. ####################################################################################
  335.  
  336. if( !defined( $response = $session->get_request( $snmpBatteryStatus ) ) ) {
  337.     if( $session->error_status == 2 )     {
  338.         $answer = "Battery OID not supported.";
  339.     }     else     {
  340.         $answer=$session->error;
  341.     }
  342.     $session->close;
  343.     $state = 'CRITICAL';
  344.     print ("$state: $answer");
  345.     exit $ERRORS{$state};
  346. }
  347.  
  348. if( $response->{$snmpBatteryStatus} && !( $response->{$snmpBatteryStatus} > 1000 ) ) {
  349.     &setstate('WARNING');
  350.     $answer .= "Battery status is: " . $response->{$snmpBatteryStatus} . "<br />";
  351. }
  352.  
  353. ####################################################################################
  354. # Query the Cooling Device States
  355. ####################################################################################
  356.  
  357. if( !defined( $response = $session->get_table( $snmpCoolingDeviceStatusTable ) ) ) {
  358.     if( $session->error_status == 2 )     {
  359.         $answer = "Cooling Device OID not supported.";
  360.     } else {
  361.         $answer=$session->error;
  362.     }
  363.     $session->close;
  364.     $state = 'CRITICAL';
  365.     print ( "$state: $answer,$snmpkey" );
  366.     exit $ERRORS{$state};
  367. }
  368.  
  369. $itn = 0;
  370.  
  371. foreach $snmpkey ( keys %{$response} ) {
  372.     $cooldev_stats[$itn] = $response->{$snmpkey};
  373.    
  374.     my @vector = split(' ',$cooldev_stats[$itn]);
  375.     foreach $value ( @vector ) {
  376.             if( !( $value > 1300 ) )        {
  377.                 &setstate('CRITICAL');
  378.                 $answer .= "Cooling device #" . ( $itn + 1 ) . " has " . $value . " RPM <br />";
  379.             }
  380.         $itn++;
  381.     }
  382. }
  383.  
  384. ####################################################################################
  385. # Query the Temperature States
  386. ####################################################################################
  387.  
  388. if( !defined( $response = $session->get_table( $snmpTemperatureStatusTable ) ) ){
  389.     if( $session->error_status == 2 )     {
  390.         $answer = "Temperature States OID not supported.";
  391.     }
  392.     else     {
  393.         $answer=$session->error;
  394.     }
  395.     $session->close;
  396.     $state = 'CRITICAL';
  397.     print ( "$state: $answer,$snmpkey" );
  398.     exit $ERRORS{$state};
  399. }
  400.  
  401. $itn = 0;
  402.  
  403.     foreach $snmpkey ( keys %{$response} ) {
  404.         $temp_stats[$itn] = $response->{$snmpkey};
  405.         my @vector = split(' ',$temp_stats[$itn]);
  406.         foreach $value ( @vector ) {
  407.             if( $value > 4000 ) {
  408.                 &setstate('CRITICAL');
  409.                  $answer .= "Temperature sensor #" . ( $itn + 1 ) . " is " . $value/100 . " degrees Celsius <br />";
  410.             }
  411.             $itn++;
  412.         }
  413. }
  414.  
  415. ####################################################################################
  416. ####################################################################################
  417.  
  418. $session->close;
  419.  
  420. if($state eq 'OK'){
  421.     print "Promise VTrak 15000 Chassis and Disks OK\n";
  422. } else {
  423.     print "$answer\n";
  424. }
  425.  
  426. exit $ERRORS{$state};
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement