VMware: HOWTO make VCB backup easy with vcbBackup.vbs
To install vcb follow the instructions on this link.
The first time I came in contact with vcb I created some batch files to make vcb snapshots. I encountered all kind of problems. Snapshots that vcb didn’t remove. unexpected errors no vss support and some more issues.
To overcome some of these problems I created a vbs script vcbBackup.vbs. The full howto is comming soon for now only the code.
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const EVENT_TYPE_SUCCESS = 0
Const EVENT_TYPE_ERROR = 1
Const EVENT_TYPE_WARNING = 2
Const EVENT_TYPE_INFORMATION = 4
Const EVENT_TYPE_AUDITSUCCESS = 8
Const EVENT_TYPE_AUDITFAILURE = 16
Dim oFileSys, oEditLog, WshShell, oLongPath, oReadvcbVmNamesList
Dim intReturn
Dim pathConsolidatedBackup, pathLogs, pathLogsShort, pathConsolidatedBackupShort
Dim arg, xCount, argVMFilterOption, bDeleteDestFolder, strInfo
Dim tStartTime, tEndTime, intMinutes
Set oShell = WScript.CreateObject("WScript.Shell")
Set oFileSys = CreateObject("Scripting.FileSystemObject")
If WScript.Arguments.Count = 0 And WScript.Arguments.Count <= 3 Then
WScript.Echo "no argument on the command line." & vbCrLf & _
"<mount point> <username> <password> <vcserver> <optional: moref:vm-xxx> <optional: createlist>" & vbCrLf & _
""& vbCrLf & _
"<mount point> = Destination location" & vbCrLf & _
"<username> = Vutrual Center username" & vbCrLf & _
"<password> = Vutrual Center Password" & vbCrLf & _
"<vcserver> = Vurtual Center FQDN" & vbCrLf & _
"<optional: moref:vm-xxx> = to backup one server use moref:vm-xxx" & vbCrLf & _
"<optional: createlist> = Create vcbVmNames.list.all"
WScript.Quit
End If
pathConsolidatedBackup = "C:\Apps\VMware\VMware Consolidated Backup Framework"
pathConsolidatedBackupShort = MakeShortPath(oFileSys, pathConsolidatedBackup)
pathvcbVmNameslist = "C:\Apps\vcbBackup"
pathLogs = "C:\Apps\VMWARE_Backup_Logs"
pathLogsShort = MakeShortPath(oFileSys, pathLogs)
argVMFilterOption = "any:"
bDeleteDestFolder = True
pathMountPoint = WScript.Arguments(0)
argUsername = WScript.Arguments(1)
argPassword = WScript.Arguments(2)
serverConsolidatedBackup = WScript.Arguments(3)
'xCount = 0
If WScript.Arguments.Count = 5 Then
If InStr(WScript.Arguments(4), "moref:vm") > 0 Then
argVMFilterOption = WScript.Arguments(4)
elseif InStr(WScript.Arguments(4), "CreateList") > 0 Then
argVMFilterOption = WScript.Arguments(4)
Else
Wscript.Echo "Input is incorrect <moref:vm-xxx>"
WScript.Quit
End If
End If
if argVMFilterOption = "CreateList" then
tStartTime = Now()
intReturn = oShell.Run("cmd /c """ & pathConsolidatedBackup & "\vcbVmName.exe"" -h " & serverConsolidatedBackup & " -u " & argUsername & " -p " & argPassword & " -s any: >" & pathvcbVmNameslist & "\vcbVmNames.list.all",0,True)
tEndTime = Now()
Call CreateEvent(oShell, EVENT_TYPE_SUCCESS, "vcbVmNames.list.all created" & Chr(13) & "Elapsed time: " & TimeSpan(tStartTime, tEndTime))
WScript.Quit
else
intReturn = oShell.Run("cmd /c """ & pathConsolidatedBackup & "\vcbVmName.exe"" -h " & serverConsolidatedBackup & " -u " & argUsername & " -p " & argPassword & " -s any: >" & pathvcbVmNameslist & "\vcbVmNames.list.all",0,True)
end if
If argVMFilterOption = "any:" Then
tStartTime = Now()
Call RemoveSnapshots(oShell, oFileSys, pathvcbVmNameslist & "\vcbVmNames.list", pathMountPoint, pathConsolidatedBackup, serverConsolidatedBackup, pathLogsShort, pathConsolidatedBackupShort)
Set oReadvcbVmNamesList = oFileSys.OpenTextFile(pathvcbVmNameslist & "\vcbVmNames.list",ForReading,True)
tEndTime = Now()
Call CreateEvent(oShell, EVENT_TYPE_SUCCESS, "Remove old snapshots operation completed successfully" & Chr(13) & "Elapsed time: " & TimeSpan(tStartTime, tEndTime))
Else
tStartTime = Now()
intReturn = oShell.Run("cmd /c """ & pathConsolidatedBackup & "\vcbVmName.exe"" -h " & serverConsolidatedBackup & " -u " & argUsername & " -p " & argPassword & " -s " & argVMFilterOption & " >" & pathvcbVmNameslist & "\vcbVmNames.list.signle",0,True)
Call RemoveSnapshots(oShell, oFileSys, pathvcbVmNameslist & "\vcbVmNames.list.signle", pathMountPoint, pathConsolidatedBackup, serverConsolidatedBackup, pathLogsShort, pathConsolidatedBackupShort)
Set oReadvcbVmNamesList = oFileSys.OpenTextFile(pathvcbVmNameslist & "\vcbVmNames.list.signle",ForReading,True)
tEndTime = Now()
Call CreateEvent(oShell, EVENT_TYPE_SUCCESS, "Remove old snapshot operation completed successfully" & Chr(13) & "Elapsed time: " & TimeSpan(tStartTime, tEndTime))
End If
Do While Not oReadvcbVmNamesList.AtEndOfStream
strText = oReadvcbVmNamesList.ReadLine()
If Instr(strText, "moref:vm") > 0 Then
strFileUID = MakeTimeStamp()
strMoRef = strText
strText = oReadvcbVmNamesList.ReadLine()
strFileName = Right(strText,Len(strText)-5)
strFileName = Trim(Replace(strFileName,",", ""))
strFileName = Trim(Replace(strFileName," ", "_"))
strFileName = Trim(Replace(strFileName,":", "_"))
strText = oReadvcbVmNamesList.ReadLine()
strUUID = Split(strText,":")
tStartTime = Now()
intReturn = oShell.Run("cmd /c """ & pathConsolidatedBackup & "\vcbMounter"" -h " & serverConsolidatedBackup & " -u " & argUsername & " -p " & argPassword & " -a " & strMoRef & " -r " & pathMountPoint & "\" & strFileName & "." & strUUID(1) & "-fullVM -t fullvm -m san -L 6 >" & pathLogsShort & "\" & strFileName & "_" & strFileUID & "_makesnapshot.txt",0,True)
tEndTime = Now()
strErrMessage = strFileName & Chr(13) & strMoRef & Chr(13) & strUUID(0) & ":" & strUUID(1) & Chr(13) & "Processed " & CalculateFolderSize(oFileSys, pathMountPoint & "\" & strFileName & "." & strUUID(1) & "-fullVM") & " bytes in " & TimeSpan(tStartTime, tEndTime) & Chr(13) & "For more info see log file : " & pathLogs & "\" & strFileName & "_" & strFileUID & "_makesnapshot.txt"
Call CheckIFSnapShotISSuccess(oFileSys, pathLogs & "\" & strFileName & "_" & strFileUID & "_makesnapshot.txt", pathMountPoint & "\" & strFileName & "." & strUUID(1) & "-fullVM", strMessage)
End If
Loop
oReadvcbVmNamesList.Close
Set oReadvcbVmNamesList = Nothing
Set oFilesys = Nothing
Set oShell = Nothing
WScript.Quit
'***************************************************************************************************************************************
'******* FUNCTIONS *********************************************************************************************************************
'***************************************************************************************************************************************
Function FindRemoveSnapshot(oShell, oFileSys, pathConsolidatedBackup, serverConsolidatedBackup, strMoRef, strFileUID, pathLogs, strFileName, pathLogsShort, pathConsolidatedBackupShort)
Dim strText, strSSidSnapShot, intReturn, oReadFoundSnapShot, oReadFoundSnapShotCH
Dim bExitLoopCH
bExitLoopCH = false
intReturn = oShell.Run("cmd /c """ & pathConsolidatedBackupShort & "\vcbSnapshot.exe"" -h " & serverConsolidatedBackup & " -u " & argUsername & " -p " & argPassword & " -f " & strMoRef & " _VCB-BACKUP_ >" & pathLogsShort & "\" & strFileName & "_" & strFileUID & "_foundsnapshot.txt",0,True)
Set oReadFoundSnapShot = oFileSys.OpenTextFile(pathLogsShort & "\" & strFileName & "_" & strFileUID & "_foundsnapshot.txt",ForReading,True)
Do While Not oReadFoundSnapShot.AtEndOfStream
strText = oReadFoundSnapShot.ReadLine()
If Instr(strText, "SsId:snapshot") > 0 Then
intReturn = oShell.Run("cmd /c """ & pathConsolidatedBackupShort & "\vcbSnapshot.exe"" -h " & serverConsolidatedBackup & " -u " & argUsername & " -p " & argPassword & " -L 6 -d " & strMoRef & " " & Trim(strText) & " >" & pathLogsShort & "\" & strFileName & "_" & strFileUID & "_rmsnapshot.txt",0,True)
End If
Loop
intReturn = oShell.Run("cmd /C " & pathConsolidatedBackupShort & "\vcbSnapshot.exe -h " & serverConsolidatedBackup & " -u " & argUsername & " -p " & argPassword & " -f " & strMoRef & " ""Consolidate Helper"" >" & pathLogsShort & "\" & strFileName & "_" & strFileUID & "_foundsnapshot_ch.txt",0,True)
Set oReadFoundSnapShotCH = oFileSys.OpenTextFile(pathLogsShort & "\" & strFileName & "_" & strFileUID & "_foundsnapshot_ch.txt",ForReading,True)
Do While Not oReadFoundSnapShotCH.AtEndOfStream
strText = oReadFoundSnapShotCH.ReadLine()
If Instr(strText, "SsId:snapshot") > 0 Then
intReturn = oShell.Run("cmd /c """ & pathConsolidatedBackup & "\vcbSnapshot.exe"" -h " & serverConsolidatedBackup & " -u " & argUsername & " -p " & argPassword & " -L 6 -d " & strMoRef & " " & Trim(strText) & " >" & pathLogsShort & "\" & strFileName & "_" & strFileUID & "_rmsnapshot.txt",0,True)
End If
Loop
oReadFoundSnapShot.close
oReadFoundSnapShotCH.close
Set oReadFoundSnapShot = Nothing
Set oReadFoundSnapShotCH = Nothing
End Function
Function MakeTimeStamp()
MakeTimeStamp = Year(now()) & Right("0" & Month(now()), 2) & Right("0" & Day(now()), 2) & Right("0" & Hour(now()), 2) & Right("0" & Hour(now()), 2) & Right("0" & Minute(now()), 2) & Right("0" & Second(now()), 2)
End Function
Function MakeUnmountDat(oFileSys, pathUnmountDat, strUUID)
Set oMakeUnmountDat = oFileSys.CreateTextFile(pathUnmountDat & "\unmount.dat",True)
oMakeUnmountDat.WriteLine("fullvm")
oMakeUnmountDat.WriteLine("uuid:" & strUUID)
oMakeUnmountDat.WriteLine("any:")
oMakeUnmountDat.Close
Set oMakeUnmountDat = Nothing
End Function
Function MakeShortPath(oFileSys,pathConsolidatedBackup)
if oFileSys.FolderExists(pathConsolidatedBackup) then
Set oLongPath = oFileSys.GetFolder(pathConsolidatedBackup)
MakeShortPath = oLongPath.ShortPath
If Err.Number <> 0 Then
Err.Clear
MakeShortPath = pathConsolidatedBackup
End If
end if
Set oLongPath = Nothing
End Function
Function RemoveSnapshots(oShell, oFileSys, pathVcbVmNamesList, pathMountPoint, pathConsolidatedBackup, serverConsolidatedBackup, pathLogsShort, pathConsolidatedBackupShort)
Dim bReadUnmountDat ,oReadvcbVmNamesList
Dim strReadUmountDatUUID, strReadUUID
ReadUnmountDat = False
Set oReadvcbVmNamesList = oFileSys.OpenTextFile(pathVcbVmNamesList,1,True)
Do While Not oReadvcbVmNamesList.AtEndOfStream
strText = oReadvcbVmNamesList.ReadLine()
If Instr(strText, "moref:vm") > 0 Then
strFileUID = MakeTimeStamp()
strMoRef = strText
strText = oReadvcbVmNamesList.ReadLine()
strFileName = Right(strText,Len(strText)-5)
strFileName = Trim(Replace(strFileName,",", ""))
strFileName = Trim(Replace(strFileName," ", "_"))
strFileName = Trim(Replace(strFileName,":", "_"))
strReadUUID = oReadvcbVmNamesList.ReadLine()
strUUID = Split(strReadUUID,":")
If oFileSys.FolderExists(pathMountPoint & "\" & strFileName & "." & strUUID(1) & "-fullVM") Then
If oFileSys.FileExists(pathMountPoint & "\" & strFileName & "." & strUUID(1) & "-fullVM\unmount.dat") Then
Set oReadUnmountDat = oFileSys.OpenTextFile(pathMountPoint & "\" & strFileName & "." & strUUID(1) & "-fullVM\unmount.dat",1,True)
Do While Not oReadUnmountDat.AtEndOfStream
strReadUmountDatUUID = oReadUnmountDat.ReadLine()
If Instr(strReadUmountDatUUID, strReadUUID) > 0 Then
ReadUnmountDat = True
End If
Loop
oReadUnmountDat.close
If Not ReadUnmountDat Then
Call MakeUnmountDat(oFileSys, pathMountPoint & "\" & strFileName & "." & strUUID(1) & "-fullVM", strUUID(1))
intReturn = oShell.Run("cmd /c """ & pathConsolidatedBackup & "\vcbMounter"" -h " & serverConsolidatedBackup & " -u " & argUsername & " -p " & argPassword & " -U " & pathMountPoint & "\" & strFileName & "." & strUUID(1) & "-fullVM -L 6 >" & pathLogsShort & "\" & strFileName & "_" & strFileUID & "_unmount.txt",0,True)
Else
intReturn = oShell.Run("cmd /c """ & pathConsolidatedBackup & "\vcbMounter"" -h " & serverConsolidatedBackup & " -u " & argUsername & " -p " & argPassword & " -U " & pathMountPoint & "\" & strFileName & "." & strUUID(1) & "-fullVM -L 6 >" & pathLogsShort & "\" & strFileName & "_" & strFileUID & "_unmount.txt",0,True)
End If
Else
Call MakeUnmountDat(oFileSys, pathMountPoint & "\" & strFileName & "." & strUUID(1) & "-fullVM", strUUID(1))
intReturn = oShell.Run("cmd /c """ & pathConsolidatedBackup & "\vcbMounter"" -h " & serverConsolidatedBackup & " -u " & argUsername & " -p " & argPassword & " -U " & pathMountPoint & "\" & strFileName & "." & strUUID(1) & "-fullVM -L 6 >" & pathLogsShort & "\" & strFileName & "_" & strFileUID & "_unmount.txt",0,True)
End If
End If
Call FindRemoveSnapshot(oShell, oFileSys, pathConsolidatedBackup, serverConsolidatedBackup, strMoRef, strFileUID, pathLogs, strFileName, pathLogsShort, pathConsolidatedBackupShort)
End If
Loop
oReadvcbVmNamesList.close
Set oReadUnmountDat = Nothing
Set oReadvcbVmNamesList = Nothing
End Function
Function CreateEvent(oShell, EventState, EventString)
oShell.LogEvent EventState, EventString
'{ERROR|WARNING|INFORMATION|SUCCESSAUDIT|FAILUREAUDIT}
'Select Case EventState
'Case "EVENT_TYPE_SUCCESS"
' EventState = "INFORMATION"
' varEventID = 100
'Case "EVENT_TYPE_ERROR"
' EventState = "ERROR"
' varEventID = 101
'Case "EVENT_TYPE_WARNING"
' EventState = "WARNING"
' varEventID = 102
'End Select
'WScript.Echo "cmd /c ""%windir%\system32\eventcreate /T " & EventState & " /ID " & varEventID & " /L " & "vcbBackup" & " /D " & EventString & """"
'intReturn = oShell.Run("cmd /c ""%windir%\system32\eventcreate /T " & EventState & " /ID " & varEventID & " /L " & "vcbBackup" & " /D " & EventString & """",0,True)
End Function
Function CheckIFSnapShotISSuccess(oFileSys, pathLogs, pathMountPoint, strMessage)
Dim bFoundErr
Set oReadFoundSnapShot = oFileSys.OpenTextFile(pathLogs,1,True)
bFoundErr = False
Do While Not oReadFoundSnapShot.AtEndOfStream
strText = oReadFoundSnapShot.ReadLine()
If Instr(strText, "Successfully exported data to directory " & pathMountPoint) > 0 Then
strText = oReadFoundSnapShot.ReadLine()
If Instr(strText, "Operation completed successfully") > 0 Then
WScript.Echo "Good"
Call CreateEvent(oShell, EVENT_TYPE_SUCCESS, "Operation completed successfully" & Chr(13) & strErrMessage)
End If
End If
If Instr(strText, "Error:") > 0 Then
WScript.Echo "Error"
Call CreateEvent(oShell, EVENT_TYPE_ERROR, "An error occured operation Failed" & Chr(13) & strText & Chr(13) & strErrMessage)
End If
Loop
oReadFoundSnapShot.close
Set oReadFoundSnapShot = Nothing
End Function
Function TimeSpan(dt1, dt2)
If (isDate(dt1) And IsDate(dt2)) = false Then
TimeSpan = "00:00:00"
Exit Function
End If
seconds = Abs(DateDiff("S", dt1, dt2))
minutes = seconds \ 60
hours = minutes \ 60
minutes = minutes mod 60
seconds = seconds mod 60
if len(hours) = 1 then hours = "0" & hours
TimeSpan = hours & ":" & RIGHT("00" & minutes, 2) & ":" & RIGHT("00" & seconds, 2)
End Function
Function CalculateFolderSize(oFileSys, objStartFolder)
If oFileSys.FolderExists(objStartFolder) Then
Set objFolder = oFileSys.GetFolder(objStartFolder)
Set colFiles = objFolder.Files
foldersize = 0
For Each objFile in colFiles
foldersize = foldersize + Int(objFile.Size)
Next
CalculateFolderSize = FormatNumber(foldersize,0)
Exit Function
End If
CalculateFolderSize = "not found"
End Function
[ad#ad-banner]





