Author: glen                         Date: Mon Nov 22 14:33:30 2010 GMT
Module: packages                      Tag: HEAD
---- Log message:
- Added checks via HP hpacucli utility.

---- Files affected:
packages/nagios-plugin-check_raid:
   check_raid (1.83 -> 1.84) 

---- Diffs:

================================================================
Index: packages/nagios-plugin-check_raid/check_raid
diff -u packages/nagios-plugin-check_raid/check_raid:1.83 
packages/nagios-plugin-check_raid/check_raid:1.84
--- packages/nagios-plugin-check_raid/check_raid:1.83   Mon Nov 22 15:20:15 2010
+++ packages/nagios-plugin-check_raid/check_raid        Mon Nov 22 15:33:24 2010
@@ -12,6 +12,8 @@
 # http://www.steveshipway.org/forum/viewtopic.php?f=20&t=417&p=3211
 # Steve Shipway Thanks M Carmier for megaraid section.
 # 2009-2010 Elan Ruusamäe <[email protected]>
+#
+# $Id$
 
 # Requires: perl 5.8 for the open(my $fh , '-|', @CMD) syntax
 # you may workaround for earlier perl it as:
@@ -52,8 +54,7 @@
 # - Added LSI MegaRaid via CmdTool2
 # - Added HP/Compaq Smart Array via cciss_vol_status
 # - Added HP MSA1500 check via serial line
-#
-# $Id$
+# - Added checks via HP hpacucli utility.
 
 use strict;
 use Getopt::Long;
@@ -80,6 +81,7 @@
 my $megarc = which('megarc');
 my $cmdtool2 = which('CmdTool2');
 my $cciss_vol_status = which('cciss_vol_status');
+my $hpacucli = which('hpacucli');
 
 #####################################################################
 sub print_usage () {
@@ -922,6 +924,104 @@
        $message .= "cciss: ".join(', ', @status) if @status;
 }
 
+sub check_hpacucli {
+       my @CMD = $hpacucli;
+       unshift(@CMD, $sudo) if $> and $sudo;
+
+       # status messages pushed here
+       my @status;
+
+       # TODO: allow target customize:
+       # hpacucli <target> is of format:
+       #  [controller 
all|slot=#|wwn=#|chassisname="AAA"|serialnumber=#|chassisserialnumber=#|ctrlpath=#:#
 ]
+       #  [array all|<id>]
+       #  [physicaldrive all|allunassigned|[#:]#:#|[#:]#:#-[#:]#:#]
+       #  [logicaldrive all|#]
+       #  [enclosure all|#:#|serialnumber=#|chassisname=#]
+       #  [licensekey all|<key>]
+
+       # Scan controllers
+       my (%targets, $fh);
+       open($fh , '-|', @CMD, 'controller', 'all', 'show', 'status') or return;
+       while (<$fh>) {
+               # Numeric slot
+               if (my($model, $slot) = /^(\S.+) in Slot (\d+)/) {
+                       $targets{"slot=$slot"} = $model;
+                       next;
+               }
+               # Named Entry
+               if (my($model, $cn) = /^(\S.+) in (.+)/) {
+                       $targets{"chassisname=$cn"} = $cn;
+                       next;
+               }
+       }
+       close $fh;
+
+       unless (%targets) {
+               $status = $ERRORS{WARNING} unless $status;
+               $message .= "hpacucli: No Controllers were found on this 
machine";
+               return;
+       }
+
+
+       # Scan logical drives
+       while (my($target, $model) = each %targets) {
+               # check each controllers
+               open($fh , '-|', @CMD, 'controller', $target, 'logicaldrive', 
'all', 'show') or next;
+
+               my ($array, %array);
+               while (<$fh>) {
+                       # "array A"
+                       # "array A (Failed)"
+                       # "array B (Failed)"
+                       if (my($a, $s) = /^\s+array (\S+)(?:\s*\((\S+)\))?$/) {
+                               $array = $a;
+                               # Offset 0 is Array own status
+                               # XXX: I don't like this one: undef could be 
false positive
+                               $array{$array}[0] = $s || 'OK';
+                       }
+
+                       # skip if no active array yet
+                       next unless $array;
+
+                       # logicaldrive 1 (68.3 GB, RAID 1, OK)
+                       # capture only status
+                       if (my($drive, $s) = /^\s+logicaldrive (\d+) \([\d.]+ 
.B, [^,]+, (\S+)\)$/) {
+                               # Offset 1 is each logical drive status
+                               $array{$array}[1]{$drive} = $s;
+                       }
+               }
+               close $fh;
+
+               my @cstatus;
+               while (my($array, $d) = each %array) {
+                       my ($astatus, $ld) = @$d;
+
+                       if ($astatus eq 'OK') {
+                               push(@cstatus, "Array $array($astatus)");
+                       } else {
+                               my @astatus;
+                               # extra details for non-normal arrays
+                               foreach my $lun (sort { $a cmp $b } keys %$ld) {
+                                       my $s = $ld->{$lun};
+                                       push(@astatus, "LUN$lun:$s");
+
+                                       if ($s eq 'OK' or $s eq 'Disabled') {
+                                       } elsif ($s eq 'Failed' or $s eq 
'Interim Recovery Mode') {
+                                               $status = $ERRORS{CRITICAL};
+                                       } elsif ($s eq 'Rebuild' or $s eq 
'Recover') {
+                                               $status = $ERRORS{WARNING} 
unless $status;
+                                       }
+                               }
+                               push(@cstatus, "Array $array($astatus)[". 
join(',', @astatus). "]");
+                       }
+               }
+               push(@status, "$model: ".join(', ', @cstatus));
+       }
+
+       $message .= "hpacucli: ".join(', ', @status) if @status;
+}
+
 # check from /sys if there are any MSA VOLUME's present.
 sub sys_have_msa {
        for my $file (</sys/block/*/device/model>) {
@@ -1193,8 +1293,8 @@
 check_megarc if $megarc;
 check_cmdtool2 if $cmdtool2;
 check_cciss if -d "/proc/driver/cciss" and valid("/proc/driver/cciss");
+check_hpacucli if $hpacucli;
 check_hp_msa if sys_have_msa;
-
 
 if ($message) {
        if ($status == $ERRORS{OK}) {
================================================================

---- CVS-web:
    
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/nagios-plugin-check_raid/check_raid?r1=1.83&r2=1.84&f=u

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to