Logoj0ke.net Open Build Service > Projects > server:monitoring > nagios-plugins-lsi > check_sas2ircu
Sign Up | Log In

File check_sas2ircu of Package nagios-plugins-lsi

 
1
#!/usr/bin/perl -w
2
# Nagios plugin that checks LSI SAS2 controllers RAID status via sas2ircu
3
# program
4
5
# Copyright (C) 2011 Emmanuel Lacour <elacour@home-dn.net>
6
#
7
# This file is free software; you can redistribute it and/or modify it
8
# under the terms of the GNU General Public License as published by the
9
# Free Software Foundation; either version 2, or (at your option) any
10
# later version.
11
#
12
# This file is distributed in the hope that it will be
13
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
14
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
# General Public License for more details.
16
#
17
# You should have received a copy of the GNU General Public License
18
# along with this file; see the file COPYING.  If not, write to the Free
19
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20
# 02110-1301, USA.
21
22
23
24
use strict;
25
use lib qw(/usr/local/lib/nagios/plugins /usr/lib/nagios/plugins);
26
use utils qw(%ERRORS);
27
28
my $sas2ircu = '/usr/sbin/sas2ircu';
29
my $status = $ERRORS{'OK'};
30
my %controllers;
31
my $errors_message;
32
33
unless ( -x $sas2ircu ) {
34
    print "$sas2ircu not found or not executable\n";
35
    exit ($ERRORS{'UNKNOWN'});
36
}
37
38
unless ( $> == 0 ) {
39
    print "This program must be run as root. You may use wrappers like sudo to do this.\n";
40
    exit ($ERRORS{'UNKNOWN'});
41
}
42
43
foreach my $line (split /\n/, `$sas2ircu LIST`) {
44
    if ( $line =~ /^\s+(\d+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s*$/ ) {
45
        my $ctrl_id = $1;
46
        my $ctrl_type = $2;
47
        $controllers{$ctrl_id}{type} = $ctrl_type;
48
    }
49
}
50
51
unless ( scalar keys %controllers ) {
52
    print "No controller found\n";
53
    exit ($ERRORS{'UNKNOWN'});
54
}
55
56
foreach my $ctrl_id (keys %controllers) {
57
    my $infos = `$sas2ircu $ctrl_id DISPLAY`;
58
59
    my %ctrl_infos;
60
    my $ctrl_start;
61
    foreach my $line (split /\n/, $infos) {
62
    chomp($line);
63
        if ( $line =~ /^Controller information/ ) {
64
            $ctrl_start = 1;
65
            next;
66
        }
67
    next unless ( $ctrl_start );
68
        if ( $line =~ /^-/ && $ctrl_start == 1 ) {
69
            $ctrl_start = 2;
70
            next;
71
        }
72
        if ( $line =~ /^-/ && $ctrl_start == 2 ) {
73
            $ctrl_start = 0;
74
            next;
75
        }
76
        next unless ( $ctrl_start == 2 );
77
        if ( $line =~ /^\s*(.*)\s+:\s+(.*)$/ ) {
78
            my $key = $1;
79
            my $value = $2;
80
            $key =~ s/\s+$//;
81
            $key =~ s/^\s+//;
82
            $value =~ s/\s+$//;
83
            $value =~ s/^\s+//;
84
            $ctrl_infos{$key} = $value;
85
        }
86
    }
87
88
    # Volumes
89
    my %volumes_infos;
90
    my $volume_id = undef;
91
    foreach my $line (split /\n/, $infos) {
92
    chomp($line);
93
        if ( $line =~ /^IR volume (\d+)\s*$/ ) {
94
            $volume_id = $1;
95
            next;
96
        }
97
        if ( defined($volume_id) && $line =~ /^\s*$/ ) {
98
            $volume_id = undef;
99
            next;
100
        }
101
        next unless ( defined($volume_id) );
102
        if ( $line =~ /^\s*(.*)\s+:\s+(.*)\s*$/ ) {
103
            my $key = $1;
104
            my $value = $2;
105
            $key =~ s/\s+$//;
106
            $key =~ s/^\s+//;
107
            $value =~ s/\s+$//;
108
            $value =~ s/^\s+//;
109
            if ( $key =~ /^PHY/ ) {
110
                push @{$volumes_infos{$volume_id}{'disks'}}, $value;
111
            } else {
112
                $volumes_infos{$volume_id}{$key} = $value;
113
            }
114
        }
115
    }
116
117
    unless ( scalar keys %volumes_infos ) {
118
        print "\tNo volume found\n";
119
        next;
120
    }
121
122
    # Disks
123
    my %disks_infos;
124
    my $disk_start = 0;
125
    my $disk_encl = undef;
126
    my $disk_slot = undef;
127
    foreach my $line (split /\n/, $infos) {
128
    chomp($line);
129
        if ( $line =~ /^Device is a Hard disk/ ) {
130
            $disk_start = 1;
131
            next;
132
        }
133
        if ( $disk_start && $line =~ /^\s*$/ ) {
134
            $disk_start = 0;
135
            $disk_encl = undef;
136
            $disk_slot = undef;
137
            next;
138
        }
139
        next unless ( $disk_start );
140
        if ( $line =~ /^\s*(.*)\s+:\s+(.*)\s*$/ ) {
141
            my $key = $1;
142
            my $value = $2;
143
            $key =~ s/\s+$//;
144
            $key =~ s/^\s+//;
145
            $value =~ s/\s+$//;
146
            $value =~ s/^\s+//;
147
            if ( $key eq 'Enclosure #' ) {
148
                $disk_encl = $value;
149
                next;
150
            }
151
            if ( $key eq 'Slot #' ) {
152
                $disk_slot = $value;
153
                next;
154
            }
155
            if ( defined($disk_encl) && defined($disk_slot) ) {
156
                $disks_infos{$disk_encl.':'.$disk_slot}{$key} = $value;
157
            }
158
        }
159
    }
160
161
    foreach my $volume_id (keys %volumes_infos) {
162
        unless ( $volumes_infos{$volume_id}{'Status of volume'} eq 'Okay (OKY)' ) {
163
            $errors_message .= "Ctrl $ctrl_id: vol $volume_id ".$volumes_infos{$volume_id}{'Status of volume'};
164
            $status = $ERRORS{'CRITICAL'} unless ( $volumes_infos{$volume_id}{'Status of volume'} eq 'Okay (OKY)' );
165
        }
166
167
        unless ( scalar @{$volumes_infos{$volume_id}{disks}} ) {
168
            # FIXME is this critical, can this happens ?
169
            next;
170
        }
171
172
        foreach my $disk (@{$volumes_infos{$volume_id}{disks}}) {
173
            unless ( $disks_infos{$disk} ) {
174
                $errors_message .= ", disk $disk not found!";
175
                $status = $ERRORS{'CRITICAL'};
176
                next;
177
            }
178
            unless ( $disks_infos{$disk}{'State'} eq 'Optimal (OPT)' ) {
179
                $errors_message .= ", disk: ".$disk." : ".$disks_infos{$disk}{'State'};
180
                $status = $ERRORS{'CRITICAL'} unless ( $disks_infos{$disk}{'State'} eq 'Optimal (OPT)' );
181
            }
182
        }
183
    }
184
}
185
186
if ( $status == $ERRORS{'OK'} ) {
187
    print "All arrays OK\n";
188
} elsif ( $errors_message ) {
189
    print "$errors_message\n";
190
}
191
192
exit ($status);
193