[Xymon] Monitoring DFS-R (2012)

Shea, Graeme A Shea.Graeme.A at edumail.vic.gov.au
Fri Mar 14 03:29:51 CET 2014


This is the most important script I run, if a server is dead someone will tell me but if DFSR stops (and it does) the copies get out of sync very quick and then bad things happen.

I found I had to run the script  from a scheduled task rather than from an entry in the bbwin config file, don't know why. The file backlog counting component is with all rights, thanks and attribs to Martin9700 at http://community.spiceworks.com/scripts/show/205-dfs-replication-monitor

Under Varaiable settings enter the path to write the test file and the path to where the file is replicated too. Don't use the DFS shares on the servers because even though you specifiy the servers if it's a DFS share AD can send you to either server.
There are 5 lines to enter the share paths but they are all contaminated and then the entries are split into pairs before processing

Regards
Graeme


option explicit
'Script to check DFS and DFS Replication
' Graeme Shea, Shea Technology Pty Ltd. 07/12/06


Dim oShell,oOutFile,oFSO,b64Bit, szLog, MFile, SFile, Status, ReplicationTime, YellowThreshold, strBacklogReport
Dim RedThreshold, ExtPath, szReportDetails, bCreateLog, aTestPaths, szTestPaths,szTestPaths1, c
Dim szTestPaths2, szTestPaths3, szTestPaths4, szTestPaths5, StartTime, FinishTime, strTemp, numBackLog, YellowBacklogThreshold, RedBacklogThreshold
Dim objExplorer, binFirstWindow, strFiles, strComputer, objWMIService, colRGroups, colRGConnections, oGroup, strResult, arrLines, arrResult
Dim colRGFolders, oFolder, strTRDomain, oConnection, binInbound, strPartner, strRGName, strRFName, strSendingComputer, strReceivingComputer
 
		
'**********************************************************************************************************
'Varaiable Settings
'The follow lines specify the paths (in pairs, on the same line). The script writes to the first location of the pair and reads
' from the second location of the pair.  5 lines are provided for conveance and all lines are concatinated
' before processing.
szTestPaths1 = "D:\apps, \\fs2\D$\apps" 
szTestPaths2 = "D:\Home\students,\\fs2\D$\Home\students"
szTestPaths3 = "D:\Home\staff,\\fs2\D$\Home\staff"
szTestPaths4 = "D:\Home\staffCmn,\\fs2\D$\Home\staffCmn" 
szTestPaths5 = ""


YellowThreshold	= 20			'Seconds before yellow warning.
RedThreshold = 50				'Seconds before red warning, Max 60 seconds, Script only waits 60 Seconds.
YellowBacklogThreshold	= 4	'Backlog file count before yellow warning.
RedBacklogThreshold = 20	'Backlog file count before red warning.

bCreateLog = False			'Create Log file for fault finding.



'**********************************************************************************************************
'Nothing to set below here.

' Graeme Shea, Shea Techology Pty Ltd. 22/03/07
'Ver 0.3 Changed 0 seconds to say less than 0.1 seconds
'Ver 0.9 Added check for replicated folder status using WMI
'Ver 0.9.1 Opens folder before writing file to fix inital unable to write test file issues
'Ver 0.9.2 Now BBWin compatable.
'Ver 0.9.3 Fixed incorrect time being reported.
'Ver 0.9.4 Adds backlog file counting.
'Ver 0.9.5 Adds replicated folder name to backlog table.

Const Version = "0.9.5 "
Const ForReading = 1 
Const ForWriting = 2 
Const ForAppending = 8
Status = "green"
StartTime = Timer()	'Start Timer to make sure script does not run too long
Set oFSO= CreateObject("Scripting.FileSystemObject")
Set oShell = WScript.CreateObject("WScript.Shell")
strComputer = oShell.ExpandEnvironmentStrings( "%COMPUTERNAME%" )
WriteLog("Clear this log.")
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\MicrosoftDFS")
'On Error Resume Next
ExtPath = GetBigBrotherPath()
On Error GoTo 0

