Table of Contents

Dell System Check

Author Craig Boyce
Compatibility Xymon 4.2
Requirements Windows, BBWin, Dell Open Manage
Download None
Last Update 2007-08-06

Description

The script reports the status of the hardware on Dell Servers running Windows and Dell OpenManage 5.0 or greater and alerts upon any failure reported. The information is gathered using the commandline interface omreport. The script has successfully reported on power supply and disk failures but I have not had any other hardware failures.

Installation

Client side

  1. Copy the script to the bbwin\ext directory or any sub directory you would prefer.
  2. Update the bbwin\etc\bbwin.cfg externals section to include the script as per below making sure the path is correct.
    <externals>
    	<setting name="timer" value="3m" />
    	<setting name="logstimer" value="60s" />
    	<load value="cscript //B ..\ext\SystemCheck.vbs" timer="5m" /> 
    </externals>

The script allows the changing of the test column name and uptime duration before alerting by changing the following lines in the script.

strTestName = “syscheck” Change this to what you want the test column to be.
strUpTime = “30” Change this to the length of time required before alerting a reboot is required.

Server side

Source

SystemCheck.vbs

Show Code ⇲

Hide Code ⇱

'==========================================================================
' NAME: Server System check.vbs
' COMMENT: Report Information from Dell OpenManage
' AUTHOR: Craig Boyce, Rodney District Council
' EMAIL: craig.boyce@rodney.govt.nz
' HISTORY
' VERSION : 1.00 13/08/2006 Initial Development
' VERSION : 2.00 20/7/2007 Production Release
' VERSION : 2.10 1/8/2007 Updated by Sigurður Guðbrandsson (sigurdur@raforninn.is) to report detailed information for Physical Disk, Memory, NIC and Temp
'	Now Requires OpenManage 5.2 to display the Physical disk information
' VERSION : 2.20 3/8/2007 Resolved issue with a non green status changing all the following statuses to the non green status
' VERSION : 2.30 7/8/2007 Added the ability to turn off individual status checks if not wanted.
 
' Requires Dell OpenManage 5.0 or greater to be installed on the Dell Servers
'==========================================================================
 
On Error Resume Next
 
Dim objShell,WSHNetwork
Dim typelib,cslid,ServerName,lastcntrlnum,cntrlnum,lastindexnum,indexnum,boolValid
Dim logmessage,logfile
Dim strLayout,strSize,strLine,intStart,strFail,strCmd
Dim shChassis,shStorageVirtual,shStoragePhysical,shMemory,shNetwork,shTemp
 
' Set Variables and get the Server Name
 
Set objShell = WScript.CreateObject("WScript.Shell")
Set WSHNetwork = WScript.CreateObject("WScript.Network")
 
ServerName = objShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
 
' User definable section
 
strTestName = "syscheck" 	' Change this to what you want the test column to be.
shChassis = 1							' Change this to 0 to disable the Chassis status check
shStorageVirtual = 1			' Change this to 0 to disable the Storage Virtual status check
shStoragePhysical = 1			' Change this to 0 to disable the Storage Physical status check
shMemory = 1							' Change this to 0 to disable the Memory status check
shNetwork = 1							' Change this to 0 to disable the Network status check
shTemp = 1								' Change this to 0 to disable the Temperature status check
 
