Pages/Dynamic/DisconnectedPage.ps1

#region >> Disconnected Page

$DisconnectedPageContent = {
    param($RemoteHost)

    # Add the SyncHash to the Page so that we can pass output to other pages
    $PUDRSSyncHT = $global:PUDRSSyncHT

    # Load PUDAdminCenter Module Functions Within ScriptBlock
    $ThisModuleFunctionsStringArray | Where-Object {$_ -ne $null} | foreach {Invoke-Expression $_ -ErrorAction SilentlyContinue}

    $ConnectionStatusTableProperties = @("RemoteHost", "Status")

    New-UDRow -Columns {
        New-UDColumn -Size 4 -Content {
            New-UDHeading -Text ""
        }
        New-UDColumn -Size 4 -Content {
            New-UDTable -Headers $ConnectionStatusTableProperties -AutoRefresh -Endpoint {
                [PSCustomObject]@{
                    RemoteHost      = $RemoteHost.ToUpper()
                    Status          = "Disconnected"
                } | Out-UDTableData -Property @("RemoteHost", "Status")
            }
        }
        New-UDColumn -Size 4 -Content {
            New-UDHeading -Text ""
        }
    }

    New-UDRow -Columns {
        New-UDColumn -Size 5 -Content {
            New-UDHeading -Text ""
        }
        New-UDColumn -Size 2 -Content {
            New-UDLink -Text "|| Return Home ||" -Url "/Home"
        }
        New-UDColumn -Size 5 -Content {
            New-UDHeading -Text ""
        }
    }

    New-UDRow -Columns {
        New-UDColumn -Size 12 -Content {
            # Grid below UDTable
            $ResultProperties = @("HostName","FQDN","IPAddress","PingStatus","WSMan","WSManPorts","SSH","DateTime","ManageLink")

            $RHost = $PUDRSSyncHT."$RemoteHost`Info".NetworkInfo

            $GridEndpoint = {
                $GridData = @{}
                $GridData.Add("HostName",$RHost.HostName.ToUpper())
                $GridData.Add("FQDN",$RHost.FQDN)
                $GridData.Add("IPAddress",$RHost.IPAddressList[0])

                # Check Ping
                try {
                    $PingResult =  [System.Net.NetworkInformation.Ping]::new().Send(
                        $RHost.IPAddressList[0],1000
                    ) | Select-Object -Property Address,Status,RoundtripTime -ExcludeProperty PSComputerName,PSShowComputerName,RunspaceId

                    $PingStatus = if ($PingResult.Status.ToString() -eq "Success") {"Available"} else {"Unavailable"}
                    $GridData.Add("PingStatus",$PingStatus)
                }
                catch {
                    $GridData.Add("PingStatus","Unavailable")
                }

                # Check WSMan Ports
                try {
                    $WSMan5985Url = "http://$($RHost.IPAddressList[0])`:5985/wsman"
                    $WSMan5986Url = "http://$($RHost.IPAddressList[0])`:5986/wsman"
                    $WSManUrls = @($WSMan5985Url,$WSMan5986Url)
                    foreach ($WSManUrl in $WSManUrls) {
                        $Request = [System.Net.WebRequest]::Create($WSManUrl)
                        $Request.Timeout = 1000
                        try {
                            [System.Net.WebResponse]$Response = $Request.GetResponse()
                        }
                        catch {
                            if ($_.Exception.Message -match "The remote server returned an error: \(405\) Method Not Allowed") {
                                if ($WSManUrl -match "5985") {
                                    $WSMan5985Available = $True
                                }
                                else {
                                    $WSMan5986Available = $True
                                }
                            }
                            elseif ($_.Exception.Message -match "The operation has timed out") {
                                if ($WSManUrl -match "5985") {
                                    $WSMan5985Available = $False
                                }
                                else {
                                    $WSMan5986Available = $False
                                }
                            }
                            else {
                                if ($WSManUrl -match "5985") {
                                    $WSMan5985Available = $False
                                }
                                else {
                                    $WSMan5986Available = $False
                                }
                            }
                        }
                    }

                    if ($WSMan5985Available -or $WSMan5986Available) {
                        $GridData.Add("WSMan","Available")

                        [System.Collections.ArrayList]$WSManPorts = @()
                        if ($WSMan5985Available) {
                            $null = $WSManPorts.Add("5985")
                        }
                        if ($WSMan5986Available) {
                            $null = $WSManPorts.Add("5986")
                        }

                        $WSManPortsString = $WSManPorts -join ', '
                        $GridData.Add("WSManPorts",$WSManPortsString)
                    }
                }
                catch {
                    $GridData.Add("WSMan","Unavailable")
                }

                # Check SSH
                try {
                    $TestSSHResult = TestPort -HostName $RHost.IPAddressList[0] -Port 22

                    if ($TestSSHResult.Open) {
                        $GridData.Add("SSH","Available")
                    }
                    else {
                        $GridData.Add("SSH","Unavailable")
                    }
                }
                catch {
                    $GridData.Add("SSH","Unavailable")
                }

                $GridData.Add("DateTime",$(Get-Date -Format MM-dd-yy_hh:mm:sstt))

                if ($GridData.WSMan -eq "Available" -or $GridData.SSH -eq "Available") {
                    if ($PUDRSSyncHT."$($RHost.HostName)`Info".PSRemotingCreds -ne $null) {
                        $GridData.Add("ManageLink",$(New-UDLink -Text "Manage" -Url "/ToolSelect/$($RHost.HostName)"))
                    }
                    else {
                        $GridData.Add("ManageLink",$(New-UDLink -Text "Manage" -Url "/PSRemotingCreds/$($RHost.HostName)"))
                    }
                }
                else {
                    $GridData.Add("ManageLink","Unavailable")
                }
                
                [pscustomobject]$GridData | Out-UDGridData
            }

            $NewUdGridSplatParams = @{
                Headers         = $ResultProperties 
                NoPaging        = $True
                Properties      = $ResultProperties
                AutoRefresh     = $True
                RefreshInterval = 5
                Endpoint        = $GridEndpoint
            }
            New-UdGrid @NewUdGridSplatParams
        }
    }
}
$Page = New-UDPage -Url "/Disconnected/:RemoteHost" -Endpoint $DisconnectedPageContent
$null = $Pages.Add($Page)
# We need this page as a string for later on. For some reason, we can't use this same ScriptBlock directly on other Pages
$DisconnectedPageContentString = $DisconnectedPageContent.ToString()

#endregion >> Disconnected Page