'ExtPath = "C:" ' Used for testing if client not installed
WriteLog("Got BB Extpath as: " & ExtPath)


szTestPaths = szTestPaths1 & ","  & szTestPaths2 & "," & szTestPaths3 & "," & szTestPaths4 & "," & szTestPaths5

szTestPaths = Replace(szTestPaths, ", ,", ",")
szTestPaths = Replace(szTestPaths, ",,", ",")
szTestPaths = Replace(szTestPaths, ",,", ",")
If (right(szTestPaths,1) = "," )Then szTestPaths = Left(szTestPaths, len(szTestPaths) -1)
aTestPaths = Split(szTestPaths, ",")


strBacklogReport = GetBacklogTable & vbCrLf 'Do this first so test files aren't counted in backlog.

GetFolderStatus() 'Get the status ( normal, error etc.) of replicated folders on this machine


 For c = LBound(aTestPaths) To UBound(aTestPaths) Step 2
	szReportDetails = szReportDetails & RunTest(aTestPaths(c), aTestPaths(c+ 1)) & vbCrLf
	' Lets check how long the script has been running and stop it before BB start another instance.
	FinishTime = Timer
	'Lets make sure we are not running over midnight.
	If FinishTime < StartTime Then 
      FinishTime = FinishTime + 86400 
    End If 
   If FinishTime - StartTime > 240 Then  'lets stop at 180 seconds.
   		szReportDetails = szReportDetails & VbCrLf & "&red Fatal Error, testing timed out."
		If bCreateLog Then WriteLog( VbCrLf & "Fatal Error, testing timed out.")
   		Status = "red"
   		Exit For
   End If

 Next

szReportDetails = szReportDetails & VbCrLf &  strBacklogReport 

Set oOutFile = oFSO.CreateTextFile (ExtPath &"\DFS")

If bCreateLog Then WriteLog("Created Output file ")

oOutFile.WriteLine Status & " DFS replication check completed at "& Time
oOutFile.WriteBlankLines(1)
oOutFile.WriteLine szReportDetails
oOutFile.WriteLine "DFS File replication tester for Big Brother, BBDfsRep.vbs Version " & Version
oOutFile.Close 
WriteLog("Finshed ")
WScript.quit

Function RunTest(Path1, Path2)
'************************************************************************************************
' runs the DFS repliciton test and returns results formated for BB output file
'************************************************************************************************
Dim ReplicationTime

If bCreateLog Then WriteLog("Testing replicaiton time for " & Path1 & " and " & Path2 ) 

ReplicationTime = TestReplication(Path1, Path2)

If bCreateLog Then WriteLog("	Got repliction time as " & ReplicationTime  )

If IsNumeric(ReplicationTime) Then 	
	If ReplicationTime < YellowThreshold Then
		If ReplicationTime = 0 Then
		
			RunTest = "&green Replication test from " & Path1 & " to " & Path2 & " took " & _
				"Less than 0.1 seconds." 
		else
			RunTest = "&green Replication test from " & Path1 & " to " & Path2 & " took " & _
				ReplicationTime & " seconds." 
		end if
	End If
	
	If ReplicationTime => YellowThreshold Then
		If ReplicationTime > 60 Then
			Status = "red"
			RunTest = "&red Replication test from " & Path1 & " to " & Path2 & " timed out at " & _
				ReplicationTime & " seconds." 
		Else	
			If ReplicationTime > RedThreshold Then
				Status = "red"
				RunTest = "&red Replication test from " & Path1 & " to " & Path2 & " took " & _
					ReplicationTime & " seconds." 		
			Else		
				If Status <> "red" Then
					Status = "yellow"
				End If
				RunTest = "&yellow Replication test from " & Path1 & " to " & Path2 & " took " & _
					ReplicationTime & " seconds."
			End If
		End If
	End If
Else

	Status = "red"
	RunTest = "&red Replication test from " & Path1 & " to " & Path2 & _
				" Failed with the following error " & ReplicationTime
End If
	
End Function

