#!/usr/bin/perl # # See LICENSE for copyright information # # check_3wareraid.pl # # NetSaint host script to get the RAID status from a client that is running # netsaint_statd. # require 5.003; BEGIN { $ENV{PATH} = '/bin' } use Socket; use POSIX; sub usage; my $TIMEOUT = 15; my %ERRORS = ('UNKNOWN', '-1', 'OK', '0', 'WARNING', '1', 'CRITICAL', '2'); my $remote = shift || &usage(%ERRORS); my $warn = shift || 15; my $crit = shift || ($warn + 20); my $port = shift || 1040; my $remoteaddr = inet_aton("$remote"); my $paddr = sockaddr_in($port, $remoteaddr) || die "Can't create info for connection: #!\n";; my $proto = getprotobyname('tcp'); socket(Server, PF_INET, SOCK_STREAM, $proto) || die "Can't create socket: $!"; setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, 1); connect(Server, $paddr) || die "Can't connect to server: $!"; my $state = "OK"; my $answer = undef; # Just in case of problems, let's not hang NetSaint $SIG{'ALRM'} = sub { close(Server); select(STDOUT); print "No Answer from Client\n"; exit $ERRORS{"UNKNOWN"}; }; alarm($TIMEOUT); select(Server); $| = 1; print Server "raid\n"; my ($servanswer) = ; alarm(0); close(Server); select(STDOUT); if ($servanswer =~ m%^Reconstruct%) { $state = "WARNING"; $answer = $servanswer; } else { if ($servanswer =~ m%^Degraded%) { $state = "CRITICAL"; $answer = $servanswer; } else { if ($servanswer =~ m%^Optimal%) { $state = "OK"; $answer = $servanswer; } else { $answer = $servanswer; $state = "CRITICAL"; } } } print $answer; exit $ERRORS{$state}; sub usage { print "Minimum arguments not supplied!\n"; print "\n"; print "Perl Check RAID plugin for NetSaint\n"; print "based upon work done by Charlie Cook & Nick Reinking for Perl Check Users plugin\n"; print "Copyright (c) 1999 Charlie Cook & Nick Reinking\n"; print "Copyright (c) 2004 Dan Langille\n"; print "\n"; print "Usage: $0 \n"; print "\n"; exit $ERRORS{"UNKNOWN"}; }