new check for awkward PeRC controllers
authorStephen Gran <steve@lobefin.net>
Sat, 30 Jul 2011 12:34:00 +0000 (13:34 +0100)
committerStephen Gran <steve@lobefin.net>
Sat, 30 Jul 2011 12:34:00 +0000 (13:34 +0100)
Signed-off-by: Stephen Gran <steve@lobefin.net>
config/nagios-master.cfg
dsa-nagios-checks/checks/dsa-check-raid-megactl [new file with mode: 0755]
dsa-nagios-checks/debian/changelog

index 80d84a5..7a6cd3e 100644 (file)
@@ -278,7 +278,7 @@ servers:
   heininen:
     address: 82.195.75.98
     parents: gw-man-da
-    hostgroups: computers, acpid-hosts, service, squeeze
+    hostgroups: computers, acpid-hosts, service, squeeze, megactl
   nielsen:
     address: 82.195.75.99
     parents: gw-man-da
@@ -798,12 +798,12 @@ servers:
   englund:
     address: 86.59.118.148
     parents: gw-sil
-    hostgroups: computers, acpid-hosts, service, apache2-hosts, squeeze, hassrvfs
+    hostgroups: computers, acpid-hosts, service, apache2-hosts, squeeze, hassrvfs, megactl
     # which raid?
   lindberg:
     address: 86.59.118.149
     parents: gw-sil
-    hostgroups: computers, acpid-hosts, service, apache2-hosts, squeeze
+    hostgroups: computers, acpid-hosts, service, apache2-hosts, squeeze, megactl
     # which raid?
 
   abel:
@@ -914,6 +914,9 @@ hostgroups:
   aacraid:
     alias: Hosts with Adaptec AACraid
     private: 1
+  megactl:
+    alias: Hosts with LSI Logic MegaRAID, but not usable with megaraid check
+    private: 1
   megaraid:
     alias: Hosts with LSI Logic MegaRAID
     private: 1
@@ -1975,6 +1978,12 @@ services:
     nrpe: "/usr/lib/nagios/plugins/dsa-check-raid-mpt"
     hostgroups: mptraid
 
+ ###
+  -
+    name: RAID - megactl
+    servicegroups: raid
+    nrpe: "/usr/lib/nagios/plugins/dsa-check-raid-megactl"
+    hostsgroups: megactl
  ###
   -
     name: process - slapd
diff --git a/dsa-nagios-checks/checks/dsa-check-raid-megactl b/dsa-nagios-checks/checks/dsa-check-raid-megactl
new file mode 100755 (executable)
index 0000000..ae7a78c
--- /dev/null
@@ -0,0 +1,104 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+
+my $devs = {};
+my @errs;
+my @warn;
+my @ok;
+
+my @cmd = ('sudo', 'megactl', '-Hv', '2>&1');
+my @output = `@cmd`;
+
+for my $line (@output) {
+       if ($line =~ /^(\w+)\s+/) {
+               my $dev = $1;
+               my @line = split /\s+/, $line;
+               $devs->{$dev}->{'header'} = \@line;
+               next;
+       }
+}
+
+sub check_controller {
+       my $dev = shift;
+       my ($err, $warn, $ok) = undef;
+       $ok .= "$dev->{'header'}->[0]: ";
+       for my $stat (@{$dev->{'header'}}) {
+               if ($stat =~ /batt:(.*)/) {
+                       if ($1 ne 'good') {
+                               $warn .= "$dev->{'header'}->[0]: " unless $warn;
+                               $warn .= "Battery: $1 ";
+                       }
+               }
+       }
+       $ok = "$dev->{'header'}->[0]: ok ";
+       return ($ok, $err, $warn);
+}
+
+sub check_ld {
+       my $dev = shift;
+       my ($err, $warn, $ok) = undef;
+       if ($dev->{'header'}->[5] ne 'online') {
+               $err .= "$dev->{'header'}->[0]: $dev->{'header'}->[5]";
+               return ($ok, $err, $warn);
+       }
+       $ok = "$dev->{'header'}->[0]: ok ";
+       return ($ok, $err, $warn);
+}
+
+sub check_pd {
+       my $dev = shift;
+       my ($err, $warn, $ok) = undef;
+       if ($dev->{'header'}->[5] ne 'online') {
+               $err .= "$dev->{'header'}->[0]: $dev->{'header'}->[5]";
+               return ($ok, $err, $warn);
+       }
+       for my $stat (@{$dev->{'header'}}) {
+               if ($stat =~ /(^errs|media|other):/) {
+                       $warn .= "$dev->{'header'}->[0]: " unless $warn;
+                       $warn .= $stat . " ";
+               }
+       }
+       $ok = "$dev->{'header'}->[0]: ok ";
+       return ($ok, $err, $warn);
+}
+
+for my $dev (sort keys %$devs) {
+       if ($dev =~ /^\w\d$/) {
+               my ($ok, $err, $warn) = check_controller($devs->{$dev});
+               push @errs, $err if $err;
+               push @warn, $warn if $warn;
+               push @ok, $ok if $ok;
+       } elsif ($dev =~ /^\w\d\w\d$/) {
+               my ($ok, $err, $warn) = check_ld($devs->{$dev});
+               push @errs, $err if $err;
+               push @warn, $warn if $warn;
+               push @ok, $ok if $ok;
+       } elsif ($dev =~ /^\w+\d+\w+\d+\w+\d+/) {
+               my ($ok, $err, $warn) = check_pd($devs->{$dev});
+               push @errs, $err if $err;
+               push @warn, $warn if $warn;
+               push @ok, $ok if $ok;
+       }
+}
+
+if (@errs) {
+       print "CRITICAL: ";
+       print @errs;
+       print "\n";
+       exit 1;
+} elsif (@warn) {
+       print "WARNING: ";
+       print @warn;
+       print "\n";
+       exit 2;
+}
+unless (@ok) {
+       push @ok, "All devices OK";
+}
+print "OK: ";
+print @ok;
+print "\n";
+exit 0;
+
index 02ef069..14bc791 100644 (file)
@@ -10,8 +10,9 @@ dsa-nagios-checks (9X) Xnstable; urgency=low
 
   [ Stephen Gran ]
   * Add event_handler to restart services
+  * Add dsa-check-raid-megactl for awkward PeRC controllers
 
- -- Stephen Gran <sgran@debian.org>  Sat, 14 May 2011 15:12:41 +0100
+ -- Stephen Gran <sgran@debian.org>  Sat, 30 Jul 2011 13:30:07 +0100
 
 dsa-nagios-checks (89) unstable; urgency=low