#!/usr/bin/perl -wT

# Copyright (c) 2002 ISOMEDIA, Inc.
# Written by Steve Milton
# Released under the GNU Public License
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# Usage:   check_raid <raid-name>
# Example: check_raid md0
#          WARNING md0 status=[UUU_U], recovery=46.4%, finish=123.0min

require 5.004;
use strict;
use lib utils.pm ;
use Plugin;
use Plugin::Parameter qw(:DEFAULT);

use vars qw($PROGNAME $opt_t $opt_raiddevice);

use utils qw(%ERRORS);

my $d_opt = new Plugin::Parameter(-name => "raiddevice",
				  -optional => "no", -valueoptional => "no", -type => "RAIDDEVICENAME",
				  -description => "Raid device to be checked for status");
my $plugin = new Plugin(-revision => '$Revision: 1.1 $',
			-copyright => "2002 ISOMEDIA, Inc, 2004 Howard Wilkinson <howard\@cohtech.com>",
			-shortcomment => "Plugin to check raid device status",
			-parameterlists => [ [ $d_opt, $t_opt ], $h_opts, $V_opts ]);


$plugin->init();

$plugin->start_timeout($opt_t, "Failed to read data from MDSTAT");

open (MDSTAT, "</proc/mdstat") or die "Failed to open /proc/mdstat";
my $found = 0;
my $status = "";
my $recovery = "";
my $finish = "";
my $active = "";
foreach my $line (<MDSTAT>) {
    if ($found) {
        if ($line =~ m/(\[[_U]+\])/) {
            $status = $1;
        } elsif ($line =~ m/recovery = (.*?)\s/) {  
            $recovery = $1;
            ($finish) = $line =~ /finish=(.*?min)/;
        }
	last;
    } else {
        if ($line =~ m/$opt_raiddevice/) {
            $found = 1;
            if ($line =~ /active/) {
                $active = 1;
            }
        }
    }
}

close (MDSTAT);

$plugin->stop_timeout();

my $msg = "FAILURE";
my $code = "UNKNOWN";
if ($status =~ /_/) {
    if ($recovery) {
        $msg = sprintf "%s status=%s, recovery=%s, finish=%s",
        $opt_raiddevice, $status, $recovery, $finish;
        $code = "WARNING";
    } else {
        $msg = sprintf "%s status=%s", $opt_raiddevice, $status;
        $code = "CRITICAL";
    }
} elsif ($status =~ /U+/) {
    $msg = sprintf "%s status=%s", $opt_raiddevice, $status;
    $code = "OK";
} else {
    if ($active) {
        $msg = sprintf "%s active with no status information",
        $opt_raiddevice;
        $code = "OK";
    } else {
        $msg = sprintf "%s does not exist", $opt_raiddevice;
        $code = "CRITICAL";
    }
}

print "$PROGNAME $code: $msg\n";
exit ($ERRORS{$code});

