All pastes #2057180 Raw Edit

Griffin

public text v1 · immutable
#2057180 ·published 2011-05-12 04:30 UTC
rendered paste body
'-------------------------------------------------------------------------
'					Script Dims
'-------------------------------------------------------------------------
Dim logFile					'Log Name
Dim objFSO					'File Object
Dim logLocation				'Log Directory
Dim SearchStrings(2)
Dim verboselog, ArrayName, ConfigLocation, CommandArray(), EnvironmentVariables(), amsSERIAL, LocationofHDVM, cmdHDVMP, usrHDVM, passFile
Dim NumofCores, NameofSNM2, TotalDisks, DiskRate(), CPURate(), CacheWait(), HighCpuRate, HighDiskRate, HighCacheWait, HighDiskHit
Dim LocationOfAuOutput, HostGroupDef, HostGroupMap, PartList, UnitInfo, ArrayList, NumPFMtoCheck, LocationOfPFM, HighCpuHit, HighCacheHit
Dim SMTPServerinfo, MailFromName, MailToName, NotifyEvery, LocationofSNM2, Simulate, RequiredMC, DiskHitPercent, CPUHitPercent, CacheHitPercent

'-------------------------------------------------------------------------
'					Script Variables
'-------------------------------------------------------------------------
today = Date
CurDate = Year(today) & "-" & Month(today) & "-" & Day(today)

verboselog = False 			'Filter log output

SearchStrings(0) = "Partition Write Pending Rate"
SearchStrings(1) = "CTL Core Usage"
SearchStrings(2) = "HDU Operating Rate"

logLocation = "C:\Script_Logs"
ConfigLocation = "C:\Temp\scripts\AMStest\"

amsSERIAL = "" ' This needs to be looked up in the auunitinfo output.
LocationofHDVM = "C:\HCMDCLI" 




Set objFSO = Wscript.CreateObject("Scripting.FileSystemObject") 'Create object for creating fs changes
Set wshShell = Wscript.CreateObject("WScript.shell")			'Create object to run executables in

'-------------------------------------------------------------------------
'					Storage Array Variables
'-------------------------------------------------------------------------
Simulate = True

HighCacheWait = 15 		' Cache Write Pending
HighCacheHit = 0   		' Number of times max was hit.
TotalCacheEntries = 0 	' Number of Cache Entries
CacheHitPercentMax = 10	' Of all of the PFM files checked, this is the max percentage that is allowed to continue

HighCpuRate = 50 		' CPU Usage %
HighCpuHit = 0			' Number of times max was hit.
TotalCpuEntries = 0		' Number of Cores / CPU Entries
CPUHitPercentMax = 30		' Of all of the PFM files checked, this is the max percentage that is allowed to continue

HighDiskRate = 70 		' Disk usage %
HighDiskHit = 0			' Number of times max was hit.
TotalDiskEntries = 0	' Number of Disk Entries
DiskHitPercentMax = 20		' Of all of the PFM files checked, this is the max percentage that is allowed to continue

RequiredMC = "08A0/J-Y"
ArrayName = "UNIT1"

LocationOfAuOutput = 	"C:\Documents and Settings\grhernandez\Desktop\Dale\Beta2\"
LocationOfPFM = 		"C:\Documents and Settings\grhernandez\Desktop\Dale\Beta2\" & ArrayName & "\"
LocationofSNM2 = 		"C:\HCMDCLI\SNM2CLI\"
NumPFMtoCheck = 		3

HostGroupDef = "auhgdef.txt"
HostGroupMap = "auhgmap.txt"
PartList = "auparts.txt"
UnitInfo = "auunitinfo.txt"
ArrayList = "auunitref.txt"

cmdPROTO = LocationofSNM2 & "auunitinfo.exe"
cmdMCVER = LocationofSNM2 & "auunitinfo.exe" 
cmdPARTS = LocationofSNM2 & "auparts.exe" 
cmdLUADD = LocationofSNM2 & "auluadd.exe"
cmdHGDEF = LocationofSNM2 & "auhgdef.exe"
cmdHGWWN = LocationofSNM2 & "auhgwwn.exe"
cmdHGMAP = LocationofSNM2 & "auhgmap.exe"

