Last active
July 10, 2024 09:37
-
-
Save schakko/4713248 to your computer and use it in GitHub Desktop.
A simple PowerShell script for retrieving the RAID status of volumes with help of diskpart.
The nicer solution would be using WMI (which does not contain the RAID status in the Status field of Win32_DiskDrive, Win32_LogicalDisk or Win32_Volume for unknown reason) or using the new PowerShell API introduced with Windows 8 (wrong target system as o…
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# A simple PowerShell script for retrieving the RAID status of volumes with help of diskpart. | |
# The nicer solution would be using WMI (which does not contain the RAID status in the Status field of Win32_DiskDrive, Win32_LogicalDisk or Win32_Volume for unknown reason) | |
# or using the new PowerShell API introduced with Windows 8 (wrong target system as our customer uses a Windows 7 architecture). | |
# | |
# diskpart requires administrative privileges so this script must be executed under an administrative account if it is executed standalone. | |
# check_mk has this privileges and therefore this script must only be copied to your check_mk/plugins directory and you are done. | |
# | |
# Christopher Klein <ckl[at]neos-it[dot]de> | |
# This script is distributed under the GPL v2 license. | |
$dp = "list volume" | diskpart | ? { $_ -match "^ [^-]" } | |
echo `<`<`<local`>`>`> | |
foreach ($row in $dp) { | |
# skip first line | |
if (!$row.Contains("Volume ###")) { | |
# best match RegExp from http://www.eventlogblog.com/blog/2012/02/how-to-make-the-windows-softwa.html | |
if ($row -match "\s\s(Volume\s\d)\s+([A-Z])\s+(.*)\s\s(NTFS|FAT)\s+(Mirror|RAID-5|Stripe|Spiegel|Spiegelung|Übergreifend|Spanned)\s+(\d+)\s+(..)\s\s([A-Za-z]*\s?[A-Za-z]*)(\s\s)*.*") { | |
$disk = $matches[2] | |
# 0 = OK, 1 = WARNING, 2 = CRITICAL | |
$statusCode = 1 | |
$status = "WARNING" | |
$text = "Could not parse line: $row" | |
$line = $row | |
if ($line -match "Fehlerfre |OK|Healthy") { | |
$statusText = "is healthy" | |
$statusCode = 0 | |
$status = "OK" | |
} | |
elseif ($line -match "Rebuild") { | |
$statusText = "is rebuilding" | |
$statusCode = 1 | |
} | |
elseif ($line -match "Failed|At Risk|Fehlerhaf") { | |
$statusText = "failed" | |
$statusCode = 2 | |
$status = "CRITICAL" | |
} | |
echo "$statusCode microsoft_software_raid - $status - Software RAID on disk ${disk}:\ $statusText" | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hi. There's an issue processing volumes that are "Healthy" but "At Risk".
Here's some real-world data:
(Volumes 0-2 are mirrored across Disk 0 and 1, and Disk 0 has errors.)
The volumes are At Risk, but still apparently Healthy. But because the script checks for "Healthy" first, it doesn't spot that they're "At Risk".
I think the checks should be reordered from most to least severe:
I've also added some other possible status values based on https://www.prajwaldesai.com/hard-disk-volume-status/ (possibly taken from https://books.google.co.uk/books?id=RPbQswG_i2EC&pg=PA196)