From 1b1b9dc5799e590f42a114c4948849c3c5442977 Mon Sep 17 00:00:00 2001
From: godog <godog@autistici.org>
Date: Fri, 13 Dec 2024 20:06:52 +0100
Subject: [PATCH] base: rework md array handling

use lsblk for enumeration of raid arrays. Also simplify the code and
remove unused label "md_name".
---
 .../files/node-exporter-scripts/md.sh         | 21 +++++++------------
 1 file changed, 8 insertions(+), 13 deletions(-)

diff --git a/roles/float-base/files/node-exporter-scripts/md.sh b/roles/float-base/files/node-exporter-scripts/md.sh
index 2c17eee0..41e40499 100644
--- a/roles/float-base/files/node-exporter-scripts/md.sh
+++ b/roles/float-base/files/node-exporter-scripts/md.sh
@@ -3,18 +3,13 @@
 #!/usr/bin/env bash
 set -eu
 
-for MD_DEVICE in /dev/md/*; do
+RAID_ARRAYS=$(lsblk --noheadings --output NAME,TYPE --list | awk '$2 ~ /^raid/ { print $1 }')
+
+for MD_DEVICE in ${RAID_ARRAYS}; do
   # Subshell to avoid eval'd variables from leaking between iterations
   (
-    # Resolve symlink to discover device, e.g. /dev/md127
-    MD_DEVICE_NUM=$(readlink -f "${MD_DEVICE}")
-
-    # Remove /dev/ prefix
-    MD_DEVICE_NUM=${MD_DEVICE_NUM#/dev/}
-    MD_DEVICE=${MD_DEVICE#/dev/md/}
-
     # Query sysfs for info about md device
-    SYSFS_BASE="/sys/devices/virtual/block/${MD_DEVICE_NUM}/md"
+    SYSFS_BASE="/sys/devices/virtual/block/${MD_DEVICE}/md"
     MD_LAYOUT=$(cat "${SYSFS_BASE}/layout")
     MD_LEVEL=$(cat "${SYSFS_BASE}/level")
     MD_METADATA_VERSION=$(cat "${SYSFS_BASE}/metadata_version")
@@ -25,18 +20,18 @@ for MD_DEVICE in /dev/md/*; do
 
     # Output RAID array informational metric.
     # NOTE: Metadata version is a label rather than a separate metric because the version can be a string
-    echo "node_md_info{md_device=\"${MD_DEVICE_NUM}\", md_name=\"${MD_DEVICE}\", raid_level=\"${MD_LEVEL}\", md_metadata_version=\"${MD_METADATA_VERSION}\"} 1"
+    echo "node_md_info{md_device=\"${MD_DEVICE}\", raid_level=\"${MD_LEVEL}\", md_metadata_version=\"${MD_METADATA_VERSION}\"} 1"
 
     # Fetch sync state and metrics.
     SYNC_STATE=$(cat "${SYSFS_BASE}/sync_action")
-    echo "node_md_sync_state{md_device=\"${MD_DEVICE_NUM}\",sync_state=\"${SYNC_STATE}\"} 1"
+    echo "node_md_sync_state{md_device=\"${MD_DEVICE}\",sync_state=\"${SYNC_STATE}\"} 1"
     SYNC_SPEED=$(cat "${SYSFS_BASE}/sync_speed")
     if [ "$SYNC_SPEED" = "none" ]; then
         SYNC_SPEED=0
     fi
-    echo "node_md_sync_speed{md_device=\"${MD_DEVICE_NUM}\"} ${SYNC_SPEED}"
+    echo "node_md_sync_speed{md_device=\"${MD_DEVICE}\"} ${SYNC_SPEED}"
 
     DEGRADED=$(cat "${SYSFS_BASE}/degraded")
-    echo "node_md_degraded{md_device=\"${MD_DEVICE_NUM}\"} ${DEGRADED}"
+    echo "node_md_degraded{md_device=\"${MD_DEVICE}\"} ${DEGRADED}"
   )
 done
-- 
GitLab