Src/Private/Report/Get-AbrVbrTapeMediaPool.ps1
|
function Get-AbrVbrTapeMediaPool { <# .SYNOPSIS Used by As Built Report to retrieve Veeam Tape Media Pools Information .DESCRIPTION Documents the configuration of Veeam VBR in Word/HTML/Text formats using PScribo. .NOTES Version: 1.0.0 Author: Jonathan Colon Twitter: @jcolonfzenpr Github: rebelinux Credits: Iain Brighton (@iainbrighton) - PScribo module .LINK https://github.com/AsBuiltReport/AsBuiltReport.Veeam.VBR #> [CmdletBinding()] param ( ) begin { Write-PScriboMessage "Discovering Veeam VBR Tape Media Pools information from $System." $LocalizedData = $reportTranslate.GetAbrVbrTapeMediaPool Show-AbrDebugExecutionTime -Start -TitleMessage 'Tape Media Pools' } process { try { if ($PoolObjs = Get-VBRTapeMediaPool) { #---------------------------------------------------------------------------------------------# # Tape Media Pools Section # #---------------------------------------------------------------------------------------------# Section -Style Heading3 $LocalizedData.Heading { Paragraph $LocalizedData.Paragraph BlankLine $OutObj = @() try { foreach ($PoolObj in $PoolObjs) { try { if ($PoolObj.Type -ne 'Custom') { $Capacity = ((Get-VBRTapeMedium -MediaPool $PoolObj.Name).Capacity | Measure-Object -Sum).Sum $FreeSpace = ((Get-VBRTapeMedium -MediaPool $PoolObj.Name).Free | Measure-Object -Sum).Sum } else { $Capacity = $PoolObj.Capacity $FreeSpace = $PoolObj.FreeSpace } $inObj = [ordered] @{ $LocalizedData.Name = $PoolObj.Name $LocalizedData.Type = $PoolObj.Type $LocalizedData.TapeCount = ((Get-VBRTapeMediaPool -Id $PoolObj.Id).Medium).count $LocalizedData.TotalSpace = ConvertTo-FileSizeString -RoundUnits $Options.RoundUnits -Size $Capacity $LocalizedData.FreeSpace = ConvertTo-FileSizeString -RoundUnits $Options.RoundUnits -Size $FreeSpace $LocalizedData.TapeLibrary = ($PoolObj.GlobalOptions.LibraryId | ForEach-Object { Get-VBRTapeLibrary -Id $_ }).Name } $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj) } catch { Write-PScriboMessage -IsWarning "Tape Media Pools $($PoolObj.Name) Table: $($_.Exception.Message)" } } $TableParams = @{ Name = "$($LocalizedData.TableHeading) - $VeeamBackupServer" List = $false ColumnWidths = 24, 15, 12, 12, 12, 25 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property 'Name' | Table @TableParams } catch { Write-PScriboMessage -IsWarning "Tape Media Pools Section: $($_.Exception.Message)" } } #---------------------------------------------------------------------------------------------# # Tape Media Pools Configuration Section # #---------------------------------------------------------------------------------------------# Write-PScriboMessage ($LocalizedData.InfoLevel -f $InfoLevel.Tape.MediaPool) if ($InfoLevel.Tape.MediaPool -ge 2) { Write-PScriboMessage $LocalizedData.DiscoveringPerPool if ($PoolObjs) { Section -Style Heading3 $LocalizedData.ConfigHeading { foreach ($PoolObj in ($PoolObjs | Where-Object { $_.Type -eq 'Gfs' -or $_.Type -eq 'Custom' } | Sort-Object -Property 'Name')) { Write-PScriboMessage ($LocalizedData.DiscoveringPool -f $PoolObj.Name) #---------------------------------------------------------------------------------------------# # Tape Media Pools - Tape Library Sub-Section # #---------------------------------------------------------------------------------------------# Section -Style Heading4 $PoolObj.Name { try { Section -ExcludeFromTOC -Style NOTOCHeading5 $LocalizedData.TapeLibrarySection { Write-PScriboMessage ($LocalizedData.DiscoveringTapeLibrary -f $PoolObj.Name) $OutObj = @() foreach ($TapeLibrary in $PoolObj.GlobalOptions.LibraryId) { try { if ($TapeLibraryObj = Get-VBRTapeLibrary -Id $TapeLibrary.Guid) { if ($PoolObj.Type -ne 'Custom') { $Capacity = ((Get-VBRTapeMedium -MediaPool $PoolObj.Id | Where-Object { $_.LibraryId -eq $TapeLibrary.Guid }).Capacity | Measure-Object -Sum).Sum $FreeSpace = ((Get-VBRTapeMedium -MediaPool $PoolObj.Id | Where-Object { $_.LibraryId -eq $TapeLibrary.Guid }).Free | Measure-Object -Sum).Sum } else { $Capacity = $PoolObj.Capacity $FreeSpace = $PoolObj.FreeSpace } $TapeDrives = @() foreach ($Drive in $TapeLibraryObj.Drives) { $TapeDrives += "$($LocalizedData.Drive) $($Drive.Address + 1)" } $inObj = [ordered] @{ $LocalizedData.LibraryName = $TapeLibraryObj.Name $LocalizedData.LibraryId = $TapeLibraryObj.Id $LocalizedData.Type = $TapeLibraryObj.Type $LocalizedData.State = $TapeLibraryObj.State $LocalizedData.Model = $TapeLibraryObj.Model $LocalizedData.Drives = $TapeDrives -join ', ' $LocalizedData.Slots = $TapeLibraryObj.Slots $LocalizedData.TapeCount = ((Get-VBRTapeMediaPool -Id $PoolObj.Id).Medium).count $LocalizedData.TotalSpace = ConvertTo-FileSizeString -RoundUnits $Options.RoundUnits -Size $Capacity $LocalizedData.FreeSpace = ConvertTo-FileSizeString -RoundUnits $Options.RoundUnits -Size $FreeSpace $LocalizedData.AddTapeFromFreePool = $PoolObj.MoveFromFreePool $LocalizedData.Description = switch ([string]::IsNullOrEmpty($TapeLibraryObj.Description)) { $true { '--' } $false { $TapeLibraryObj.Description } default { $LocalizedData.Unknown } } $LocalizedData.LibraryMode = switch ($PoolObj.GlobalOptions.Mode) { 'CrossLibraryParalleing' { $LocalizedData.ActiveAlways } 'Failover' { $LocalizedData.PassiveFailover } } } if ($PoolObj.GlobalOptions.Mode -eq 'Failover') { $inObj.add($LocalizedData.WhenActiveOffline, ($PoolObj.GlobalOptions.NextLibOffline)) $inObj.add($LocalizedData.WhenActiveNoMedia, ($PoolObj.GlobalOptions.NextLibNoMedia)) } if (($PoolObj.GlobalOptions.LibraryId).count -eq 1) { $inObj.Remove($LocalizedData.LibraryMode) $inObj.Remove($LocalizedData.WhenActiveOffline) $inObj.Remove($LocalizedData.WhenActiveNoMedia) $inObj.add($LocalizedData.LibraryMode, $LocalizedData.ActiveAlways) } $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj) if ($HealthCheck.Tape.BestPractice) { $OutObj | Where-Object { $_.$($LocalizedData.Description) -eq '--' } | Set-Style -Style Warning -Property $LocalizedData.Description $OutObj | Where-Object { $_.$($LocalizedData.Description) -match 'Created by' } | Set-Style -Style Warning -Property $LocalizedData.Description } $TableParams = @{ Name = "$($LocalizedData.TapeLibrarySection) - $($PoolObj.Name)" List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property 'Name' | Table @TableParams if ($HealthCheck.Tape.BestPractice) { if ($OutObj | Where-Object { $_.$($LocalizedData.Description) -match 'Created by' -or $_.$($LocalizedData.Description) -eq '--' }) { Paragraph $LocalizedData.HealthCheck -Bold -Underline BlankLine Paragraph { Text $LocalizedData.BestPractice -Bold Text $LocalizedData.BestPracticeDesc } BlankLine } } #---------------------------------------------------------------------------------------------# # Tape Media Pools - Tape Medium Sub-Section # #---------------------------------------------------------------------------------------------# try { if ($TapeMediums = Get-VBRTapeMedium -MediaPool $PoolObj.Id | Where-Object { $_.LibraryId -eq $TapeLibraryObj.Id }) { Section -ExcludeFromTOC -Style NOTOCHeading6 $LocalizedData.TapeMediums { $OutObj = @() if ($TapeMediums) { foreach ($TapeMedium in $TapeMediums) { try { $inObj = [ordered] @{ $LocalizedData.Name = $TapeMedium.Name $LocalizedData.IsWorm = $TapeMedium.IsWorm $LocalizedData.TotalSpace = ConvertTo-FileSizeString -RoundUnits $Options.RoundUnits -Size $TapeMedium.Capacity $LocalizedData.FreeSpace = ConvertTo-FileSizeString -RoundUnits $Options.RoundUnits -Size $TapeMedium.Free $LocalizedData.TapeLibrary = switch ($TapeMedium.LibraryId) { $Null { '--' } '00000000-0000-0000-0000-000000000000' { $LocalizedData.Unknown } default { (Get-VBRTapeLibrary -Id $TapeMedium.LibraryId).Name } } } $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj) } catch { Write-PScriboMessage -IsWarning "Tape Medium $($TapeMedium.Name) Table: $($_.Exception.Message)" } } $TableParams = @{ Name = "$($LocalizedData.TapeMediums) - $($TapeLibraryObj.Name)" List = $false ColumnWidths = 20, 20, 20, 20, 20 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property 'Name' | Table @TableParams } } } } catch { Write-PScriboMessage -IsWarning "Tape Medium Section: $($_.Exception.Message)" } } } catch { Write-PScriboMessage -IsWarning "Tape Library $($TapeLibraryObj.Name) Section: $($_.Exception.Message)" } } } } catch { Write-PScriboMessage -IsWarning "Tape Media Pool Configration Section: $($_.Exception.Message)" } #---------------------------------------------------------------------------------------------# # Tape Media Pools - Tape Media Set Sub-Section # #---------------------------------------------------------------------------------------------# try { if ($PoolObj.MediaSetName) { Section -ExcludeFromTOC -Style NOTOCHeading5 $LocalizedData.MediaSetSection { $OutObj = @() $inObj = [ordered] @{ $LocalizedData.Name = $PoolObj.MediaSetName $LocalizedData.AutoCreateMediaSet = switch ($PoolObj.MediaSetCreationPolicy.Type) { 'Never' { $LocalizedData.NeverCreateMediaSet } 'Always' { $LocalizedData.AlwaysCreateMediaSet } 'Daily' { switch ($PoolObj.MediaSetCreationPolicy.DailyOptions.Type) { 'Everyday' { $LocalizedData.DailyEveryDay -f $PoolObj.MediaSetCreationPolicy.DailyOptions.Period.ToString() } 'SelectedDays' { $LocalizedData.DailySelectedDays -f $PoolObj.MediaSetCreationPolicy.DailyOptions.Period.ToString(), $PoolObj.MediaSetCreationPolicy.DailyOptions.DayOfWeek } default { $LocalizedData.Unknown } } } default { $LocalizedData.Unknown } } } $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj) $TableParams = @{ Name = "$($LocalizedData.MediaSetTable) - $($PoolObj.Name)" List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property 'Name' | Table @TableParams } } if ($PoolObj.DailyMediaSetOptions) { $MediaSetOptions = @('DailyMediaSetOptions', 'WeeklyMediaSetOptions', 'MonthlyMediaSetOptions', 'QuarterlyMediaSetOptions', 'YearlyMediaSetOptions') Section -ExcludeFromTOC -Style NOTOCHeading5 $LocalizedData.GfsMediaSetSection { foreach ($MediaSetOption in $MediaSetOptions) { $SectionTitle = ($MediaSetOption -creplace '([A-Z\W_]|\d+)(?<![a-z])', ' $&').trim() Section -ExcludeFromTOC -Style NOTOCHeading6 $SectionTitle { $OutObj = @() $inObj = [ordered] @{ $LocalizedData.OverrideProtectionPeriod = $PoolObj.$MediaSetOption.OverwritePeriod $LocalizedData.MediumColumn = $PoolObj.$MediaSetOption.MediaSetPolicy.Medium.Name -join ', ' $LocalizedData.MediaSetName = $PoolObj.$MediaSetOption.MediaSetPolicy.Name $LocalizedData.AddTapesAutomatically = $PoolObj.$MediaSetOption.MediaSetPolicy.MoveFromMediaPoolAutomatically $LocalizedData.AppendBackupFiles = $PoolObj.$MediaSetOption.MediaSetPolicy.AppendToCurrentTape } if ($PoolObj.$MediaSetOption.MediaSetPolicy.MoveOfflineToVault) { $inObj.add($LocalizedData.MoveOfflineTapeVault, ($PoolObj.$MediaSetOption.MediaSetPolicy.MoveOfflineToVault)) $inObj.add($LocalizedData.Vault, $PoolObj.$MediaSetOption.MediaSetPolicy.Vault) } $OutObj = [pscustomobject](ConvertTo-HashToYN $inObj) $TableParams = @{ Name = "$($LocalizedData.GfsMediaSetTable) - $($SectionTitle)" List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Table @TableParams } } } } } catch { Write-PScriboMessage -IsWarning "Tape Media Set $($PoolObj.MediaSetName) Section - $($_.Exception.Message)" } #---------------------------------------------------------------------------------------------# # Tape Media Pools - Retention Sub-Section # #---------------------------------------------------------------------------------------------# if ($PoolObj.Type -eq 'Custom') { try { Section -ExcludeFromTOC -Style NOTOCHeading5 $LocalizedData.RetentionSection { $OutObj = @() $inObj = [ordered] @{ $LocalizedData.DataRetentionPolicy = switch ($PoolObj.RetentionPolicy.Type) { 'Never' { $LocalizedData.NeverOverwriteData } 'Cyclic' { $LocalizedData.DoNotProtectData } 'Period' { $LocalizedData.ProtectDataFor -f $PoolObj.RetentionPolicy.Value, $PoolObj.RetentionPolicy.Period } default { $LocalizedData.Unknown } } $LocalizedData.OfflineMediaTracking = $PoolObj.MoveOfflineToVault } if ($PoolObj.MoveOfflineToVault) { $inobj.add($LocalizedData.MoveOfflineTapeMediaVault, $PoolObj.Vault) } $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj) $TableParams = @{ Name = "$($LocalizedData.MediaSetTable) - $($PoolObj.Name)" List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property 'Name' | Table @TableParams } } catch { Write-PScriboMessage -IsWarning "Tape Media Set $($PoolObj.Name) Retention Section: $($_.Exception.Message)" } } #---------------------------------------------------------------------------------------------# # Tape Media Pools - Options Sub-Section # #---------------------------------------------------------------------------------------------# try { Section -ExcludeFromTOC -Style NOTOCHeading5 $LocalizedData.OptionsSection { $OutObj = @() $inObj = [ordered] @{ $LocalizedData.EnableParallelProcessing = $PoolObj.MultiStreamingOptions.Enabled $LocalizedData.JobsPointedToPool = $LocalizedData.TapeDrivesSimultaneously -f $PoolObj.MultiStreamingOptions.NumberOfStreams $LocalizedData.EnableParallelChains = $PoolObj.MultiStreamingOptions.SplitJobFilesBetweenDrives $LocalizedData.UseEncryption = $PoolObj.EncryptionOptions.Enabled } if ($PoolObj.EncryptionOptions.Enabled) { $inobj.add($LocalizedData.EncryptionPassword, (Get-VBREncryptionKey | Where-Object { $_.Id -eq $PoolObj.EncryptionOptions.Key.Id }).Description) } $OutObj += [pscustomobject](ConvertTo-HashToYN $inObj) $TableParams = @{ Name = "$($LocalizedData.MediaSetTable) - $($PoolObj.Name)" List = $true ColumnWidths = 40, 60 } if ($Report.ShowTableCaptions) { $TableParams['Caption'] = "- $($TableParams.Name)" } $OutObj | Sort-Object -Property 'Name' | Table @TableParams } } catch { Write-PScriboMessage -IsWarning "Tape Media Set $($PoolObj.Name) Options Section: $($_.Exception.Message)" } } } } } } } } catch { Write-PScriboMessage -IsWarning "Tape Media Pools Section: $($_.Exception.Message)" } } end { Show-AbrDebugExecutionTime -End -TitleMessage 'Tape Media Pools' } } |