Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brase/6728004 to your computer and use it in GitHub Desktop.
Save brase/6728004 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 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.
# This script has been modified July 2013 by Matt VanCleve <matt.v[at]mymediabox.com> for use in logging MS Software RAID errors to the event log in pursuant to GPLv2 Section 2a
# This script throws event ID 65534 Information when ok and 65535 Error when not ok to the System event log using the Source "MS Software RAID Monitor"
# This script has only been designed and tested for one MS Software RAID, you may need to do other nesting or error checking for multiple software RAIDs
$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"
}
}
}
#Script has been modified below to write to the event log
#This creates the event log source "MS Software RAID Monitor" in the System event log to help better identify the event if it does not currently exist
if(!([System.Diagnostics.EventLog]::SourceExists("MS Software RAID Monitor")))
{
new-eventlog -LogName System -Source "MS Software RAID Monitor"
}
# Next we check the Software raid status code to see if it is not healthy and then write to the event log
if($statusCode -ne 0)
{
echo "ERROR: MS Software RAID on disk ${disk}:\ $statusText"
write-eventlog -LogName System -Source "MS Software RAID Monitor" -EntryType Error -EventID 65535 -Message "MS Software RAID on disk ${disk}:\ $statusText"
}
else
{
echo "OK: MS Software RAID on disk ${disk}:\ $statusText"
write-eventlog -LogName System -Source "MS Software RAID Monitor" -EntryType Information -EventID 65534 -Message "MS Software RAID on disk ${disk}:\ $statusText"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment