packages: nagios-plugin-check_raid/check_raid - check resync status of linu...

glen glen at pld-linux.org
Tue Apr 13 11:06:14 CEST 2010


Author: glen                         Date: Tue Apr 13 09:06:14 2010 GMT
Module: packages                      Tag: HEAD
---- Log message:
- check resync status of linux md devices

---- Files affected:
packages/nagios-plugin-check_raid:
   check_raid (1.73 -> 1.74) 

---- Diffs:

================================================================
Index: packages/nagios-plugin-check_raid/check_raid
diff -u packages/nagios-plugin-check_raid/check_raid:1.73 packages/nagios-plugin-check_raid/check_raid:1.74
--- packages/nagios-plugin-check_raid/check_raid:1.73	Thu Apr  8 10:54:40 2010
+++ packages/nagios-plugin-check_raid/check_raid	Tue Apr 13 11:06:06 2010
@@ -9,7 +9,7 @@
 # 2004-2006 Steve Shipway, university of auckland,
 # http://www.steveshipway.org/forum/viewtopic.php?f=20&t=417&p=3211
 # Steve Shipway Thanks M Carmier for megaraid section.
-# 2009 Elan Ruusamäe <glen at delfi.ee>
+# 2009-2010 Elan Ruusamäe <glen at delfi.ee>
 
 # Requires: perl 5.8 for the open(my $fh , '-|', @CMD) syntax
 # you may workaround for earlier perl it as:
@@ -136,31 +136,66 @@
 }
 
 # Linux Multi-Device (md)
+# TODO: check linerar devices
 sub check_mdstat {
 	open my $fh, '<', '/proc/mdstat' or return;
 
-	my ($md, $md_units);
+	my ($md, $md_status, $resync_status);
 	my (@status, @failed_disks);
 
 	while (<$fh>) {
-		if (/^(\S+)\s+:/) {
-			$md = $1;
+		chomp;
+
+		if (my($s) = /^(\S+)\s+:/) {
+			$md = $s;
 			@failed_disks = $_ =~ m/(\S+)\[\d+\]\(F\)/g;
+			undef $resync_status;
+			next;
+		}
+
+		# linux-2.6.33/drivers/md/dm-raid1.c, device_status_char
+		# A => Alive - No failures
+		# D => Dead - A write failure occurred leaving mirror out-of-sync
+		# S => Sync - A sychronization failure occurred, mirror out-of-sync
+		# R => Read - A read failure occurred, mirror data unaffected
+		# U => for the rest
+		if (my($s) = /^\s+.*\[([U_]+)\]/) {
+			$md_status = $s;
+			next;
+		}
+
+		# linux-2.6.33/drivers/md/md.c, md_seq_show
+		if (my($action) = m{(resync=(?:PENDING|DELAYED))}) {
+			$resync_status = $action;
 			next;
 		}
-		next unless (($md_units) = /^\s+.*\[([U_]+)\]/);
+		# linux-2.6.33/drivers/md/md.c, status_resync
+		# [==>..................]  resync = 13.0% (95900032/732515712) finish=175.4min speed=60459K/sec
+		if (my($action, $perc, $eta, $speed) = m{(resync|recovery|check|reshape) = ([\d.]+%) \(\d+/\d+\) finish=([\d.]+min) speed=(\d+K/sec)}) {
+			$resync_status = "$action:$perc $speed ETA: $eta";
+			next;
+		}
+
+		# we need empty line denoting end of one md
+		next unless /^\s+$/;
+
 		next unless valid($md);
 
-		if ($md_units =~ /_/) {
+		if ($md_status =~ /_/) {
 			$status = $ERRORS{CRITICAL};
-			push(@status, "$md:@failed_disks:$md_units");
+			push(@status, "$md:@failed_disks:$md_status");
 
 		} elsif (scalar @failed_disks > 0) {
 			$status = $ERRORS{WARNING} unless $status;
-			push(@status, "$md:hot-spare failure: @failed_disks:$md_units");
+			push(@status, "$md:hot-spare failure: @failed_disks:$md_status");
+
+		} elsif ($resync_status) {
+			$status = $ERRORS{WARNING} unless $status;
+			push(@status, "$md:$md_status ($resync_status)");
+			undef $resync_status;
 
 		} else {
-			push(@status, "$md:$md_units");
+			push(@status, "$md:$md_status");
 		}
 	}
 	close $fh;
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/nagios-plugin-check_raid/check_raid?r1=1.73&r2=1.74&f=u



More information about the pld-cvs-commit mailing list