new check for awkward PeRC controllers
[mirror/dsa-nagios.git] / dsa-nagios-checks / checks / dsa-check-raid-megactl
1 #!/usr/bin/perl
2
3 use warnings;
4 use strict;
5
6 my $devs = {};
7 my @errs;
8 my @warn;
9 my @ok;
10
11 my @cmd = ('sudo', 'megactl', '-Hv', '2>&1');
12 my @output = `@cmd`;
13
14 for my $line (@output) {
15         if ($line =~ /^(\w+)\s+/) {
16                 my $dev = $1;
17                 my @line = split /\s+/, $line;
18                 $devs->{$dev}->{'header'} = \@line;
19                 next;
20         }
21 }
22
23 sub check_controller {
24         my $dev = shift;
25         my ($err, $warn, $ok) = undef;
26         $ok .= "$dev->{'header'}->[0]: ";
27         for my $stat (@{$dev->{'header'}}) {
28                 if ($stat =~ /batt:(.*)/) {
29                         if ($1 ne 'good') {
30                                 $warn .= "$dev->{'header'}->[0]: " unless $warn;
31                                 $warn .= "Battery: $1 ";
32                         }
33                 }
34         }
35         $ok = "$dev->{'header'}->[0]: ok ";
36         return ($ok, $err, $warn);
37 }
38
39 sub check_ld {
40         my $dev = shift;
41         my ($err, $warn, $ok) = undef;
42         if ($dev->{'header'}->[5] ne 'online') {
43                 $err .= "$dev->{'header'}->[0]: $dev->{'header'}->[5]";
44                 return ($ok, $err, $warn);
45         }
46         $ok = "$dev->{'header'}->[0]: ok ";
47         return ($ok, $err, $warn);
48 }
49
50 sub check_pd {
51         my $dev = shift;
52         my ($err, $warn, $ok) = undef;
53         if ($dev->{'header'}->[5] ne 'online') {
54                 $err .= "$dev->{'header'}->[0]: $dev->{'header'}->[5]";
55                 return ($ok, $err, $warn);
56         }
57         for my $stat (@{$dev->{'header'}}) {
58                 if ($stat =~ /(^errs|media|other):/) {
59                         $warn .= "$dev->{'header'}->[0]: " unless $warn;
60                         $warn .= $stat . " ";
61                 }
62         }
63         $ok = "$dev->{'header'}->[0]: ok ";
64         return ($ok, $err, $warn);
65 }
66
67 for my $dev (sort keys %$devs) {
68         if ($dev =~ /^\w\d$/) {
69                 my ($ok, $err, $warn) = check_controller($devs->{$dev});
70                 push @errs, $err if $err;
71                 push @warn, $warn if $warn;
72                 push @ok, $ok if $ok;
73         } elsif ($dev =~ /^\w\d\w\d$/) {
74                 my ($ok, $err, $warn) = check_ld($devs->{$dev});
75                 push @errs, $err if $err;
76                 push @warn, $warn if $warn;
77                 push @ok, $ok if $ok;
78         } elsif ($dev =~ /^\w+\d+\w+\d+\w+\d+/) {
79                 my ($ok, $err, $warn) = check_pd($devs->{$dev});
80                 push @errs, $err if $err;
81                 push @warn, $warn if $warn;
82                 push @ok, $ok if $ok;
83         }
84 }
85
86 if (@errs) {
87         print "CRITICAL: ";
88         print @errs;
89         print "\n";
90         exit 1;
91 } elsif (@warn) {
92         print "WARNING: ";
93         print @warn;
94         print "\n";
95         exit 2;
96 }
97 unless (@ok) {
98         push @ok, "All devices OK";
99 }
100 print "OK: ";
101 print @ok;
102 print "\n";
103 exit 0;
104