Re: mdadm script

Orion Poplawski <[email protected]>
Newsgroups gmane.comp.log.logwatch.devel
Message-ID <[email protected]>
On 01/18/2013 09:44 AM, Orion Poplawski wrote:
> Couple comments on the mdadm script:
>

Updated version with a bit more testing under the belt.  Sorry about that.


-- 
Orion Poplawski
Technical Manager                     303-415-9701 x222
NWRA, Boulder Office                  FAX: 303-415-9702
3380 Mitchell Lane                       [email protected]
Boulder, CO 80301                   http://www.nwra.com

------------------------------------------------------------------------------
Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
MVPs and experts. SALE $99.99 this month only -- learn more at:
http://p.sf.net/sfu/learnmore_122412

_______________________________________________
Logwatch-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/logwatch-devel
logwatch-mdadm.patch (text/x-patch, 6 KB)
Index: scripts/services/mdadm
===================================================================
--- scripts/services/mdadm	(revision 130)
+++ scripts/services/mdadm	(working copy)
@@ -26,80 +26,88 @@
 
 my $Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0;
 
-# TODO: remove awk dependency
-my $devices = `mdadm --examine --scan 2>/dev/null| awk '{print \$2}'`;
+my @devices = ();
+# Sometimes mdadm --examine --scan reports device with different names than
+# what is in use.  Use /etc/mdadm.conf instead if it exists.
+if ( -f "/etc/mdadm.conf" ) {
+  open(MDADM,"< /etc/mdadm.conf");
+} else {
+  open(MDADM,"mdadm --examine --scan 2>/dev/null|");
+}
+while (<MDADM>) {
+  if (/^ARRAY/) {
+    push(@devices,(split())[1]);
+  }
+}
+close(MDADM);
 
