#!/usr/bin/perl # # See LICENSE for copyright information # # check_3wareraid.pl # # NetSaint host script to get the 3ware 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 $controller = shift || &usage(%ERRORS); 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); #print "invoking Server with:raid3wareunits $controller\n"; select(Server); $| = 1; print Server "raid3ware $controller\n"; my ($servanswer) = ; alarm(0); close(Server); select(STDOUT); chomp($servanswer); #print "REPLY: '$servanswer'\n"; $servanswer =~ s/\(//g; my @servanswer = split(/\)/,$servanswer); $answer = 'not found'; $state = 'CRITICAL'; foreach $line (@servanswer) { my ($con, $model, $ports, $drives, $units, $notopt, $rrate, $vrate, $bbu) = split(/,/, $line); if ($con eq $controller) { if ($notopt eq '0') { if ($bbu eq 'OK') { $state = "OK"; $answer = 'All units optimal. Battery: ' . $bbu; } else { $state = "WARNING"; $answer = 'All units optimal. Battery: ' . $bbu; } } else { $answer = $status; $state = "CRITICAL"; } } } print $answer; exit $ERRORS{$state}; sub usage { print "Minimum arguments not supplied!\n"; print "\n"; print "Perl Check Users plugin for NetSaint\n"; print "Copyright (c) 1999 Charlie Cook & Nick Reinking\n"; print "Copyright (c) 2006 Dan Langille\n"; print "\n"; print "Usage: $0 \n"; print "\n"; exit $ERRORS{"UNKNOWN"}; }