Src/Private/Get-AbrVxRailClusterCertificate.ps1

function Get-AbrVxRailClusterCertificate {
    <#
    .SYNOPSIS
    Used by As Built Report to retrieve Dell EMC VxRail trust store certificate information from the VxRail Manager API
    .DESCRIPTION
    Documents the configuration of Dell EMC VxRail Manager in Word/HTML/Text formats using PScribo.
    .NOTES
        Version: 0.1.0
        Author: Tim Carman
        Twitter: @tpcarman
        Github: tpcarman
    .EXAMPLE
    PS C:\> Get-AbrVxRailClusterCertificate
    .LINK
    https://github.com/AsBuiltReport/AsBuiltReport.DellEMC.VxRail
    #>

    [CmdletBinding()]
    param (
    )

    begin {
        $LocalizedData = $reportTranslate.GetAbrVxRailClusterCertificate
        Write-PScriboMessage $LocalizedData.Collecting
    }

    process {
        Try {
            Write-PScriboMessage $LocalizedData.ApiCall
            $VxrCertificates = Get-VxRailApi -Version 1 -Uri '/trust-store/certificates'
            if ($VxrCertificates) {
                Section -Style Heading2 $LocalizedData.Heading {
                    Paragraph ($LocalizedData.Paragraph -f $VxRailMgrHostName)
                    BlankLine
                    $VxrCertificateInfo = foreach ($VxrCertificate in $VxrCertificates) {
                        # Parse the certificate expiration time. The VxRail API returns this in OpenSSL's
                        # ASN1_TIME format (e.g. 'Mar 1 18:38:26 2033 UTC') - note the double space before a
                        # single-digit day, which [DateTime]::Parse cannot handle, hence the explicit format
                        # and whitespace normalization instead of a generic parse.
                        Try {
                            $VxrCertExpirationString = ($VxrCertificate.expiration_time -replace ' UTC$', '') -replace '\s+', ' '
                            $VxrCertExpiration = [DateTime]::ParseExact($VxrCertExpirationString, 'MMM d HH:mm:ss yyyy', [System.Globalization.CultureInfo]::InvariantCulture)
                        } Catch {
                            $VxrCertExpiration = $null
                        }
                        [PSCustomObject]@{
                            $LocalizedData.Name = $VxrCertificate.name
                            $LocalizedData.Status = $TextInfo.ToTitleCase($VxrCertificate.status.ToLower())
                            $LocalizedData.IssuedBy = $VxrCertificate.issued_by
                            $LocalizedData.ExpirationDate = if ($VxrCertExpiration) { $VxrCertExpiration.ToString('dd MMMM yyyy') } else { $VxrCertificate.expiration_time }
                            $LocalizedData.SignatureAlgorithm = $VxrCertificate.signature_algorithm
                            $LocalizedData.Fingerprint = $VxrCertificate.fingerprint
                            'SortExpiration' = $VxrCertExpiration
                        }
                    }
                    if ($Healthcheck.Certificate.Status) {
                        # 'Valid' is the raw VxRail API status value (TitleCased), not an author-controlled
                        # mapping, so it is compared literally rather than via $LocalizedData - the full set
                        # of possible status values (Expired, Revoked, etc.) is not documented.
                        $VxrCertificateInfo | Where-Object { $_.($LocalizedData.Status) -ne 'Valid' } | Set-Style -Style Critical -Property $LocalizedData.Status
                    }
                    if ($Healthcheck.Certificate.ExpiringSoon) {
                        $VxrCertificateInfo | Where-Object { $_.SortExpiration -and ($_.SortExpiration -lt (Get-Date).AddDays(90)) -and ($_.SortExpiration -gt (Get-Date)) } | Set-Style -Style Warning -Property $LocalizedData.ExpirationDate
                    }
                    if ($InfoLevel.Certificate -ge 2) {
                        $TableParams = @{
                            Name = ($LocalizedData.TableName -f $VxRailMgrHostName)
                            Columns = $LocalizedData.Name, $LocalizedData.Status, $LocalizedData.IssuedBy, $LocalizedData.ExpirationDate, $LocalizedData.SignatureAlgorithm, $LocalizedData.Fingerprint
                            ColumnWidths = 14, 9, 20, 12, 15, 30
                        }
                        if ($Report.ShowTableCaptions) {
                            $TableParams['Caption'] = "- $($TableParams.Name)"
                        }
                        $VxrCertificateInfo | Sort-Object $LocalizedData.Name | Table @TableParams
                    } else {
                        $TableParams = @{
                            Name = ($LocalizedData.TableName -f $VxRailMgrHostName)
                            Columns = $LocalizedData.Name, $LocalizedData.Status, $LocalizedData.IssuedBy, $LocalizedData.ExpirationDate
                            ColumnWidths = 25, 15, 30, 30
                        }
                        if ($Report.ShowTableCaptions) {
                            $TableParams['Caption'] = "- $($TableParams.Name)"
                        }
                        $VxrCertificateInfo | Sort-Object $LocalizedData.Name | Table @TableParams
                    }
                }
            }
        } Catch {
            Write-PScriboMessage -IsWarning ($LocalizedData.ErrorMessage -f $_.Exception.Message)
        }
    }

    end {
    }

}