Function TestReplication(szMaster, szSlave)
	Dim testFile
	Dim i
	Dim FSO
	Dim szFileName
	Dim f
	
	On Error Resume Next
	Set FSO= CreateObject("Scripting.FileSystemObject")
	
	'Need to create a random file name for avoide conflicts
	 szFileName = "\DFSTest" & round((rnd() * 10000000))& ".txt"
	 
	' Clean up the paths
	szMaster = Trim(szMaster)
	If Right(szMaster,1) = "\" Then
	 szMaster = Left(szMaster, Len(szMaster) - 1)
	End If
	
	szSlave = Trim(szSlave)
	If Right(szSlave,1) = "\" Then
	 szSlave = Left(szSlave, Len(szSlave) - 1)
	End If
	
	If bCreateLog Then WriteLog("Testing replication from " & szMaster & " to " & szSlave)
	
	i = 0

	Set f = fso.GetFolder(szMaster)
	Set f = fso.GetFolder(szSlave)
	set f = Nothing

 	Set testFile = FSO.CreateTextFile (szMaster & szFileName, True)
 	If Err Then
 		TestReplication = "Error Unable to write " & szMaster & szFileName & ". Error number " & _
 			Err.Number & " Error description " & Err.Description
 		Err.Clear
 		Exit Function
 	End If
	testFile.WriteLine ("File for automated DFS repliction testing. Created " & now)
	testFile.Close
	
	Do While Not oFSO.FileExists(szSlave & szFileName)
	 	i = i + 1
	 	If i > 600 Then 
	 		If bCreateLog Then WriteLog("Replicaion test timed out at " & i & " seconds")
	 		Exit Do
	 	End If
	 	
		WScript.Sleep(100)
	Loop
	'i gives us the count of tenths of seconds it took for the file to be replicated.
	if not i = 0 Then
		i = i/10
	End If
	
	oFSO.DeleteFile szMaster & szFileName,True
		
	TestReplication = i
End Function

Sub WriteLog(szText)
Dim oLogFile
	If bCreateLog Then
		If szText = "Clear this log." Then 
			Set oLogFile = oFSO.OpenTextFile (ExtPath &"\DFS.log", ForWriting, True)
	    	'oLogFile.Close
			'Exit Sub
			szText = "Beginning "
		Else
			Set oLogFile = oFSO.OpenTextFile (ExtPath &"\DFS.log", ForAppending,True)
		End If
		oLogFile.WriteLine (szText & "   at time " & time)
		oLogFile.Close
		'szLog = szLog & szText & vbCrLf
	End If
End Sub

Sub GetFolderStatus()


'States
'Uninitialized = 0
'Initialized = 1
'InitialSync = 2
'AutoRecovery = 3 
'Normal = 4
'InError = 5

