Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl -w
- # check_promise_vtrak_15XXXX_chassis.pl -- Nagios Plugin
- #
- # By Jose Luis Salas - josacar <at> gmail <dot> com
- # Based on the work of Barry O'Donovan - http://www.barryodonovan.com/ - barry <at> opensolutions <dot> ie
- # Credits for the Promise MIBs http://www.saintaardvarkthecarpeted.com/promise_gpl/
- #
- # Changelog:
- # v1.0 - Initial Release
- # v1.1 - Fixes disk ID by using regexp
- # - Added more health checks
- # v1.2 - Fixes cooling fans and temperature sensors
- #
- # Designed specifically for the VTrak 15000
- #
- # Usage: ./check_promise_vtrak_15XXXX_chassis.pl <community> <host>
- #
- # Copyright (c) 2011 Jose Luis Salas
- # Copyright (c) 2007 Barry O'Donovan - http://www.barryodonovan.com/
- # Copyright (c) 2007 Open Source Solutions Ltd - http://www.opensolutions.ie/
- #
- # Permission is hereby granted, free of charge, to any person obtaining a copy of
- # this software and associated documentation files (the "Software"), to deal in
- # the Software without restriction, including without limitation the rights to
- # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- # of the Software, and to permit persons to whom the Software is furnished to do
- # so, subject to the following conditions:
- #
- # The above copyright notice and this permission notice shall be included in all
- # copies or substantial portions of the Software.
- #
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
- # INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- # PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- # HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- use strict;
- use Net::SNMP;
- my $status;
- my $TIMEOUT = 20;
- my %ERRORS = ('UNKNOWN' , '-1',
- 'OK' , '0',
- 'WARNING', '1',
- 'CRITICAL', '2');
- my $state = "OK";
- my $answer = "";
- my $snmpkey;
- my $key;
- my $community = "public";
- my $port = 161;
- #ptDiskFuncStatus OBJECT-TYPE
- # SYNTAX INTEGER {
- # unknown(-1),
- # functional(0),
- # offline(1),
- # functionalNeedsRebuild(2)
- # warning(3)
- # error(4)
- # }
- # MAX-ACCESS read-only
- # STATUS current
- # DESCRIPTION "Functional Status of Disk"
- # ::= { ptDiskEntry 4 }
- my $snmpDiskStatusTable = '1.3.6.1.4.1.7933.1.5.1.2.4.1.4';
- #ptBatteryCapacity OBJECT-TYPE
- # SYNTAX INTEGER
- # MAX-ACCESS read-only
- # STATUS current
- # DESCRIPTION "Battery capacity"
- # ::= { ptEnclosureObjs 8 }
- my $snmpBatteryStatus = '1.3.6.1.4.1.7933.1.5.3.2.8.0';
- #ptFanSpeeds OBJECT-TYPE
- # SYNTAX DisplayString
- # MAX-ACCESS read-only
- # STATUS current
- # DESCRIPTION "Enclosure fans speed, seperated by blank"
- # ::= { ptEnclosureObjs 7 }
- my $snmpCoolingDeviceStatusTable = '.1.3.6.1.4.1.7933.1.5.3.2.7';
- #ptTemperatures OBJECT-TYPE
- # SYNTAX DisplayString
- # MAX-ACCESS read-only
- # STATUS current
- # DESCRIPTION "Enclosure temperatures, separated by blank "
- # ::= { ptEnclosureObjs 5 }
- my $snmpTemperatureStatusTable = '.1.3.6.1.4.1.7933.1.5.3.2.5';
- #ptDiskMaintActivity OBJECT-TYPE
- # SYNTAX INTEGER {
- # none(0),
- # rebuilding(1),
- # synchronizing(2)
- # }
- # MAX-ACCESS read-only
- # STATUS current
- # DESCRIPTION "Whether Disk is idle or under maintenance activity"
- # ::= { ptDiskEntry 6 }
- my $snmpDrivesRebuilding = '.1.3.6.1.4.1.7933.1.5.1.2.4.1.6';
- #ptDiskSMARTStatus OBJECT-TYPE
- # SYNTAX INTEGER {
- # unknown(-1),
- # sMARTOK(0),
- # sMARTFail(1),
- # sMARTNotSupported(2),
- # sMARTNotAvailable(3)
- # }
- # MAX-ACCESS read-only
- # STATUS current
- # DESCRIPTION "Disk S.M.A.R.T Status (Self Monitoring Status)"
- # ::= { ptDiskEntry 7 }
- my $snmpDrivesSmartStatus = '.1.3.6.1.4.1.7933.1.5.1.2.4.1.7';
- #ptDiskAssignStatus OBJECT-TYPE
- # SYNTAX INTEGER {
- # unknown(-1),
- # free(0),
- # assigned(1)
- # claimed(2)
- # }
- # MAX-ACCESS read-only
- # STATUS current
- # DESCRIPTION "Whether or not ptDisk is assigned to an RAID Array"
- # ::= { ptDiskEntry 5 }
- my $snmpDrivesAssignStatus = '.1.3.6.1.4.1.7933.1.5.1.2.4.1.5';
- my $hostname;
- my $session;
- my $error;
- my $response = undef;
- my $usage;
- my $value;
- my $itn;
- my @psu_stats = undef;
- my @disk_stats = undef;
- my @cooldev_stats = undef;
- my @temp_stats = undef;
- my $disk = undef;
- sub setstate {
- my $newstate = shift( @_ );
- if( $ERRORS{$newstate} > $ERRORS{$state} ) {
- $state = $newstate;
- return();
- }
- if( $newstate eq 'UNKNOWN' && $state eq 'OK' ) {
- $state = $newstate;
- return();
- }
- }
- # Just in case of problems, let's not hang Nagios
- $SIG{'ALRM'} = sub {
- print ("ERROR: No snmp response from $hostname\n");
- exit $ERRORS{"UNKNOWN"};
- };
- alarm($TIMEOUT);
- $community = shift;
- $hostname = shift;
- ( $session, $error ) = Net::SNMP->session(
- -hostname => $hostname,
- -community => $community,
- -port => $port
- );
- if( !defined( $session ) ) {
- $state='UNKNOWN';
- $answer=$error;
- print ("$state: $answer");
- exit $ERRORS{$state};
- }
- ####################################################################################
- # Query the Disk States
- ####################################################################################
- if( !defined( $response = $session->get_table( $snmpDiskStatusTable ) ) ) {
- if( $session->error_status == 2 ) {
- $answer = "Disk State OID not supported.";
- } else {
- $answer=$session->error;
- }
- $session->close;
- $state = 'CRITICAL';
- print ( "$state: $answer,$snmpkey" );
- exit $ERRORS{$state};
- }
- $itn = 0;
- $disk = -1;
- foreach $snmpkey ( keys %{$response} ) {
- $disk_stats[$itn] = $response->{$snmpkey};
- if ($snmpkey =~ /(.*)\.(\d+)/){
- $disk = $2;
- }
- if( !( $disk_stats[$itn] <= 0 ) ) {
- &setstate('CRITICAL');
- $answer .= "Disk " . ( $disk ) . " in state " . $disk_stats[$itn] . "<br />";
- }
- $itn++;
- }
- ####################################################################################
- # Query the SMART Disk State
- ####################################################################################
- if( !defined( $response = $session->get_table( $snmpDrivesSmartStatus ) ) ) {
- if( $session->error_status == 2 ) {
- $answer = "Disk State OID not supported.";
- } else {
- $answer=$session->error;
- }
- $session->close;
- $state = 'CRITICAL';
- print ( "$state: $answer,$snmpkey" );
- exit $ERRORS{$state};
- }
- $itn = 0;
- $disk = -1;
- foreach $snmpkey ( keys %{$response} ) {
- $disk_stats[$itn] = $response->{$snmpkey};
- if ($snmpkey =~ /(.*)\.(\d+)/){
- $disk = $2;
- }
- if( !( $disk_stats[$itn] == 0 || $disk_stats[$itn] == 3 ) ) {
- &setstate('CRITICAL');
- $answer .= "Disk SMART " . ( $disk ) . " in state " . $disk_stats[$itn] . "<br />";
- }
- $itn++;
- }
- ####################################################################################
- # Query the Disk Assign Status
- ####################################################################################
- if( !defined( $response = $session->get_table( $snmpDrivesAssignStatus ) ) ) {
- if( $session->error_status == 2 ) {
- $answer = "Disk State OID not supported.";
- } else {
- $answer=$session->error;
- }
- $session->close;
- $state = 'CRITICAL';
- print ( "$state: $answer,$snmpkey" );
- exit $ERRORS{$state};
- }
- $itn = 0;
- $disk = -1;
- foreach $snmpkey ( keys %{$response} ) {
- $disk_stats[$itn] = $response->{$snmpkey};
- if ($snmpkey =~ /(.*)\.(\d+)/){
- $disk = $2;
- }
- if( !( $disk_stats[$itn] == 1 || $disk_stats[$itn] == 2 ) ) {
- &setstate('CRITICAL');
- $answer .= "Disk Assignation " . ( $disk ) . " in state " . $disk_stats[$itn] . "<br />";
- }
- $itn++;
- }
- ####################################################################################
- # Query the Disk Rebuild Status
- ####################################################################################
- if( !defined( $response = $session->get_table( $snmpDrivesRebuilding ) ) ) {
- if( $session->error_status == 2 ) {
- $answer = "Disk State OID not supported.";
- } else {
- $answer=$session->error;
- }
- $session->close;
- $state = 'CRITICAL';
- print ( "$state: $answer,$snmpkey" );
- exit $ERRORS{$state};
- }
- $itn = 0;
- $disk = -1;
- foreach $snmpkey ( keys %{$response} ) {
- $disk_stats[$itn] = $response->{$snmpkey};
- if ($snmpkey =~ /(.*)\.(\d+)/){
- $disk = $2;
- }
- if( !( $disk_stats[$itn] == 0 ) ) {
- &setstate('CRITICAL');
- $answer .= "Disk " . ( $disk ) . " is in rebuilding/synchronizing state <br />";
- }
- $itn++;
- }
- ####################################################################################
- # Query the Battery States
- ####################################################################################
- if( !defined( $response = $session->get_request( $snmpBatteryStatus ) ) ) {
- if( $session->error_status == 2 ) {
- $answer = "Battery OID not supported.";
- } else {
- $answer=$session->error;
- }
- $session->close;
- $state = 'CRITICAL';
- print ("$state: $answer");
- exit $ERRORS{$state};
- }
- if( $response->{$snmpBatteryStatus} && !( $response->{$snmpBatteryStatus} > 1000 ) ) {
- &setstate('WARNING');
- $answer .= "Battery status is: " . $response->{$snmpBatteryStatus} . "<br />";
- }
- ####################################################################################
- # Query the Cooling Device States
- ####################################################################################
- if( !defined( $response = $session->get_table( $snmpCoolingDeviceStatusTable ) ) ) {
- if( $session->error_status == 2 ) {
- $answer = "Cooling Device OID not supported.";
- } else {
- $answer=$session->error;
- }
- $session->close;
- $state = 'CRITICAL';
- print ( "$state: $answer,$snmpkey" );
- exit $ERRORS{$state};
- }
- $itn = 0;
- foreach $snmpkey ( keys %{$response} ) {
- $cooldev_stats[$itn] = $response->{$snmpkey};
- my @vector = split(' ',$cooldev_stats[$itn]);
- foreach $value ( @vector ) {
- if( !( $value > 1300 ) ) {
- &setstate('CRITICAL');
- $answer .= "Cooling device #" . ( $itn + 1 ) . " has " . $value . " RPM <br />";
- }
- $itn++;
- }
- }
- ####################################################################################
- # Query the Temperature States
- ####################################################################################
- if( !defined( $response = $session->get_table( $snmpTemperatureStatusTable ) ) ){
- if( $session->error_status == 2 ) {
- $answer = "Temperature States OID not supported.";
- }
- else {
- $answer=$session->error;
- }
- $session->close;
- $state = 'CRITICAL';
- print ( "$state: $answer,$snmpkey" );
- exit $ERRORS{$state};
- }
- $itn = 0;
- foreach $snmpkey ( keys %{$response} ) {
- $temp_stats[$itn] = $response->{$snmpkey};
- my @vector = split(' ',$temp_stats[$itn]);
- foreach $value ( @vector ) {
- if( $value > 4000 ) {
- &setstate('CRITICAL');
- $answer .= "Temperature sensor #" . ( $itn + 1 ) . " is " . $value/100 . " degrees Celsius <br />";
- }
- $itn++;
- }
- }
- ####################################################################################
- ####################################################################################
- $session->close;
- if($state eq 'OK'){
- print "Promise VTrak 15000 Chassis and Disks OK\n";
- } else {
- print "$answer\n";
- }
- exit $ERRORS{$state};
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement