Src/Private/Report/Get-AbrAzDnsForwardingRuleset.ps1

function Get-AbrAzDnsForwardingRuleset {
    <#
    .SYNOPSIS
        Used by As Built Report to retrieve Azure DNS Forwarding Ruleset information
    .DESCRIPTION
        Documents the configuration of Azure DNS Forwarding Rulesets, including forwarding rules
        with target DNS servers and virtual network link associations.
    .NOTES
        Version: 0.1.0
        Author: Tim Carman
        Twitter: @tpcarman
        Github: tpcarman
    .EXAMPLE
 
    .LINK
 
    #>

    [CmdletBinding()]
    param ()

    begin {
        $LocalizedData = $reportTranslate.GetAbrAzDnsForwardingRuleset
        Write-PScriboMessage ($LocalizedData.InfoLevel -f $InfoLevel.DnsForwardingRuleset)
    }

    process {
        try {
            if ($InfoLevel.DnsForwardingRuleset -ge 1) {
                $AzDnsForwardingRulesets = Get-AzDnsForwardingRuleset -ErrorAction SilentlyContinue | Sort-Object Name
                if ($AzDnsForwardingRulesets) {
                    Write-PScriboMessage $LocalizedData.Collecting

                    # Pre-collect forwarding rules and VNet links per ruleset
                    $ForwardingRulesMap = @{}
                    $VNetLinksMap = @{}
                    foreach ($AzRuleset in $AzDnsForwardingRulesets) {
                        $RG = ($AzRuleset.Id).split('/')[4]
                        $ForwardingRulesMap[$AzRuleset.Name] = Get-AzDnsForwardingRule -DnsForwardingRulesetName $AzRuleset.Name -ResourceGroupName $RG -ErrorAction SilentlyContinue
                        $VNetLinksMap[$AzRuleset.Name] = Get-AzDnsForwardingRulesetVirtualNetworkLink -DnsForwardingRulesetName $AzRuleset.Name -ResourceGroupName $RG -ErrorAction SilentlyContinue
                    }

                    Section -Style Heading4 $LocalizedData.Heading {
                        if ($Options.ShowSectionInfo) {
                            Paragraph $LocalizedData.SectionInfo
                            BlankLine
                        }

                        $AzRulesetInfo = @()
                        foreach ($AzRuleset in $AzDnsForwardingRulesets) {
                            $RuleCount = if ($ForwardingRulesMap[$AzRuleset.Name]) { @($ForwardingRulesMap[$AzRuleset.Name]).Count } else { 0 }
                            $LinkCount = if ($VNetLinksMap[$AzRuleset.Name]) { @($VNetLinksMap[$AzRuleset.Name]).Count } else { 0 }
                            $OutboundEndpoints = if ($AzRuleset.DnsResolverOutboundEndpoint -and $AzRuleset.DnsResolverOutboundEndpoint.Count -gt 0) {
                                ($AzRuleset.DnsResolverOutboundEndpoint | ForEach-Object { $_.Id.split('/')[-1] }) -join [Environment]::NewLine
                            } else {
                                $LocalizedData.None
                            }
                            $InObj = [Ordered]@{
                                $LocalizedData.Name                = $AzRuleset.Name
                                $LocalizedData.ResourceGroup       = ($AzRuleset.Id).split('/')[4]
                                $LocalizedData.Location            = $AzLocationLookup."$($AzRuleset.Location)"
                                $LocalizedData.Subscription        = "$($AzSubscriptionLookup.(($AzRuleset.Id).split('/')[2]))"
                                $LocalizedData.SubscriptionID      = ($AzRuleset.Id).split('/')[2]
                                $LocalizedData.ForwardingRules     = $RuleCount
                                $LocalizedData.VirtualNetworkLinks = $LinkCount
                                $LocalizedData.OutboundEndpoints   = $OutboundEndpoints
                                $LocalizedData.ProvisioningState   = $AzRuleset.ProvisioningState
                            }

                            if ($Options.ShowTags) {
                                $InObj[$LocalizedData.Tags] = if ($null -eq $AzRuleset.Tag -or $AzRuleset.Tag.Count -eq 0) {
                                    $LocalizedData.None
                                } else {
                                    ($AzRuleset.Tag.Keys | ForEach-Object { "$_`:`t$($AzRuleset.Tag.AdditionalProperties[$_])" }) -join [Environment]::NewLine
                                }
                            }

                            $AzRulesetInfo += [PSCustomObject]$InObj
                        }

                        if ($Healthcheck.DnsForwardingRuleset.ProvisioningState) {
                            $AzRulesetInfo | Where-Object { $_.$($LocalizedData.ProvisioningState) -ne 'Succeeded' } | Set-Style -Style Critical -Property $LocalizedData.ProvisioningState
                        }

                        if ($InfoLevel.DnsForwardingRuleset -ge 2) {
                            Paragraph ($LocalizedData.ParagraphDetail -f $AzSubscription.Name)
                            foreach ($AzRulesetItem in $AzRulesetInfo) {
                                $RulesetName = $AzRulesetItem.($LocalizedData.Name)
                                Section -Style NOTOCHeading5 -ExcludeFromTOC $RulesetName {
                                    $TableParams = @{
                                        Name         = "$($LocalizedData.TableHeading) - $RulesetName"
                                        List         = $true
                                        ColumnWidths = 40, 60
                                    }
                                    if ($Report.ShowTableCaptions) {
                                        $TableParams['Caption'] = "- $($TableParams.Name)"
                                    }
                                    $AzRulesetItem | Table @TableParams

                                    # Forwarding Rules sub-section
                                    $Rules = $ForwardingRulesMap[$RulesetName]
                                    if ($Rules) {
                                        Section -Style NOTOCHeading6 -ExcludeFromTOC $LocalizedData.ForwardingRulesHeading {
                                            $RuleInfo = @()
                                            foreach ($Rule in $Rules) {
                                                $TargetServers = if ($Rule.TargetDnsServer -and $Rule.TargetDnsServer.Count -gt 0) {
                                                    ($Rule.TargetDnsServer | ForEach-Object { "$($_.IPAddress):$($_.Port)" }) -join [Environment]::NewLine
                                                } else {
                                                    $LocalizedData.None
                                                }
                                                $InObj = [Ordered]@{
                                                    $LocalizedData.RuleName       = $Rule.Name
                                                    $LocalizedData.DomainName     = $Rule.DomainName
                                                    $LocalizedData.TargetServers  = $TargetServers
                                                    $LocalizedData.RuleState      = $Rule.DnsForwardingRuleState
                                                    $LocalizedData.ProvisioningState = $Rule.ProvisioningState
                                                }
                                                $RuleInfo += [PSCustomObject]$InObj
                                            }

                                            if ($Healthcheck.DnsForwardingRuleset.ForwardingRuleState) {
                                                $RuleInfo | Where-Object { $_.$($LocalizedData.RuleState) -ne 'Enabled' } | Set-Style -Style Warning -Property $LocalizedData.RuleState
                                            }

                                            $TableParams = @{
                                                Name         = "$($LocalizedData.ForwardingRulesHeading) - $RulesetName"
                                                List         = $false
                                                ColumnWidths = 20, 30, 30, 10, 10
                                            }
                                            if ($Report.ShowTableCaptions) {
                                                $TableParams['Caption'] = "- $($TableParams.Name)"
                                            }
                                            $RuleInfo | Table @TableParams
                                        }
                                    }

                                    # Virtual Network Links sub-section
                                    $VNetLinks = $VNetLinksMap[$RulesetName]
                                    if ($VNetLinks) {
                                        Section -Style NOTOCHeading6 -ExcludeFromTOC $LocalizedData.VNetLinksHeading {
                                            $LinkInfo = @()
                                            foreach ($Link in $VNetLinks) {
                                                $InObj = [Ordered]@{
                                                    $LocalizedData.LinkName        = $Link.Name
                                                    $LocalizedData.VirtualNetwork  = $Link.VirtualNetworkId.split('/')[-1]
                                                    $LocalizedData.ProvisioningState = $Link.ProvisioningState
                                                }
                                                $LinkInfo += [PSCustomObject]$InObj
                                            }

                                            $TableParams = @{
                                                Name         = "$($LocalizedData.VNetLinksHeading) - $RulesetName"
                                                List         = $false
                                                ColumnWidths = 30, 50, 20
                                            }
                                            if ($Report.ShowTableCaptions) {
                                                $TableParams['Caption'] = "- $($TableParams.Name)"
                                            }
                                            $LinkInfo | Table @TableParams
                                        }
                                    }
                                }
                            }
                        } else {
                            Paragraph ($LocalizedData.ParagraphSummary -f $AzSubscription.Name)
                            BlankLine
                            $TableParams = @{
                                Name         = "$($LocalizedData.TableHeading) - $($AzSubscription.Name)"
                                List         = $false
                                Columns      = $LocalizedData.Name, $LocalizedData.Location, $LocalizedData.ForwardingRules, $LocalizedData.VirtualNetworkLinks, $LocalizedData.OutboundEndpoints, $LocalizedData.ProvisioningState
                                ColumnWidths = 20, 15, 15, 15, 20, 15
                            }
                            if ($Report.ShowTableCaptions) {
                                $TableParams['Caption'] = "- $($TableParams.Name)"
                            }
                            $AzRulesetInfo | Table @TableParams
                        }
                    }
                }
            }
        } catch {
            Write-PScriboMessage -IsWarning "$($LocalizedData.ErrorMessage) $($_.Exception.Message)"
        }
    }

    end {}
}