Author: arekm                        Date: Thu Mar 10 12:31:14 2011 GMT
Module: packages                      Tag: HEAD
---- Log message:
- initial

---- Files affected:
packages/nagios-plugin-check_megaraid_sas:
   check_megaraid_sas (NONE -> 1.1)  (NEW), 
nagios-plugin-check_megaraid_sas.spec (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: packages/nagios-plugin-check_megaraid_sas/check_megaraid_sas
diff -u /dev/null 
packages/nagios-plugin-check_megaraid_sas/check_megaraid_sas:1.1
--- /dev/null   Thu Mar 10 13:31:14 2011
+++ packages/nagios-plugin-check_megaraid_sas/check_megaraid_sas        Thu Mar 
10 13:31:08 2011
@@ -0,0 +1,243 @@
+#!/usr/bin/perl -w
+
+# check_megaraid_sas Nagios plugin
+# Copyright (C) 2007  Jonathan Delgado, [email protected]
+# 
+# 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
USA.
+# 
+# 
+# Nagios plugin to monitor the status of volumes attached to a LSI Megaraid 
SAS 
+# controller, such as the Dell PERC5/i and PERC5/e. If you have any hotspares 
+# attached to the controller, you can specify the number you should expect to 
+# find with the '-s' flag.
+#
+# The paths for the Nagios plugins lib and MegaCli may need to me changed.
+#
+# Code for correct RAID level reporting contributed by Frode Nordahl, 
2009/01/12.
+#
+# $Author$
+# $Revision$ $Date$
+
+use strict;
+use Getopt::Std;
+use lib qw(/usr/lib/nagios/plugins /usr/lib64/nagios/plugins); # possible 
pathes to your Nagios plugins and utils.pm
+use utils qw(%ERRORS);
+
+our($opt_h, $opt_s, $opt_o, $opt_m, $opt_p);
+
+
+getopts('hs:o:p:m:');
+
+if ( $opt_h ) {
+       print "Usage: $0 [-s number] [-m number] [-o number]\n";
+       print "       -s is how many hotspares are attached to the 
controller\n";
+       print "       -m is the number of media errors to ignore\n";
+       print "       -p is the predictive error count to ignore\n";
+       print "       -o is the number of other disk errors to ignore\n";
+       exit;
+}
+
+my $megaclibin = '/usr/sbin/MegaCli';  # the full path to your MegaCli binary
+my $megacli = "sudo $megaclibin";      # how we actually call MegaCli
+my $megapostopt = '-NoLog';            # additional options to call at the end 
of MegaCli arguments
+
+my ($adapters);
+my $hotspares = 0;
+my $hotsparecount = 0;
+my $pdbad = 0;
+my $pdcount = 0;
+my $mediaerrors = 0;
+my $mediaallow = 0;
+my $prederrors = 0;
+my $predallow = 0;
+my $othererrors = 0;
+my $otherallow = 0;
+my $result = '';
+my $status = 'OK';
+
+sub max_state ($$) {
+       my ($current, $compare) = @_;
+       
+       if (($compare eq 'CRITICAL') || ($current eq 'CRITICAL')) {
+               return 'CRITICAL';
+       } elsif ($compare eq 'OK') {
+               return $current;
+       } elsif ($compare eq 'WARNING') {
+               return 'WARNING';
+       } elsif (($compare eq 'UNKNOWN') && ($current eq 'OK')) {
+               return 'UNKNOWN';
+       } else {
+               return $current;
+       }
+}
+
+sub exitreport ($$) {
+       my ($status, $message) = @_;
+       
+       print STDOUT "$status: $message\n";
+       exit $ERRORS{$status};
+}
+
+
+if ( $opt_s ) {
+       $hotspares = $opt_s;
+}
+if ( $opt_m ) {
+       $mediaallow = $opt_m;
+}
+if ( $opt_p ) {
+       $predallow = $opt_p;
+}
+if ( $opt_o ) {
+       $otherallow = $opt_o;
+}
+
+# Some sanity checks that you actually have something where you think MegaCli 
is
+(-e $megaclibin)
+       || exitreport('UNKNOWN',"error: $megaclibin does not exist");   
+
+# Get the number of RAID controllers we have
+open (ADPCOUNT, "$megacli -adpCount $megapostopt |")  
+       || exitreport('UNKNOWN',"error: Could not execute $megacli -adpCount 
$megapostopt");
+
+while (<ADPCOUNT>) {
+       if ( m/Controller Count:\s*(\d+)/ ) {
+               $adapters = $1;
+               last;
+       }
+}
+close ADPCOUNT;
+
+ADAPTER: for ( my $adp = 0; $adp < $adapters; $adp++ ) {
+       # Get the number of logical drives on this adapter
+       open (LDGETNUM, "$megacli -LdGetNum -a$adp $megapostopt |") 
+               || exitreport('UNKNOWN', "error: Could not execute $megacli 
-LdGetNum -a$adp $megapostopt");
+       
+       my ($ldnum);
+       while (<LDGETNUM>) {
+               if ( m/Number of Virtual drives configured on adapter 
\d:\s*(\d+)/i ) {
+                       $ldnum = $1;
+                       last;
+               }
+       }
+       close LDGETNUM;
+       
+       LDISK: for ( my $ld = 0; $ld < $ldnum; $ld++ ) {
+               # Get info on this particular logical drive
+               open (LDINFO, "$megacli -LdInfo -L$ld -a$adp $megapostopt |") 
+                       || exitreport('UNKNOWN', "error: Could not execute 
$megacli -LdInfo -L$ld -a$adp $megapostopt ");
+                       
+               my ($size, $unit, $raidlevel, $ldpdcount, $state, $spandepth);
+               while (<LDINFO>) {
+                       if ( m/Size\s*:\s*((\d+\.?\d*)\s*(MB|GB|TB))/ ) {
+                               $size = $2;
+                               $unit = $3;
+                               # Adjust MB to GB if that's what we got
+                               if ( $unit eq 'MB' ) {
+                                       $size = sprintf( "%.0f", ($size / 1024) 
);
+                                       $unit= 'GB';
+                               }
+                       } elsif ( m/State\s*:\s*(\w+)/ ) {
+                               $state = $1;
+                               if ( $state ne 'Optimal' ) {
+                                       $status = 'CRITICAL';
+                               }
+                       } elsif ( m/Number Of Drives\s*(per span\s*)?:\s*(\d+)/ 
) {
+                               $ldpdcount = $2;
+                       } elsif ( m/Span Depth\s*:\s*(\d+)/ ) {
+                               $spandepth = $1;
+                       } elsif ( m/RAID Level\s*: Primary-(\d)/ ) {
+                               $raidlevel = $1;
+                       }
+               }
+               close LDINFO;
+
+               # Report correct RAID-level and number of drives in case of 
Span configurations
+               if ($ldpdcount && $spandepth > 1) {
+                       $ldpdcount = $ldpdcount * $spandepth;
+                       if ($raidlevel < 10) {
+                               $raidlevel = $raidlevel . "0";
+                       }
+               }
+               
+               $result .= "$adp:$ld:RAID-$raidlevel:$ldpdcount 
drives:$size$unit:$state ";
+               
+       } #LDISK
+       close LDINFO;
+       
+       # Get info on physical disks for this adapter
+       open (PDLIST, "$megacli -PdList  -a$adp $megapostopt |") 
+               || exitreport('UNKNOWN', "error: Could not execute $megacli 
-PdList -a$adp $megapostopt ");
+       
+       my ($slotnumber,$fwstate);
+       PDISKS: while (<PDLIST>) {
+               if ( m/Slot Number\s*:\s*(\d+)/ ) {
+                       $slotnumber = $1;
+                       $pdcount++;
+               } elsif ( m/(\w+) Error Count\s*:\s*(\d+)/ ) {
+                       if ( $1 eq 'Media') {
+                               $mediaerrors += $2;
+                       } else {
+                               $othererrors += $2;
+                       }
+               } elsif ( m/Predictive Failure Count\s*:\s*(\d+)/ ) {
+                       $prederrors += $1;
+               } elsif ( m/Firmware state\s*:\s*(\w+)/ ) {
+                       $fwstate = $1;
+                       if ( $fwstate eq 'Hotspare' ) {
+                               $hotsparecount++;
+                       } elsif ( $fwstate eq 'Online' ) {
+                               # Do nothing
+                       } elsif ( $fwstate eq 'Unconfigured' ) {
+                               # A drive not in anything, or a non drive device
+                               $pdcount--;
+                       } elsif ( $slotnumber != 255 ) {
+                               $pdbad++;
+                               $status = 'CRITICAL';
+                       }
+               }
+       } #PDISKS
+       close PDLIST;
+}
+
+$result .= "Drives:$pdcount ";
+
+# Any bad disks?
+if ( $pdbad ) {
+       $result .= "$pdbad Bad Drives ";
+}
+
+my $errorcount = $mediaerrors + $prederrors + $othererrors;
+# Were there any errors?
+if ( $errorcount ) {
+       $result .= "($errorcount Errors) ";
+       if ( ( $mediaerrors > $mediaallow ) || 
+            ( $prederrors > $predallow )   || 
+            ( $othererrors > $otherallow ) ) {
+               $status = max_state($status, 'WARNING');
+       }
+}
+
+# Do we have as many hotspares as expected (if any)
+if ( $hotspares ) {
+       if ( $hotsparecount < $hotspares ) {
+               $status = max_state($status, 'WARNING');
+               $result .= "Hotspare(s):$hotsparecount (of $hotspares)";
+       } else {
+               $result .= "Hotspare(s):$hotsparecount";
+       }
+}
+
+exitreport($status, $result);
\ No newline at end of file

================================================================
Index: 
packages/nagios-plugin-check_megaraid_sas/nagios-plugin-check_megaraid_sas.spec
diff -u /dev/null 
packages/nagios-plugin-check_megaraid_sas/nagios-plugin-check_megaraid_sas.spec:1.1
--- /dev/null   Thu Mar 10 13:31:14 2011
+++ 
packages/nagios-plugin-check_megaraid_sas/nagios-plugin-check_megaraid_sas.spec 
    Thu Mar 10 13:31:08 2011
@@ -0,0 +1,81 @@
+# $Revision$, $Date$
+%define                plugin  check_megaraid_sas
+Summary:       Nagios plugin to check the state of disk and logical drives 
attached to LSI megaraid SAS controllers
+Name:          nagios-plugin-%{plugin}
+# revision from download page
+Version:       12
+Release:       1
+License:       GPL v2
+Group:         Networking
+# 
http://exchange.nagios.org/components/com_mtree/attachment.php?link_id=680&cf_id=24
+Source0:       check_megaraid_sas
+URL:           
http://exchange.nagios.org/directory/Plugins/Hardware/Storage-Systems/RAID-Controllers/check_megaraid_sas/details
+Requires:      megaraid-sas
+Requires:      nagios-core
+Requires:      nagios-plugins-libs
+BuildArch:     noarch
+BuildRoot:     %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
+
+%define                plugindir       %{_prefix}/lib/nagios/plugins
+%define                _sysconfdir     /etc/nagios/plugins
+
+%description
+A plugin to check the health and status of disk and logical drives
+attached to LSI megaraid SAS controllers. This plugin calls LSI's
+MegaCli utility to determine the health of disks and logical drive
+units attached to Megraid SAS controllers. It has been tested by the
+author on Dell PERC 5 & 6 controllers, but should work well with any
+controller supported by the MegaCli tool.
+
+%prep
+%setup -qcT
+
+install %{SOURCE0} %{plugin}
+sed -e 's#/usr/sbin/MegaCli#/sbin/MegaCli#g' %{plugin}
+
+cat > nagios.cfg <<'EOF'
+# Usage:
+# %{plugin}
+define command {
+       command_name    %{plugin}
+       command_line    %{plugindir}/%{plugin}
+}
+
+define service {
+       use                     generic-service
+       name                    megaraid_sas
+       service_description     megaraid_sas
+       register                0
+
+       normal_check_interval   15
+       notification_interval   300
+
+       check_command           check_megaraid_sas
+}
+EOF
+
+%install
+rm -rf $RPM_BUILD_ROOT
+install -d $RPM_BUILD_ROOT{%{_sysconfdir},%{plugindir}}
+
+install %{plugin} $RPM_BUILD_ROOT%{plugindir}/%{plugin}
+cp -a nagios.cfg $RPM_BUILD_ROOT%{_sysconfdir}/%{plugin}.cfg
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(644,root,root,755)
+%config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/%{plugin}.cfg
+%attr(755,root,root) %{plugindir}/%{plugin}
+
+%define date   %(echo `LC_ALL="C" date +"%a %b %d %Y"`)
+%changelog
+* %{date} PLD Team <[email protected]>
+All persons listed below can be reached at <cvs_login>@pld-linux.org
+
+$Log$
+Revision 1.1  2011/03/10 12:31:08  arekm
+- initial
+
+
================================================================
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to