-chomp($devices);
+foreach my $dev (@devices) {
+  my %mdhash;
 
-if ($devices ne '') {
-  foreach my $dev (split(/\n/,$devices)) {
-    my $md = `mdadm --misc --detail $dev | grep -v $dev`;
-    chomp($md);
+  open(MDADM,"mdadm --misc --detail $dev |");
+  while (<MDADM>) {
+    $mdhash{'level'} = $1 if ($_ =~ /Raid Level ?: ?(.*)$/);
+    $mdhash{'active'} = $1 if ($_ =~ /Active Devices ?: ?(.*)$/);
+    $mdhash{'working'} = $1 if ($_ =~ /Working Devices ?: ?(.*)$/);
+    $mdhash{'failed'} = $1 if ($_ =~ /Failed Devices ?: ?(.*)$/);
+    $mdhash{'spare'} = $1 if ($_ =~ /Spare Devices ?: ?(.*)$/);
+    $mdhash{'state'} = $1 if ($_ =~ /State ?: ?(.*)$/);
+    $mdhash{'rebuild'} = $1 if ($_ =~ /Rebuild Status ?: ?(.*)$/);
+    push(@{$mdhash{'good devices'}},$1) if ($_ =~ /sync .*(\/dev\/[\w\d\-\_]*)/);
+    push(@{$mdhash{'middle devices'}},$1) if ($_ =~ /rebuilding .*(\/dev\/[\w\d\-\_]*)/);
+    push(@{$mdhash{'bad devices'}},$1) if ($_ =~ /faulty .*(\/dev\/[\w\d\-\_]*)/);
+  }
+  close(MDADM);
 
-    my %mdhash;
-    foreach (split(/\n/,$md)) {
-      $mdhash{'level'} = $1 if ($_ =~ /Raid Level ?: ?(.*)$/);
-      $mdhash{'active'} = $1 if ($_ =~ /Active Devices ?: ?(.*)$/);
-      $mdhash{'working'} = $1 if ($_ =~ /Working Devices ?: ?(.*)$/);
-      $mdhash{'failed'} = $1 if ($_ =~ /Failed Devices ?: ?(.*)$/);
-      $mdhash{'spare'} = $1 if ($_ =~ /Spare Devices ?: ?(.*)$/);
-      $mdhash{'state'} = $1 if ($_ =~ /State ?: ?(.*)$/);
-      $mdhash{'rebuild'} = $1 if ($_ =~ /Rebuild Status ?: ?(.*)$/);
-      push(@{$mdhash{'good devices'}},$1) if ($_ =~ /sync .*(\/dev\/[\w\d\-\_]*)/);
-      push(@{$mdhash{'middle devices'}},$1) if ($_ =~ /rebuilding .*(\/dev\/[\w\d\-\_]*)/);
-      push(@{$mdhash{'bad devices'}},$1) if ($_ =~ /faulty .*(\/dev\/[\w\d\-\_]*)/);
-    }
-
-    if ($Detail <= 4) {
-      if (lc($mdhash{'state'}) =~ /clean|active/) {
-        print "$dev : $mdhash{'state'}\n";
-      } else {
-        print "$dev : $mdhash{'state'}\n";
-        if (@{$mdhash{'middle devices'}}) {
-          if (defined($mdhash{'rebuild'}) and ($mdhash{'rebuild'} ne '')) {
-            print "\tRebuilding status: $mdhash{'rebuild'}\n";
-          }
-          print "\tRebuilding @{$mdhash{'middle devices'}}\n";
+  if ($Detail <= 4) {
+    if (lc($mdhash{'state'}) =~ /clean|active/) {
+      print "$dev : $mdhash{'state'}\n" if $Detail;
+    } else {
+      print "$dev : $mdhash{'state'}\n";
+      if (defined($mdhash{'middle devices'})) {
+        if (defined($mdhash{'rebuild'}) and ($mdhash{'rebuild'} ne '')) {
+          print "\tRebuilding status: $mdhash{'rebuild'}\n";
         }
-        if (@{$mdhash{'bad devices'}}) {
-          print "\tFailed @{$mdhash{'bad devices'}}\n";
-        }
+        print "\tRebuilding @{$mdhash{'middle devices'}}\n";
       }
+      if (defined($mdhash{'bad devices'})) {
+        print "\tFailed @{$mdhash{'bad devices'}}\n";
+      }
     }
-    elsif($Detail <= 9) {
-      if (lc($mdhash{'state'}) =~ /clean|active/) {
-        print "$dev : $mdhash{'state'} - @{$mdhash{'good devices'}}\n";
-      } else {
-        print "$dev : $mdhash{'state'}\n";
-        if (@{$mdhash{'middle devices'}}) {
-          if (defined($mdhash{'rebuild'}) and ($mdhash{'rebuild'} ne '')) {
-            print "\tRebuilding status: $mdhash{'rebuild'}\n";
-          }
-          print "\t  Rebuilding : @{$mdhash{'middle devices'}}\n";
-        }
-        if (@{$mdhash{'bad devices'}}) {
-          print "\t      Failed : @{$mdhash{'bad devices'}}\n";
-        }
-        print "\t        Good : @{$mdhash{'good devices'}}\n";
-      }
+  }
+  elsif($Detail <= 9) {
+    if (lc($mdhash{'state'}) =~ /clean|active/) {
+      print "$dev : $mdhash{'state'} - @{$mdhash{'good devices'}}\n";
     } else {
       print "$dev : $mdhash{'state'}\n";
-      print "\t  Raid Level : $mdhash{'level'}\n";
-      print "\tGood Devices : @{$mdhash{'good devices'}}\n";
-      if (defined ($mdhash{'middle devices'}) and @{$mdhash{'middle devices'}}) {
+      if (@{$mdhash{'middle devices'}}) {
         if (defined($mdhash{'rebuild'}) and ($mdhash{'rebuild'} ne '')) {
           print "\tRebuilding status: $mdhash{'rebuild'}\n";
         }
         print "\t  Rebuilding : @{$mdhash{'middle devices'}}\n";
       }
-      if (defined($mdhash{'bad devices'}) and @{$mdhash{'bad devices'}}) {
+      if (@{$mdhash{'bad devices'}}) {
         print "\t      Failed : @{$mdhash{'bad devices'}}\n";
       }
-      if ($mdhash{'spare'} ne 0) {
-        print "\t      Spares : $mdhash{'spare'}\n";
+      print "\t        Good : @{$mdhash{'good devices'}}\n";
+    }
+  } else {
+    print "$dev : $mdhash{'state'}\n";
+    print "\t  Raid Level : $mdhash{'level'}\n";
+    print "\tGood Devices : @{$mdhash{'good devices'}}\n";
+    if (defined ($mdhash{'middle devices'}) and @{$mdhash{'middle devices'}}) {
+      if (defined($mdhash{'rebuild'}) and ($mdhash{'rebuild'} ne '')) {
+        print "\tRebuilding status: $mdhash{'rebuild'}\n";
       }
-      print "\n";
+      print "\t  Rebuilding : @{$mdhash{'middle devices'}}\n";
     }
+    if (defined($mdhash{'bad devices'}) and @{$mdhash{'bad devices'}}) {
+      print "\t      Failed : @{$mdhash{'bad devices'}}\n";
+    }
+    if ($mdhash{'spare'} ne 0) {
+      print "\t      Spares : $mdhash{'spare'}\n";
+    }
+    print "\n";
   }
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.