Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Lohkee/6124867 to your computer and use it in GitHub Desktop.
Save Lohkee/6124867 to your computer and use it in GitHub Desktop.
When run, this script checks the current status of the MS Software RAID and 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"
# 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