[blivet:master 11/14] Add a method to extract information about an mdraid array

mulhern amulhern at redhat.com
Wed Jul 16 16:56:42 UTC 2014


mdadm --detail can give useful information about the number of spare devices
and other things that mdadm --examine can not. According to the man page
--examine applies to devices which are components of an array, while --detail
applies to a whole array which is currently active.

Signed-off-by: mulhern <amulhern at redhat.com>
---
 blivet/devicelibs/mdraid.py | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/blivet/devicelibs/mdraid.py b/blivet/devicelibs/mdraid.py
index 2f0ac86..83f87cf 100644
--- a/blivet/devicelibs/mdraid.py
+++ b/blivet/devicelibs/mdraid.py
@@ -21,6 +21,7 @@
 #
 
 import os
+import re
 import uuid
 
 from .. import util
@@ -286,6 +287,38 @@ def mdexamine(device):
 
     return info
 
+def mddetail(device):
+    """Run mdadm --detail in order to read information about an array.
+
+       Note: The --export flag is not used. According to the man pages
+       the export flag just formats the output as key=value pairs for
+       easy import, but in the case of --detail it also omits the majority
+       of the information, including information of real use like the
+       number of spares in the array.
+
+       :param str device: path of the array device
+       :rtype: a dict of strings
+       :returns: a dict containing labels and values extracted from output
+    """
+    lines = mdadm(["--detail", device], capture=True).split("\n")
+    info = {}
+    for (name, colon, value) in (line.strip().partition(":") for line in lines):
+        value = value.strip()
+        name = name.strip().upper()
+        if colon and value and name:
+            info[name] = value
+
+    for k, v in ((k,info[k]) for k in ('UUID',) if k in info):
+        try:
+            # extract the UUID proper
+            the_uuid = re.match(r"(([a-f0-9]){8}:){3}([a-f0-9]){8}", v)
+            info[k] = canonicalizeUUID(the_uuid.group())
+        except (ValueError, AttributeError) as e:
+            log.warning('uuid value %s could not be canonicalized: %s', v, e)
+            info[k] = v # record the value, since mdadm provided something
+
+    return info
+
 def md_node_from_name(name):
     named_path = "/dev/md/" + name
     try:
-- 
1.9.3



More information about the anaconda-patches mailing list