strAlarmState = "green"
strOutput   = ""
cntrlnum = 0
indexnum = 0
Set oShell = WScript.CreateObject("WScript.Shell")
' Check to see If used with BBWin or Big Brother client and set extPath.
extPath = oShell.RegRead("HKLM\SOFTWARE\BBWin\tmpPath")
If extPath = "" Then
	extPath = oShell.RegRead("HKLM\SOFTWARE\Quest Software\BigBrother\bbnt\ExternalPath\")
End If
 
' ========================================
' Main Code Starts Here
 
Set WinMgt = GetObject("winmgmts:")
Set CompSys = WinMgt.ExecQuery("Select * from Win32_ComputerSystem")
For Each Item In CompSys
strmake = rtrim(item.manufacturer)
strmodel = rtrim(item.model)
strram = Clng(Item.TotalPhysicalMemory /1048576) + 1
Next
 
Set CompSys = WinMgt.ExecQuery("Select * from Win32_Processor",,48)
For Each Item In CompSys
strproc = Item.Name
Next
 
Set CompSys = WinMgt.ExecQuery("Select * from Win32_BIOS")
For Each Item In CompSys
strSerial = rtrim(item.SerialNumber)
Next
 
strOutput = strOutput & "System Information for Server " & ServerName & vbcrlf & vbcrlf
strOutput = strOutput & strmake & vbtab & strmodel & vbtab & "Service Tag #" & vbtab & strSerial & vbcrlf & vbcrlf
strOutput = strOutput & "Processor:" & vbtab & strproc & vbcrlf
strOutput = strOutput & "Memory:" & vbtab & vbtab & strram & " Mb" & vbcrlf & vbcrlf
 
 
 
If Left(strmake, 4) = "Dell" Then
	omapath = oShell.RegRead("HKLM\SOFTWARE\Dell Computer Corporation\OpenManage\Applications\SystemsManagement\InstallPath")
	omaver = oShell.RegRead("HKLM\SOFTWARE\Dell Computer Corporation\OpenManage\Applications\SystemsManagement\Version")
	omreportpath = omapath & "oma\bin\omreport"
 
	strOutput = strOutput & "<a href=https://" & ServerName & ":1311 target=_new>Dell OpenManage Web Page</a>" & vbcrlf & vbcrlf
 
	If shChassis = 1 Then		
		strOutput = strOutput & "Chassis Status Information" & vbcrlf & vbcrlf
 
		strcommand = Chr(34) &omreportpath & Chr(34) & " chassis" 
		Set objWshScriptExec = objShell.Exec(strcommand)
		Set objStdOut = objWshScriptExec.StdOut
 
		While Not objStdOut.AtEndOfStream
   		strLine = objStdOut.ReadLine
   		If InStr(strLine,"Ok") Then
   		 		strOutput = strOutput & "&green" & vbtab & strLine & vbcrlf
   		End If
   		If InStr(strLine,"Non-Critical") Then
   				strAlarmState = "yellow"
       		strOutput = strOutput & "&yellow" & vbtab & strLine & vbcrlf
   		End If
   		If InStr(strLine,"Critical") Then
   				strAlarmState = "red"
       		strOutput = strOutput & "&red" & vbtab & strLine & vbcrlf
   		End If
		Wend
	End If
 
	If shStorageVirtual = 1 Then
		strOutput = strOutput & vbcrlf & "Storage Status Information for virtual disks" & vbcrlf & vbcrlf
 
		' Determine the number of storage controllers in the server and loop through them displaying the virtual disk status
 
		lastcntrlnum = DELLStorageCntrlNum()
		While CInt(cntrlnum) <= CInt(lastcntrlnum)
			strcommand = Chr(34) &omreportpath & Chr(34) & " storage vdisk controller=" & cntrlnum 
			Set objWshScriptExec = objShell.Exec(strcommand)
			Set objStdOut = objWshScriptExec.StdOut
			DELLStorageStatus cntrlnum
			cntrlnum = cntrlnum + 1
		Wend
	End If
 
	If shStoragePhysical = 1 Then
		strOutput = strOutput & vbcrlf & "Storage Status Information for physical disks" & vbcrlf & vbcrlf
 
		' Determine the number of storage controllers in the server and loop through them displaying the physical disk status
 		' Time for a reset also on the ctrlnum used earlier.
		cntrlnum = 0
		lastcntrlnum = DELLStorageCntrlNum()
		While CInt(cntrlnum) <= CInt(lastcntrlnum)
			strcommand = Chr(34) &omreportpath & Chr(34) & " storage pdisk controller=" & cntrlnum 
			Set objWshScriptExec = objShell.Exec(strcommand)
			Set objStdOut = objWshScriptExec.StdOut
			DELLStorageStatus cntrlnum
			cntrlnum = cntrlnum + 1
		Wend
	End If
 
	If shMemory = 1 Then 
		strOutput = strOutput & vbcrlf & "Memory Status Information for memory modules" & vbcrlf & vbcrlf
 
		' Determine the number of memory indexes in the server and loop through them displaying the memory index status
		strCmd = " chassis memory"
		lastindexnum = DELLIndexNum
		while CInt(indexnum) <= CInt(lastindexnum)
			strcommand = Chr(34) &omreportpath & Chr(34) & " chassis memory index=" & indexnum 
			Set objWshScriptExec = objShell.Exec(strcommand)
			Set objStdOut = objWshScriptExec.StdOut
			DELLMemoryStatus indexnum
			indexnum = indexnum + 1
		Wend
	End If
 
	indexnum = 0	' Reset the indexnum variable
 
	If shNetwork = 1 Then
		strOutput = strOutput & vbcrlf & "Network Interface Status Information for NICS" & vbcrlf & vbcrlf
 
		' Determine the number of nic indexes in the server and loop through them displaying the nic index status
		strCmd = " chassis nics"	' We need to know what index we want
		lastindexnum = DELLIndexNum
		while CInt(indexnum) <= CInt(lastindexnum)
			strcommand = Chr(34) &omreportpath & Chr(34) & " chassis nics index=" & indexnum 
			Set objWshScriptExec = objShell.Exec(strcommand)
			Set objStdOut = objWshScriptExec.StdOut
			DELLNetworkStatus indexnum
			indexnum = indexnum + 1
		Wend
	End If
 
	indexnum = 0	' Reset the indexnum variable
 
	If shTemp = 1 Then
		strOutput = strOutput & vbcrlf & "Temperature Status Information for Chassis" & vbcrlf & vbcrlf
 
		' Determine the number of nic indexes in the server and loop through them displaying the nic index status
		strCmd = " chassis temps"
		lastindexnum = DELLIndexNum
		while CInt(indexnum) <= CInt(lastindexnum)
			strcommand = Chr(34) &omreportpath & Chr(34) & " chassis temps index=" & indexnum 
			Set objWshScriptExec = objShell.Exec(strcommand)
			Set objStdOut = objWshScriptExec.StdOut
			DELLTemperatureStatus indexnum
			indexnum = indexnum + 1
		Wend
	End If
 
 
End If
 
 
If strmake = "HP" Then 
' For future development, If only HP had a command line interface for getting the server status
End If
 
 
' Write the file for BB
WriteFile extPath, strTestName, strAlarmState, strOutput
 
'===========================================================
' FUNCTIONS and SUBS start here
 
' This SUB is used for outputting the file to the external's directory in bb
SUB WriteFile(strExtPath, strTestName, strAlarmState, strOutput)
    Set fso = CreateObject("Scripting.FileSystemObject")	
    strOutput = strAlarmState & " " & Date & " " & Time & vbcrlf & vbcrlf & strOutput & vbcrlf
    Set f = fso.OpenTextFile(strExtPath & "\" & strTestName , 8 , TRUE)
    f.Write strOutput
    f.Close
    Set fso = Nothing
END Sub
 
' This Function is used for determining the number of storage controllers in the server
' NEW: vdisk controllers should be the same amount as pdisk controllers (virtual == physical)
Function DELLStorageCntrlNum
	strcommand = Chr(34) &omreportpath & Chr(34) & " storage vdisk controller=10" ' Check for 10 Controllers, The output lists the valid controllers in the server
	Set objWshScriptExec = objShell.Exec(strcommand)
	Set objStdOut = objWshScriptExec.StdOut
	While Not objStdOut.AtEndOfStream
   	strLine = objStdOut.ReadLine
   	If InStr(strLine,"Invalid controller value. Read, controller=10") Then
   		While Not objStdOut.AtEndOfStream
   		strLine = objStdOut.ReadLine
   			If InStr(strLine,"Valid values") Then
   				DELLStorageCntrlNum = Right(strLine, 1) ' Get the highest numbered controller
   			End If     	
   	 	Wend
   	End If
 	Wend
End Function
 
' This function is used for determining the number of indexes, this is almost identical to the storage function above
' TODO: I assume that there is only one memory array .. however I do not have a server with more arrays so this is defaulted to Array 1.
Function DELLIndexNum
	strcommand = Chr(34) &omreportpath & Chr(34) & strCmd & " index=50" ' Check for 50 Indexes, The output lists the valid indexes in the server
	Set objWshScriptExec = objShell.Exec(strcommand)
	Set objStdOut = objWshScriptExec.StdOut
	While Not objStdOut.AtEndOfStream
   	strLine = objStdOut.ReadLine
   	If InStr(strLine,"Error! Index too large.") Then
		DELLIndexNum = Right(strLine, 1) ' Get the highest numbered index
   	End If
 	Wend
End Function
 
' This SUB is used for determining the status and information of the Dell Storage components
Sub DELLStorageStatus(strcntrl)
	While Not objStdOut.AtEndOfStream
   	strLine = objStdOut.ReadLine
   	If InStr(strLine,"No Array/Hard Disks found") Then ' Check to see if there is a virtual disk on the controller
   		Exit Sub
   	End If
   		While Not objStdOut.AtEndOfStream
   		strLine = objStdOut.ReadLine
   			If InStr(strLine,"Status") Then ' Check the status line of the output and get the status
   				intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				newLine = Mid(strLine, intStart, 250)
   				If newLine = "Ok" Then
   					strOutput = strOutput & "&green" & vbtab & newLine
   				End If
   				If newLine = "Non-Critical" Then
   					strAlarmState = "yellow"
   					strOutput = strOutput & "&yellow" & vbtab & newLine
   				End If
   				If newLine = "Critical" Then
   					strAlarmState = "red"
   					strOutput = strOutput & "&red" & vbtab & newLine
   				End If			
       	End If
	' ADDED: difference between physical and virtual includes added if statements.
	' ADDED: predicted failure notice.
       	If Left(strLine, 4) = "Name" Then
       		intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				strName = Mid(strLine, intStart, 250)
   				strOutput = strOutput & vbtab & ": " & strName & " on Storage Controller " & strcntrl & vbcrlf
   	End If
   	If Left(strLine, 6) = "Layout" Then
       		intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				strLayout = Mid(strLine, intStart, 250)
   	End If
   	If Left(strLine, 4) = "Size" Then
       		intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				strSize = Mid(strLine, intStart, 250)
   				strOutput = strOutput & vbtab & vbtab & "  : " & strLayout & vbtab & strSize & vbcrlf & vbcrlf
   	End If
	If Left(strLine, 7) = "Failure" Then
		intStart = InStr(strLine, ":")
				intstart = intStart + 2
				strFail = Mid(strLine, intStart, 250)
   	End If
   	If Left(strLine, 4) = "Type" Then
       		intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				strLayout = Mid(strLine, intStart, 250)
   	End If
   	If Left(strLine, 8) = "Capacity" Then
       		intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				strSize = Mid(strLine, intStart, 250)
   				strOutput = strOutput & vbtab & vbtab & "  : " & strLayout & vbtab & strSize & vbcrlf
				strOutput = strOutput & vbtab & vbtab & "  : Failure Predicted = " & strFail & vbcrlf & vbcrlf
	End If
     	Wend
	Wend
End Sub
 
' This SUB is used for determining the status and information of the Dell Memory components
' The reason I read the next line after finding the line I want is that when I run omreport chassis memory index=NUM I get an attribute line and a value line.
Sub DELLMemoryStatus(strmemindex)
	While Not objStdOut.AtEndOfStream
   	strLine = objStdOut.ReadLine
   	If InStr(strLine,"Error! Index too large. Maximum memory index is:") Then ' Check to see if there is a memory module on this index.
   		Exit Sub
   	End If
   	While Not objStdOut.AtEndOfStream
   		strLine = objStdOut.ReadLine
   	If InStr(strLine,"Status") Then ' Check the status line of the output and get the status
				strLine = objStdOut.ReadLine
   				intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				newLine = Mid(strLine, intStart, 250)
   				If newLine = "Ok" Then
   					strOutput = strOutput & "&green" & vbtab & newLine
   				End If
   				If newLine = "Non-Critical" Then
   					strAlarmState = "yellow"
   					strOutput = strOutput & "&yellow" & vbtab & newLine
   				End If
   				If newLine = "Critical" Then
   					strAlarmState = "red"
   					strOutput = strOutput & "&red" & vbtab & newLine
   				End If			
   	End If
	' Let us display all the useful information now that we have the status.
       	If Right(strLine, 4) = "Name" Then
		strLine = objStdOut.ReadLine
       		intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				strName = Mid(strLine, intStart, 250)
   				strOutput = strOutput & vbtab & ": " & strName & " on Memory Index " & strmemindex & vbcrlf
   	End If
   	If Right(strLine, 4) = "Size" Then
		strLine = objStdOut.ReadLine
       		intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				strSize = Mid(strLine, intStart, 250)
   	End If
   	If Right(strLine, 4) = "Type" Then
		strLine = objStdOut.ReadLine
       		intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				strLayout = Mid(strLine, intStart, 250)
   				strOutput = strOutput & vbtab & vbtab & "  : " & strLayout & vbtab & strSize & vbcrlf
   	End If
	If Right(strLine, 8) = "Failures" Then
		strLine = objStdOut.ReadLine
		intStart = InStr(strLine, ":")
				intstart = intStart + 2
				strFail = Mid(strLine, intStart, 250)
   				strOutput = strOutput & vbtab & vbtab & "  : Failures = " & strFail & vbcrlf & vbcrlf
   	End If
     	Wend
	Wend
End Sub
 
' This SUB is used for determining the status and information of the Dell Network Interfaces
Sub DELLNetworkStatus(strnicindex)
	While Not objStdOut.AtEndOfStream
   	strLine = objStdOut.ReadLine
   	If InStr(strLine,"Error! Index too large.") Then ' Check to see if there is a memory module on this index.
   		Exit Sub
   	End If
	boolValid = 0
   	While Not objStdOut.AtEndOfStream
   		strLine = objStdOut.ReadLine
' We cant get status information from NIC's
'  	If InStr(strLine,"Status") Then ' Check the status line of the output and get the status
'				strLine = objStdOut.ReadLine
'  				intStart = InStr(strLine, ":")
'   				intStart = intStart + 2
'   				newLine = Mid(strLine, intStart, 250)
'   				If newLine = "OK" Then
'   					strOutput = strOutput & "&green" & vbtab & newLine
'   				End If
'   				If newLine = "Non-Critical" Then
'   					strAlarmState = "yellow"
'							strOutput = strOutput & "&yellow" & vbtab & newLine
'   				End If
'   				If newLine = "Critical" Then
'   					strAlarmState = "red"
'							strOutput = strOutput & "&red" & vbtab & newLine
'   				End If			
'       		
'       	End If
	' Let us display all the useful information we need
       	If Left(strLine, 9) = "Interface" Then
       		intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				strName = Mid(strLine, intStart, 250)
   				strOutput = strOutput & vbtab & ": " & strName & " on NIC Index " & strnicindex & vbcrlf
   	End If
   	If Left(strLine, 2) = "IP" Then
	       		intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				strSize = Mid(strLine, intStart, 250)
   	End If
   	If Left(strLine, 10) = "Connection" Then
       		intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				strLayout = Mid(strLine, intStart, 250)
				If Right(strLayout, 9) = "Connected" Then
					boolValid = 1
				End If
   				strOutput = strOutput & vbtab & vbtab & "  : Connection Status: " & strLayout & vbcrlf
				If boolvalid = 1 Then
	   				strOutput = strOutput & vbtab & vbtab & "  : IP Address: " & strSize & vbcrlf
				End If
   	End If
     	Wend
	Wend
	strOutput = strOutput & vbcrlf
End Sub
 
' This SUB is used for determining the status and information of the Dell Chassis Temperatures
Sub DELLTemperatureStatus(strtempindex)
	While Not objStdOut.AtEndOfStream
   	strLine = objStdOut.ReadLine
   	If InStr(strLine,"Error! Index too large.") Then ' Check to see if there is a temperature sensor on this index.
   		Exit Sub
   	End If
   	While Not objStdOut.AtEndOfStream
   		strLine = objStdOut.ReadLine
   	If InStr(strLine,"Status") Then ' Check the status line of the output and get the status
   				intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				newLine = Mid(strLine, intStart, 250)
   				If newLine = "Ok" Then
   					strOutput = strOutput & "&green" & vbtab & newLine
   				End If
   				If newLine = "Non-Critical" Then
   					strAlarmState = "yellow"
   					strOutput = strOutput & "&yellow" & vbtab & newLine
   				End If
   				If newLine = "Critical" Then
   					strAlarmState = "red"
   					strOutput = strOutput & "&red" & vbtab & newLine
   				End If			
  	End If
	' Let us display all the useful information now that we have the status.
       	If Left(strLine, 5) = "Probe" Then
       		intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				strName = Mid(strLine, intStart, 250)
   				strOutput = strOutput & vbtab & ": " & strName & " on Chassis Index " & strtempindex & vbcrlf
   	End If
   	If Left(strLine, 7) = "Reading" Then
       		intStart = InStr(strLine, ":")
   				intStart = intStart + 2
   				strLayout = Mid(strLine, intStart, 250)
   				strOutput = strOutput & vbtab & vbtab & "  : Temperature is " & strLayout & vbcrlf
   	End If
     	Wend
	Wend
End Sub


Download source: systemcheck.zip

Screenshot

Known Bugs and Issues

To Do

Please let me know of any issues with the script and I will attempt to resolve them.

Credits

The script is in part based upon a batch script called openmanage.cmd written by Dave Sobel (dave@evolvetech.com)

Changelog