'-------------------------------------------------------------------------
'					File Name and locations
'-------------------------------------------------------------------------
logFile = logLocation & "\Lun_Creation_Script-" & CurDate & ".log"
'-------------------------------------------------------------------------
'					Email Variables
'-------------------------------------------------------------------------

SMTPServerinfo = "SMTP.DOMAIN.ORG"
MailFromName = "Notifcation@no-reply.DOMAIN.org"
MailToName = "USER1@DOMAIN.ORG;USER2@DOMAIN.ORG;USER3@DOMAIN.ORG"

'-------------------------------------------------------------------------
' 						Functions
'-------------------------------------------------------------------------
Function SendEmail(TheTextBody, TheSubject)
	Set objEmail = CreateObject("CDO.Message")
	objEmail.From = MailFromName			'From Address
	objEmail.To = MailToName				'To Address
	objEmail.Subject = TheSubject			'Subject Line
	objEmail.Textbody = TheTextBody			'Body Text
	objEmail.Configuration.Fields.Item _
    	("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2	'Send using Port
	objEmail.Configuration.Fields.Item _
    	("http://schemas.microsoft.com/cdo/configuration/smtpserver") = SMTPServerinfo	'SMTP Address
	objEmail.Configuration.Fields.Item _
    	("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25	'Port to connect on
	objEmail.Configuration.Fields.Update	'Commit Changes.
	objEmail.Send	'Send email
End Function 

Function CheckLogFolder()	' If folder doesnt exist, create it
	if not objFSO.FolderExists(logLocation) then
		set objFolder = objFSO.CreateFolder(logLocation)
	end If
	
End Function 

	'"CTL Partition Write Pending Rate(%)"
	'CTL Core Usage
	'HDU Operating Rate	
Function Parse_PFM_File(FileName) 
	Set objReadPFM = objFSO.OpenTextFile(FileName, 1, false)
	
	Buffer = objReadPFM.ReadLine	'Cache line in temp variable
	
	Do until objReadPFM.AtEndOfStream = True
		
		'If regex.Test(Buffer) = True Then	'We found one of the values to start processing.
		SearchStrings(0) = "Partition Write Pending Rate"
		SearchStrings(1) = "CTL Core Usage"
		SearchStrings(2) = "HDU Operating Rate"
		
		If InStr(Buffer, SearchStrings(0)) <> 0  Then
			Buffer = Parse_Write_Pending(objReadPFM)
		ElseIf InStr(Buffer, SearchStrings(1)) <> 0 Then
			Buffer = Parse_Core_Percentage(objReadPFM)
		ElseIf InStr(Buffer, SearchStrings(2)) <> 0 Then
			Buffer = Parse_Disk_Utilization(objReadPFM)
		Else 
			Buffer = objReadPFM.ReadLine	'Cache line in temp variable
		End If
		
	Loop
	Set objReadPFM = Nothing
End Function


'---------------------------------------------------------
'					Parsing Functions
'---------------------------------------------------------
Function Parse_Write_Pending(objReader)
	TotalCacheEntries = 0 	' Number of Cache Entries
	EndOfFile = False
	Line = objReader.ReadLine
	curBuffer = Clean_Extra_Delimiters(Split(Line, " "))		'Tokenize line
	
	Do While IsNumeric(curBuffer(0)) AND EndOfFile = False 'Keep going until we run out of controllers

		If Int(curBuffer(2)) >= HighCacheWait Then
			HighCacheHit= HighCacheHit + 1
		End If
		TotalCacheEntries = TotalCacheEntries + 1
		If objReader.AtEndOfStream = False then
			Line = objReader.ReadLine
			curBuffer = Clean_Extra_Delimiters(Split(Line, " "))		'Tokenize line
		Else
			EndOfFile = True
		End if
	Loop
	Parse_Write_Pending = Line
End Function

Function Parse_Core_Percentage(objReader) 
	TotalCpuEntries = 0		' Number of Cores / CPU Entries
	EndOfFile = False
	Line = objReader.ReadLine
	curBuffer = Clean_Extra_Delimiters(Split(Line, " "))				'Tokenize line
	Do While IsNumeric(curBuffer(0)) AND EndOfFile = False
		If Int(curBuffer(2)) >= HighCpuRate Then
			HighCpuRate = HighCpuRate + 1
		End If
		TotalCpuEntries = TotalCpuEntries + 1
		If objReader.AtEndOfStream = False then
			Line = objReader.ReadLine
			curBuffer = Clean_Extra_Delimiters(Split(Line, " "))		'Tokenize line
		Else
			EndOfFile = True
		End if
	Loop
	Parse_Core_Percentage = Line
End Function

Function Parse_Disk_Utilization(objReader) 
	TotalDiskEntries = 0
	EndOfFile = False
	Line = objReader.ReadLine
	curBuffer = Clean_Extra_Delimiters(Split(Line, " "))		'Tokenize line
	Do While IsNumeric(curBuffer(0)) AND EndOfFile = False
		If Int(curBuffer(3)) >= HighDiskRate Then
			HighDiskHit = HighDiskHit + 1
		End If
		TotalDiskEntries = TotalDiskEntries + 1
		If objReader.AtEndOfStream = False then
			Line = objReader.ReadLine
			curBuffer = Clean_Extra_Delimiters(Split(Line, " "))		'Tokenize line
		Else
			EndOfFile = True
		End if
	Loop
	Parse_Disk_Utilization = Line
End Function

'Gets last X created PFM Files, by creation date.
Function GetFileArray()
	Set regex = new RegExp										'Create the RegExp object
	regex.Pattern = "pfm"
	regex.IgnoreCase = False									'Case sensitive

	Dim FileList()
	Dim EndList()
	ReDim EndList(NumPFMtoCheck-1) 'Cant dim with a variable. Can Redim.
	
	counter=0
	
	Set Folder = objFSO.GetFolder(LocationOfPFM)
  	Set files = Folder.Files
		
	For Each folderidx In files
		If regex.Test(folderidx.Name) Then
			ReDim Preserve FileList(counter)
			FileList(counter) = folderidx.Name
			counter = counter + 1 
		End if
	Next
	
	Set files = Nothing
	Set Folder= nothing
	
	Ubou = UBound(FileList)
	
	If UBound(FileList) <= NumPFMtoCheck Then
		NumFiles = 0
	Else
		NumFiles = UBound(FileList) - NumPFMtoCheck - 1	'zero index
	End if
	j=0
	For i = UBound(FileList) To NumFiles Step -1 
		EndList(j) = FileList(i)
		j = j + 1
	next
	
	GetFileArray = EndList
End Function

Function BoolCheckMicrocode()

	Set regex = new RegExp										'Create the RegExp object
	regex.Pattern = RequiredMC
	regex.IgnoreCase = False									'Case sensitive
	Set regex2 = new RegExp										'Create the RegExp object
	regex2.Pattern = "Serial Number"
	regex2.IgnoreCase = False									'Case sensitive
	
	objlogFile.Writeline("---------------------------")
	objlogFile.Writeline(Time & " Checking for hardware errors") 	'Log everything to file
	
	MicroCodeFound = false

	If Simulate Then
		FileName = LocationOfAuOutput & UnitInfo
		Set objRead = objFSO.OpenTextFile(FileName, 1, false)
		Buffer = objRead.ReadLine	'Cache line in temp variable
		Do until objRead.AtEndOfStream = True
			If regex.Test(Buffer) Then
				MicroCodeFound = True
			End If
			If regex2.Test(Buffer) Then
				splt = Clean_Extra_Delimiters(Split(Buffer, " "))
				amsSERIAL= splt(3)
			End If
			Buffer = objRead.ReadLine	'Cache line in temp variable
		Loop
		Set objRead = Nothing
	Else
		Set RunCheck = wshShell.Exec(cmdMCVER) 'Run name
		Do while RunCheck.status = 0
			wscript.sleep 1
			Buffer = RunCheck.StdOut.ReadLine
			If verboselog = True Then						'Check verbosity level
				objlogFile.Writeline(Time & " " & Buffer) 	'Log everything to file
			End If 
			If regex2.Test(Buffer) Then
				splt = Clean_Extra_Delimiters(Split(Buffer, " "))
				amsSERIAL= splt(4)
			End If
			If regex.Test(Buffer) Then
				MicroCodeFound = True	
				objlogFile.Writeline(Time & " Microcode correct. " & strMC)
			End if		
		Loop
	End if
	BoolCheckMicrocode = MicroCodeFound
	objlogFile.Writeline("---------------------------")
End Function


'kds
'Checks for non-secure protocol
'kds 
' HDVM Protocol information

Function BoolCheckSecure()
	'Build Command
	cmdHDVMP = "cmd /c " & LocationofHDVM & "\HiCommandCLI.bat --user " & usrHDVM & " --password " & passFile & " GetStorageArray subtarget=commparameters -f csv | find """ & amsSERIAL & """"
	Set regex = new RegExp										'Create the RegExp object
	regex.Pattern = "Non-Secure"
	regex.IgnoreCase = False									'Case sensitive
	
	objlogFile.Writeline("---------------------------")
	objlogFile.Writeline(Time & " Checking HDvM for Non-Secure Protocol") 	'Log everything to file
	
	SecureProtoFound = false

	If Simulate Then
		FileName = LocationOfAuOutput & HDVMOUT
		Set objRead = objFSO.OpenTextFile(FileName, 1, false)
		Buffer = objRead.ReadLine	'Cache line in temp variable
		Do until objRead.AtEndOfStream = True
			If regex.Test(Buffer) Then
				MicroCodeFound = True
			End if		
			Buffer = objRead.ReadLine	'Cache line in temp variable
		Loop
		Set objRead = Nothing
	Else
		Set RunCheck = wshShell.Exec(cmdHDVMP) 'Run name
		Do while RunCheck.status = 0
			wscript.sleep 1
			Buffer = RunCheck.StdOut.ReadLine
			If Len(Buffer) > 0 then
			 'Buffer contains data
 			  If verboselog = True Then						'Check verbosity level
				  objlogFile.Writeline(Time & " " & Buffer) 	'Log everything to file
			  End If 
			
			  If regex.Test(Buffer) Then
				  SecureProtoFound = True	
				  objlogFile.Writeline(Time & " Protocol is correctly set to Non-Secure. " & strMC)
			  End if
			End if		
		Loop
	End if
	BoolCheckSecure = SecureProtoFound
	objlogFile.Writeline("---------------------------")
End Function


Function BoolCheckForErrors()
	Set regex = new RegExp										'Create the RegExp object
	regex.Pattern = "(WARNING)|(ERROR)"
	regex.IgnoreCase = True									'Case sensitive
	
	objlogFile.Writeline("---------------------------")
	objlogFile.Writeline(Time & " Checking for hardware errors") 	'Log everything to file
	
	ErrorsFound = False
	
	If Simulate Then
		FileName = LocationOfAuOutput & PartList
		Set objRead = objFSO.OpenTextFile(FileName, 1, false)
		Buffer = objRead.ReadLine	'Cache line in temp variable
		Do until objRead.AtEndOfStream = True
			If regex.Test(Buffer) Then
				ErrorsFound = True
			End if		
			Buffer = objRead.ReadLine	'Cache line in temp variable
		Loop
	Else
		Set RunCheck = wshShell.Exec(cmdPARTS) 'Run name
		Do while RunCheck.status = 0
			wscript.sleep 1
			Buffer = RunCheck.StdOut.ReadLine
			If verboselog = True Then						'Check verbosity level
				objlogFile.Writeline(Time & " " & Buffer) 	'Log everything to file
			End If 
			
			If regex.Test(Buffer) Then
				ErrorsFound = True	
				objlogFile.Writeline(Time & " Error Found: " & Buffer)
			End if		
		Loop
	End if
	BoolCheckForErrors = ErrorsFound
	objlogFile.Writeline("---------------------------")
End Function

Sub ParseFiles() 
	For Each File In GetFileArray
		Parse_PFM_File(LocationOfPFM & "\" & File)
	Next
	
	'Percentages
	CPUHitPercent = (HighCpuHit / (TotalCpuEntries * NumPFMtoCheck) * 100)
	CacheHitPercent = (HighCacheHit / (TotalCacheEntries * NumPFMtoCheck) * 100)
	DiskHitPercent = (HighDiskHit / (TotalDiskEntries * NumPFMtoCheck) * 100)

End Sub

Function GetConfigFileArray()
	Set regex = new RegExp										'Create the RegExp object
	regex.Pattern = "bat"
	regex.IgnoreCase = False									'Case sensitive

	Dim FileList()
	counter=0
	
	Set Folder = objFSO.GetFolder(ConfigLocation)
  	Set files = Folder.Files
		
	For Each folderidx In files
		If regex.Test(folderidx.Name) Then
			ReDim Preserve FileList(counter)
			FileList(counter) = folderidx.Name
			counter = counter + 1 
		End if
	Next
	
	'We can do some sort of sorting here to make sure commands get written in the correct order.
	'Typically Luns and HG's need to be added prior to adding them to the HG, ya know.
	
	GetConfigFileArray = FileList
End Function

Function LoadConfig(FileName)
	Set regex = new RegExp										'Create the RegExp object
	regex.Pattern = "REM"
	regex.IgnoreCase = True	
	Set regex2 = new RegExp										'Create the RegExp object
	regex2.Pattern = "set "
	regex2.IgnoreCase = True									'Case sensitive
	Set regex3 = new RegExp										'Create the RegExp object
	regex3.Pattern = "unit"
	regex3.IgnoreCase = True									'Case sensitive	
	
	objlogFile.Writeline(Time & " ---------------------------")
	objlogFile.Writeline(Time & " Loading Configuration file: " & FileName) 	'Log everything to file
	objlogFile.Writeline(Time & " ---------------------------")
	Set objRead = objFSO.OpenTextFile(FileName, 1, false)
	Buffer = objRead.ReadLine	'Cache line in temp variable
	i=0
	j=0
	Do until objRead.AtEndOfStream = True
		If Not regex.Test(Buffer) And Not regex2.Test(Buffer) Then
			ReDim Preserve CommandArray(i)
			CommandArray(i) = Buffer
			objlogFile.Writeline(Time & " Command Found, Adding to Queue")
			objlogFile.Writeline(Time & "          "& Buffer)
			i= i + 1
			
			'Do some sort of check here to make sure that commands come in the correct order.
			'Add Luns to HG's at bottom of array
			'Add Create HG's and Create Luns at Top of array.
			
			
		ElseIf regex2.Test(Buffer) And Not regex.Test(Buffer) And Not regex3.Test(Buffer) Then
			ReDim Preserve EnvironmentVariables(j)
			EnvironmentVariables(j) = Buffer
			objlogFile.Writeline(Time & " Environment Variable Found, Adding to Queue")
			objlogFile.Writeline(Time & "          "& Buffer)
			j = j + 1
		End if	
			
		Buffer = objRead.ReadLine	'Cache line in temp variable
	Loop
	objlogFile.Writeline("---------------------------")
	MsgBox "test"
End Function


Function RunCommands() 
	ReturnCode = 0
	Do While UBound(CommandList) >= 1 Or ReturnCode = 0 
		ReturnCode = RunCommand(pop_top(CommandList))
	Loop
	If ReturnCode <> 0 Then
		'Output all left overs to file for next run.
	End If
End Function

Function RunCommand(command)
	Set RunCheck = wshShell.Exec(command) 'Run name
	objlogFile.Writeline("---------------------------")
	objlogFile.Writeline(Time & " Starting Execution of: " & command)
	objlogFile.Writeline(Time & "Output from command follows:")
	objlogFile.Writeline("---------------------------")
	
	Do while RunCheck.status = 0
		wscript.sleep 1
		Buffer = RunCheck.StdOut.ReadLine
		If Len(Buffer) > 0 Then
			objlogFile.Writeline(Time & " " & Buffer) 	'Log everything to file
		End if		
	Loop
	
	If RunCheck.ExitCode <> 0 Then
		objlogFile.Writeline(Time & " Execution of Command, " & command & ", failed!")
		objlogFile.Writeline(Time & " Error Code was: " & RunCheck.ExitCode )
	End If 
	objlogFile.Writeline("---------------------------")
	RunCommand = RunCheck.ExitCode
End Function

'---------------------------------------------------------
'					Support Functions
'---------------------------------------------------------
'Split does not handle Extra Delimiters, clean it.
Function Clean_Extra_Delimiters(Split_Array)
	Dim New_Array()
	i=0
	For Each str In Split_Array
		If Not str = "" Then
			ReDim Preserve New_Array(i)
			New_Array(i) = str
			i=i+1
		End If 
	Next
	Clean_Extra_Delimiters = New_Array
End Function

'Pops the last element and resizes the array
Function pop_top(Arr)  
	Dim ret
	ret = Arr(UBound(Arr))
	redim preserve Arr(UBound(Arr)-1)
	pop_top = ret
End Function

'Pops the first element(0) and resizes the array
Function pop_bot(Arr)
	Dim newarr()
	Dim val
	val = Arr(0)
	For i = 1 To UBound(Arr) Step 1
		ReDim Preserve newarr(i-1)
		newarr(i-1) = Arr(i)
	Next
	
	For i = 0 To UBound(newarr) Step 1
		Arr(i) = newarr(i)
	Next 
	
	ReDim Preserve Arr(UBound(Arr)-1)
	pop_bot = val
End Function

'Adds value to the bottom of the array(0)
Function push_bot(value, Arr)
	ReDim newarr(UBound(Arr))

	For i = 0 To UBound(Arr) Step 1
		newarr(i) = Arr(i)
	Next
	Arr(0) = value
	
	ReDim Preserve Arr(UBound(arr)+1)
	
	For i = 1 To UBound(Arr) Step 1
		Arr(i) = newarr(i - 1)
	Next
	
End Function

'Adds Value to the top of the array
Function push_top(value, Arr)  
	redim preserve Arr(UBound(Arr)+1)
	Arr(UBound(Arr)) = value
End Function

'gunnings for crab cakes
'helmond 'in baltimore afgahny

'---------------------------------------------------------
'				     Begin Code
'				Initial Check / Exits
'---------------------------------------------------------
CheckLogFolder
Set objlogFile = objFSO.CreateTextFile(logfile) 

'Check for Errors
If BoolCheckForErrors Then
	objlogFile.Writeline(Time & " Exitting due to hardware errors. Code 103")
	WScript.Quit 105
End If 
'Check for Microcode Status
If Not BoolCheckMicrocode Then
	objlogFile.Writeline(Time & " Exitting due to Incorrect Microcode. Code 104")
	WScript.Quit 104
End If 
If False Then 'BoolCheckSecure Then
	objlogFile.Writeline(Time & " Exitting because connection is Secure. Code 106")
	WScript.Quit 106
End If

'Check for Thresholds
ParseFiles
If DiskHitPercent >= DiskHitPercentMax Then
	WScript.Quit 103
End If

If CPUHitPercent >= CPUHitPercentMax Then
	WScript.Quit 102
End If

If CacheHitPercent >= CacheHitPercentMax Then
	WScript.Quit 101
End If


'---------------------------------------------------------
'				Start Creation of Devices
'---------------------------------------------------------
'TODO: 	Read Lines from Batch Files.
'		Run each line.
'		At Seperators, put in a wait.
'		Check Time passed.


'Load Commands to be ran.
For Each File In GetConfigFileArray
	LoadConfig(ConfigLocation & File)
Next



WScript.Echo "-------------------------------------------" 
WScript.Echo "No Errors Found."
WScript.Echo "-------------------------------------------" 
WScript.Echo "Microcode: " & RequiredMC
WScript.Echo "-------------------------------------------" 
WScript.Echo "Total Disks: " & (TotalDiskEntries/2)
WScript.Echo "Disks hits above threshold(" & HighDiskRate &"): " & HighDiskHit
WScript.Echo "-------------------------------------------" 
WScript.Echo "Total Cores: " & TotalCpuEntries
WScript.Echo "Cores hits above threshold(" & HighCpuHit &"): " & HighCpuHit
WScript.Echo "-------------------------------------------" 
WScript.Echo "Total Cache Entries: " & TotalCacheEntries
WScript.Echo "Cache hits above threshold(" & HighCacheWait &"): " & HighCacheHit
WScript.Echo "-------------------------------------------" 





'RETURN CODES
'===========================
'0	  - All precheck test were successful it is safe to continue
'106 - HDvM is using secure protocol
'105 - Failed or Failing components were detected
'104 - Wrong version of Microcode detected
'103 - Disk utilization rates were detected above threshold
'102 - CPU utilization rates were detected above threshold
'101 - Cache Write Pending rates were detected above threshold