Public/Test-CWAAPort.ps1


function Test-CWAAPort {
    [CmdletBinding()]
    [Alias('Test-LTPorts')]
    Param(
        [Parameter(ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $True)]
        [string[]]$Server,
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [int]$TrayPort,
        [Parameter(ValueFromPipelineByPropertyName = $true)]
        [switch]$Quiet
    )

    Begin {
        $Mediator = 'mediator.labtechsoftware.com'
        function Private:TestPort {
            Param(
                [parameter(Position = 0)]
                [string]
                $ComputerName,

                [parameter(Mandatory = $False)]
                [System.Net.IPAddress]
                $IPAddress,

                [parameter(Mandatory = $True , Position = 1)]
                [int]
                $Port
            )

            $RemoteServer = if ([string]::IsNullOrEmpty($ComputerName)) { $IPAddress } else { $ComputerName };
            if ([string]::IsNullOrEmpty($RemoteServer)) { Write-Error "ERROR: Line $(LINENUM): No ComputerName or IPAddress was provided to test."; return }

            $test = New-Object System.Net.Sockets.TcpClient;
            Try {
                Write-Output "Connecting to $($RemoteServer):$Port (TCP)..";
                $test.Connect($RemoteServer, $Port);
                Write-Output 'Connection successful';
            }
            Catch {
                Write-Output 'ERROR: Connection failed';
                $Global:PortTestError = 1
            }
            Finally {
                $test.Close();
            }

        }

        Clear-Variable CleanSvr, svr, proc, processes, port, netstat, line -EA 0 -WhatIf:$False -Confirm:$False #Clearing Variables for use
        Write-Debug "Starting $($myInvocation.InvocationName) at line $(LINENUM)"

    }

    Process {
        if (-not ($Server) -and (-not ($TrayPort) -or -not ($Quiet))) {
            Write-Verbose 'No Server Input - Checking for names.'
            $Server = Get-CWAAInfo -EA 0 -Verbose:$False -WhatIf:$False -Confirm:$False -Debug:$False | Select-Object -Expand 'Server' -EA 0
            if (-not ($Server)) {
                Write-Verbose 'No Server found in installed Service Info. Checking for Service Backup.'
                $Server = Get-CWAAInfoBackup -EA 0 -Verbose:$False | Select-Object -Expand 'Server' -EA 0
            }
        }

        if (-not ($Quiet) -or (($TrayPort) -ge 1 -and ($TrayPort) -le 65530)) {
            if (-not ($TrayPort) -or -not (($TrayPort) -ge 1 -and ($TrayPort) -le 65530)) {
                #Learn LTTrayPort if available.
                $TrayPort = (Get-CWAAInfo -EA 0 -Verbose:$False -WhatIf:$False -Confirm:$False -Debug:$False | Select-Object -Expand TrayPort -EA 0)
            }
            if (-not ($TrayPort) -or $TrayPort -notmatch '^\d+$') { $TrayPort = 42000 }

            [array]$processes = @()
            #Get all processes that are using LTTrayPort (Default 42000)
            Try { $netstat = & "$env:windir\system32\netstat.exe" -a -o -n | Select-String -Pattern " .*[0-9\.]+:$($TrayPort).*[0-9\.]+:[0-9]+ .*?([0-9]+)" -EA 0 }
            Catch { Write-Output 'Error calling netstat.exe.'; $netstat = $null }
            Foreach ($line In $netstat) {
                $processes += ($line -split ' {4,}')[-1]
            }
            $processes = $processes | Where-Object { $_ -gt 0 -and $_ -match '^\d+$' } | Sort-Object | Get-Unique
            if (($processes)) {
                if (-not ($Quiet)) {
                    Foreach ($proc In $processes) {
                        if ((Get-Process -Id $proc -EA 0 | Select-Object -Expand ProcessName -EA 0) -eq 'LTSvc') {
                            Write-Output "TrayPort Port $TrayPort is being used by LTSvc."
                        }
                        else {
                            Write-Output "Error: TrayPort Port $TrayPort is being used by $(Get-Process -Id $proc|Select-Object -Expand ProcessName -EA 0)."
                        }
                    }
                }
                else { return $False }
            }
            Elseif (($Quiet) -eq $True) {
                return $True
            }
            else {
                Write-Output "TrayPort Port $TrayPort is available."
            }
        }

        foreach ($svr in $Server) {
            if ($Quiet) {
                $CleanSvr = ($Svr -replace 'https?://', '' | ForEach-Object { $_.Trim() })
                Test-Connection $CleanSvr -Quiet
                return
            }

            if ($Svr -match '^(https?://)?(([12]?[0-9]{1,2}\.){3}[12]?[0-9]{1,2}|[a-z0-9][a-z0-9_-]*(\.[a-z0-9][a-z0-9_-]*)*)$') {
                Try {
                    $CleanSvr = ($Svr -replace 'https?://', '' | ForEach-Object { $_.Trim() })
                    Write-Output 'Testing connectivity to required TCP ports:'
                    TestPort -ComputerName $CleanSvr -Port 70
                    TestPort -ComputerName $CleanSvr -Port 80
                    TestPort -ComputerName $CleanSvr -Port 443
                    TestPort -ComputerName $Mediator -Port 8002

                }

                Catch {
                    Write-Error "ERROR: Line $(LINENUM): There was an error testing the ports. $($Error[0])" -ErrorAction Stop
                }
            }
            else {
                Write-Warning "WARNING: Line $(LINENUM): Server address $($Svr) is not a valid address or is not formatted correctly. Example: https://automate.domain.com"
            }
        }
    }

    End {
        if ($?) {
            if (-not ($Quiet)) {
                Write-Output 'Test-CWAAPorts Finished'
            }
        }
        Else { $Error[0] }
        Write-Debug "Exiting $($myInvocation.InvocationName) at line $(LINENUM)"
    }
}