'Dim objWMIService
Dim colItems
Dim objItem
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20

   'Set objWMIService = GetObject("winmgmts:\\" & "localhost" & "\root\MicrosoftDfs")
   Set colItems = objWMIService.ExecQuery("SELECT * FROM DfsrReplicatedFolderInfo", "WQL", _
                                          wbemFlagReturnImmediately + wbemFlagForwardOnly)

   For Each objItem In colItems
   
      Select Case objItem.State
      	Case 0 
      			szReportDetails = szReportDetails & "&yellow Folder " & objItem.ReplicatedFolderName _
      				& " in group " & objItem.ReplicationGroupName & " Reports it is not yet initialised" & VbCrLf
				If Status <> "red" Then Status = "yellow"
      	Case 1 
      			szReportDetails = szReportDetails & "&yellow Folder " & objItem.ReplicatedFolderName _
      				& " in group " & objItem.ReplicationGroupName & " Reports it is Initialised" & VbCrLf
				If Status <> "red" Then Status = "yellow"
      	Case 2 
      			szReportDetails = szReportDetails & "&yellow Folder " & objItem.ReplicatedFolderName _
      				& " in group " & objItem.ReplicationGroupName & " Reports it is in initial sync" & VbCrLf
				If Status <> "red" Then Status = "yellow"
      	Case 3 
      			szReportDetails = szReportDetails & "&yellow Folder " & objItem.ReplicatedFolderName _
      				& " in group " & objItem.ReplicationGroupName & " Reports it is in Auto Recovery" & VbCrLf
      			szReportDetails = szReportDetails & "&yellow    Last error code = " & objItem.LastErrorCode _
      				& "  Last error msg id = " & objItem.LastErrorMessageId  & VbCrLf
				If Status <> "red" Then Status = "yellow"
      	Case 4 
      			szReportDetails = szReportDetails & "&green Folder " & objItem.ReplicatedFolderName _
      				& " in group " & objItem.ReplicationGroupName & " Reports its status is normal " & VbCrLf
      			
      	Case 5 
      			szReportDetails = szReportDetails & "&red Folder " & objItem.ReplicatedFolderName _
      				& " in group " & objItem.ReplicationGroupName & " Reports it is in Error" & VbCrLf
      			szReportDetails = szReportDetails & "&red    Last error code = " & objItem.LastErrorCode _
      				& "  Last error msg id = " & objItem.LastErrorMessageId  & VbCrLf
				Status = "red"
      	Case Else 
      			szReportDetails = szReportDetails & "&yellow Folder " & objItem.ReplicatedFolderName _
      				& " in group " & objItem.ReplicationGroupName & " Condition unknown" & VbCrLf
      			szReportDetails = szReportDetails & "&yellow    Last error code = " & objItem.LastErrorCode _
      				& "  Last error msg id = " & objItem.LastErrorMessageId  & VbCrLf
				If Status <> "red" Then Status = "yellow"
      		
      End Select
    
   Next
   szReportDetails = szReportDetails & VbCrLf
End Sub

