Detect md arrays via /proc/mdstat for RAID status
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import subprocess
|
import subprocess
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
def _cmd(cmd: str) -> str:
|
def _cmd(cmd: str) -> str:
|
||||||
@@ -83,16 +84,25 @@ def list_disks() -> list[str]:
|
|||||||
|
|
||||||
|
|
||||||
def list_md_arrays() -> list[str]:
|
def list_md_arrays() -> list[str]:
|
||||||
out = _cmd("lsblk -dn -o NAME,TYPE")
|
# Prefer /proc/mdstat: it reliably lists active md arrays
|
||||||
arrays = []
|
# even when lsblk tree/filters differ across distros.
|
||||||
|
out = _cmd("cat /proc/mdstat")
|
||||||
|
arrays: set[str] = set()
|
||||||
for line in out.splitlines():
|
for line in out.splitlines():
|
||||||
parts = line.split()
|
m = re.match(r"^\s*(md\d+)\s*:", line)
|
||||||
if len(parts) != 2:
|
if m:
|
||||||
continue
|
arrays.add(f"/dev/{m.group(1)}")
|
||||||
name, typ = parts
|
|
||||||
if typ.startswith("raid") and name.startswith("md"):
|
if arrays:
|
||||||
arrays.append(f"/dev/{name}")
|
return sorted(arrays)
|
||||||
return arrays
|
|
||||||
|
# Fallback for environments where mdstat parsing is unavailable.
|
||||||
|
out = _cmd("ls -1 /dev/md* 2>/dev/null")
|
||||||
|
for line in out.splitlines():
|
||||||
|
dev = line.strip()
|
||||||
|
if dev and re.match(r"^/dev/md\d+$", dev):
|
||||||
|
arrays.add(dev)
|
||||||
|
return sorted(arrays)
|
||||||
|
|
||||||
|
|
||||||
def md_array_status(dev: str) -> str:
|
def md_array_status(dev: str) -> str:
|
||||||
|
|||||||
Reference in New Issue
Block a user