' Get path to external log files (for BB 1.08d)
Function GetBigBrotherPath()
Dim ExtPath
On Error Resume Next
ExtPath = oShell.RegRead("HKLM\SOFTWARE\Quest Software\BigBrother\bbnt\ExternalPath\")
If IsEmpty(ExtPath) Then
	ExtPath = oShell.RegRead("HKLM\SOFTWARE\BBWin\tmppath")
End If
If Not IsEmpty (ExtPath) Then  'If not empty then we have 32bit machine
	b64Bit = False
End If
If IsEmpty(ExtPath) Then
	ExtPath = oShell.RegRead("HKLM\SOFTWARE\Wow6432node\Quest Software\BigBrother\bbnt\ExternalPath\")
End If
If IsEmpty(ExtPath) Then
	ExtPath = oShell.RegRead("HKLM\SOFTWARE\Wow6432node\BBWin\tmppath")
End If

If Not IsEmpty(ExtPath) And isEmpty(b64Bit) Then 
	b64Bit = True
	err.clear
End If

If IsEmpty(ExtPath) Then
	'Put exit stuff here
End If
on Error GoTo 0
GetBigBrotherPath = ExtPath
End Function

Function PadToLength(strText)

	While Len(strText) < 25
		strText = strText & " "
	Wend
	
	PadToLength = strText

End Function

'#--------------------------------------------------------------------------
'#	FUNCTION.......:	GetBacklogTable
'#	PURPOSE........:	Discovers DFS tree's and returns a table displaying backlog counts
'#                      
'#	ARGUMENTS......:	
'#	EXAMPLE........:	
'#	NOTES..........:	Most (but not all) of from here down is by and with all rights, thanks and attribs to Martin9700
'#					 	at http://community.spiceworks.com/scripts/show/205-dfs-replication-monitor
'#--------------------------------------------------------------------------
Function GetBacklogTable()
WriteLog( VbCrLf & "Entered GetBacklogTable.")
Dim strHTML
	strHTML = PadToLength("Replication Group") & PadToLength("Replicated Folder") & PadToLength("Sending Partner") & PadToLength("Receiving Partner") & "Backlog (Files)" & vbCrLf
	'Set oWMIService = GetObject("winmgmts:\\" & strComputer & "\root\MicrosoftDFS")
	Set colRGroups = objWMIService.ExecQuery("SELECT * FROM DfsrReplicationGroupConfig")
	WriteLog( VbCrLf & "Got colRGroups.")
	For Each oGroup in colRGroups
		Set colRGFolders = objWMIService.ExecQuery("SELECT * FROM DfsrReplicatedFolderConfig WHERE ReplicationGroupGUID='" & oGroup.ReplicationGroupGUID & "'")
		WriteLog( VbCrLf & "Got colRGFolders.")
		For Each oFolder in colRGFolders
			Set colRGConnections = objWMIService.ExecQuery("SELECT * FROM DfsrConnectionConfig WHERE ReplicationGroupGUID='" & oGroup.ReplicationGroupGUID & "'")
			WriteLog( VbCrLf & "Got colRGConnections.")
			strTRDomain = "d1"
			For Each oConnection In colRGConnections
				WriteLog( VbCrLf & "Got oConnection.")
				binInbound = oConnection.Inbound
				strPartner = oConnection.PartnerName
				strRGName = oGroup.ReplicationGroupName
				strRFName = oFolder.ReplicatedFolderName
				If binInbound = True Then
					strSendingComputer = strPartner
					strReceivingComputer = strComputer
				Else
					strSendingComputer = strComputer
					strReceivingComputer = strPartner
				End If
				If oConnection.Enabled = True Then
					If strTRDomain = "d1" Then
						strTRDomain = "d0"
					Else
						strTRDomain = "d1"
					End If
					WriteLog( VbCrLf & "Getting backlog, " & strSendingComputer & ", " & strReceivingComputer & ", " & strRGName & ", " & strRFName)
					numBackLog = getBackLog(strSendingComputer, strReceivingComputer, strRGName, strRFName)
					WriteLog( VbCrLf & "Backlog = " & numBackLog )
					If CDbl(RedBacklogThreshold) < CDbl(numBackLog) Then
					WriteLog("RedBacklogThreshold = " & RedBacklogThreshold)
					WriteLog("numBackLog = " & numBackLog)
					strHTML = strHTML & "&red"
   					Status = "red"
					ElseIf CDbl(YellowBacklogThreshold) < CDbl(numBackLog)  Then
					strHTML = strHTML & "&yellow"
					If Status = "green" Then Status = "yellow"
					Else
					strHTML = strHTML & "&green"
					End If
					If strSendingComputer = "." Then strSendingComputer = "LocalHost"
					If strReceivingComputer = "." Then strReceivingComputer = "LocalHost"
					strHTML = strHTML & PadToLength(strRGName) & PadToLength(strRFName)  & PadToLength(strSendingComputer) 
					strHTML = strHTML & PadToLength(strReceivingComputer) & numBackLog & " Files." & vbCrLf 'strFiles  & vbCrLf
				End If 
			Next
		Next
	Next
	strHTML = strHTML & vbCrLf & "List of Backlogged Files." & vbCrLf
	strHTML = strHTML & vbCrLf & strFiles & vbCrLf
		
	strHTML = strHTML & vbCrLf & "Last run on: " & date & ", " & Time & vbCrLf
	
	'MsgBox(strHTML)
	
	GetBacklogTable = strHTML
End Function


'#--------------------------------------------------------------------------
'#	SUBROUTINE.....:	showTable (Not used)
'#	PURPOSE........:	Displays HTML data in open window
'#	ARGUMENTS......:	strText: string variable of what to display, the
'#                      more HTML the better it looks!
'#	EXAMPLE........:	
'#	NOTES..........:	
'#--------------------------------------------------------------------------
Sub showTable(strText)
	If binShowWindow = False Then
		Exit Sub
	End If
	If binFirstWindow = False Then
		binFirstWindow = True
		Set objExplorer = WScript.CreateObject("InternetExplorer.Application")
		With objExplorer
			.Navigate "about:blank"   
			.ToolBar = 0
			.StatusBar = 0
			.Width = 750
			.Height = 600 
			.Left = 0
			.Top = 0
		End With
		
		Do While (objExplorer.Busy)
			Wscript.Sleep 200
		Loop
		objExplorer.Visible = 1 
	End If

	On Error Resume Next
	objExplorer.Document.Body.InnerHTML = strText
	If Err.Number <> 0 Then
		Wscript.Quit
	End If
	On Error Goto 0
End Sub

'#--------------------------------------------------------------------------
'#	FUNCTION.......:	getBackLog
'#	PURPOSE........:	Retrieves the # of backlogged files, if any.  If there
'#                      are it also enumerates what files
'#	ARGUMENTS......:	strSending: sending server name
'#                      strReceiving: receiving server name
'#                      strReplicationGroup: DFS replication group
'#                      strReplicatedFolder: DFS folder being replicated
'#	EXAMPLE........:	
'#	NOTES..........:	
'#--------------------------------------------------------------------------
Function getBackLog(strSending, strReceiving, strReplicationGroup, strReplicatedFolder)
Dim x, objExec, fso, file
	WriteLog( VbCrLf & "Entered Getbacklog.")
	Set oShell = CreateObject ("Wscript.shell")
	WriteLog( VbCrLf & "Created oShell.")
	'On Error Resume Next
	 WriteLog("Running...DFSRDiag Backlog /RGName:" & strReplicationGroup & " /RFName:" & strReplicatedFolder & " /SendingMember:" & strSending & " /ReceivingMember:" & strReceiving )
	'objExec = oshell.run("dfsrdiag.exe Backlog /RGName:" & strReplicationGroup & " /RFName:" & strReplicatedFolder & " /SendingMember:" & strSending & " /ReceivingMember:" & strReceiving & " > c:\output.txt", 0, true)
	Set objExec = oshell.Exec("dfsrdiag.exe Backlog /RGName:""" & strReplicationGroup & """ /RFName:""" & strReplicatedFolder & """ /SendingMember:" & strSending & " /ReceivingMember:" & strReceiving)
	WriteLog("Finished running DFSRDiag.")
	
	If Err.Number Then WriteLog Err.Description
	
	strResult = ""
	strTemp = ""
	Do While Not objExec.StdOut.AtEndOfStream
		strResult = strResult & objExec.StdOut.ReadLine() & "\\"
		WriteLog( "Looping")
	Loop
	WriteLog( VbCrLf & "Finished loop.")
	WriteLog( VbCrLf & "strResult = " & strResult)

	If InStr(strResult, "No Backlog") > 0 or InStr(strResult, "[ERROR]") > 0 Then
		getBackLog = 0
		WriteLog("getBacklog = " & getBackLog)
	Else
		arrLines = Split(strResult, "\\")
		WriteLog("Split strResult to arrLines.")
		
		arrResult = Split(arrLines(1), ":")
		WriteLog("Split arrLines to arrResult.")
		getBackLog = arrResult(1)
		WriteLog("getBacklog from arrResult = " & getBackLog)
		If UBound(arrLines) > 1 Then
			strTemp = ""
			For x = 2 to UBound(arrLines)
				If InStr(arrLines(x), "Succeeded") = 0 and arrLines(x) <> "" Then
					strTemp = strTemp & arrLines(x) & vbCrLf
				End If
			Next
		End If
	End If
	strFiles = strFiles  & strTemp
End Function
-----Original Message-----
From: Xymon [mailto:xymon-bounces at xymon.com] On Behalf Of Colin Coe
Sent: Friday, 14 March 2014 10:06 AM
To: xymon at xymon.com
Subject: [Xymon] Monitoring DFS-R (2012)

Hi all

Just wondering if anyone is monitoring Windows Server 2012 DFS-R with
Xymon?  If so, any chance of sharing?

Thanks

CC


-- 
RHCE#805007969328369
_______________________________________________
Xymon mailing list
Xymon at xymon.com
http://lists.xymon.com/mailman/listinfo/xymon

Important - This email and any attachments may be confidential. If received in error, please contact us and delete all copies. Before opening or using attachments check them for viruses and defects. Regardless of any loss, damage or consequence, whether caused by the negligence of the sender or not, resulting directly or indirectly from the use of any attached files our liability is limited to resupplying any affected attachments. Any representations or opinions expressed are those of the individual sender, and not necessarily those of the Department of Education and Early Childhood Development.



More information about the Xymon mailing list