zvm_netdiag_scripts_utils.ps1


function Invoke-ZvmaNetDiagnostics { #TODO extract to separate file scripts_utils_network_diagnostics.ps1
    <#
    .SYNOPSIS
        Performs network connectivity diagnostics for ZVMA
    #>

    param(
        [ValidateNotNullOrEmpty()]
        [string]$TargetUri
    )
    Write-Host "Starting $($MyInvocation.MyCommand)..."

    Write-Host "### Executing connectivity diagnostics for '$TargetUri'"
    try {
        $uri = [System.Uri]$TargetUri
        $hostname = $uri.Host

        Write-Host "## DNS lookup result:`n$(Invoke-ZvmaNsLookup -TargetHost $hostname)"
        Write-Host "## DNS dig lookup result:`n$(Invoke-ZvmaDigLookup -TargetHost $hostname)"

        Write-Host "## Network traceroute result:`n$(Invoke-ZvmaTraceroute -TargetHost $hostname)"
        Write-Host "## TCP netcat connectivity test result:`n$(Invoke-ZvmaNetcat -TargetHost $hostname)"

        Write-Host "## TLS connectivity test result:`n$(Invoke-ZvmaOpenSslCheck -TargetHost $hostname)"
        Write-Host "## HTTP connectivity test result:`n$(Invoke-ZvmaCurl -TargetHost $TargetUri)"

        #TODO vra connectivity test nc 10.180.195.203 4001-4009 -zv -w 3, and ESXi connectivity tests 33072-33073
    }
    catch {
        throw "Failed to run connectivity diagnostics. Problem: $_"
    }
}

function Invoke-ZvmaNsLookup {
    <#
    .SYNOPSIS
        Executes nslookup command on the ZVMA to test DNS resolution
    #>

    param (
        [ValidateNotNullOrEmpty()]
        [string]$TargetHost
    )
    Write-Host "Starting $($MyInvocation.MyCommand)..."
    return Invoke-ZvmaNetDiagnosticCommand -Command "nslookup" -TargetHost $TargetHost -CommandDescription "DNS lookup"
}

function Invoke-ZvmaDigLookup {
    <#
    .SYNOPSIS
        Executes dig command on the ZVMA for DNS resolution and detailed diagnostics
    #>

    param (
        [ValidateNotNullOrEmpty()]
        [string]$TargetHost
    )
    Write-Host "Starting $($MyInvocation.MyCommand)..."
    return Invoke-ZvmaNetDiagnosticCommand -Command "dig" -TargetHost $TargetHost -CommandDescription "DNS dig lookup"
}

function Invoke-ZvmaTraceroute {
    <#
    .SYNOPSIS
        Executes traceroute command on the ZVMA to trace network path
    #>

    param (
        [ValidateNotNullOrEmpty()]
        [string]$TargetHost,

        [bool]$UseTcp = $true,

        [int]$Port = 443
    )
    Write-Host "Starting $($MyInvocation.MyCommand)..."

    $commandArgs = "-p $Port"
    if ($UseTcp) {
        $commandArgs += " -T "
    }

    return Invoke-ZvmaNetDiagnosticCommand -Command "sudo traceroute" -TargetHost $TargetHost -CommandArgs $commandArgs -CommandDescription "Network traceroute"
}

function Invoke-ZvmaNetcat {
    <#
    .SYNOPSIS
        Executes netcat command on the ZVMA to test TCP port connectivity
    #>

    param (
        [ValidateNotNullOrEmpty()]
        [string]$TargetHost,

        [string]$Ports = 443
    )
    Write-Host "Starting $($MyInvocation.MyCommand)..."

    $commandArgs = "$Ports -zv -w 3"

    return Invoke-ZvmaNetDiagnosticCommand -Command "nc" -TargetHost $TargetHost -CommandArgs $commandArgs -CommandDescription "TCP netcat connectivity test"
}

function Invoke-ZvmaOpenSslCheck {
    <#
    .SYNOPSIS
        Executes openssl s_client command on the ZVMA to test TLS connectivity
    #>

    param (
        [ValidateNotNullOrEmpty()]
        [string]$TargetHost,

        [int]$Port = 443,

        [int]$TimeoutSeconds = 10,

        [ValidateSet("tls1", "tls1_1", "tls1_2", "tls1_3")]
        [string]$TlsVersion = "tls1_3"
    )
    Write-Host "Starting $($MyInvocation.MyCommand)..."
    return Invoke-ZvmaNetDiagnosticCommand -Command "timeout $TimeoutSeconds openssl s_client -connect" -TargetHost "$($TargetHost):$Port" -CommandArgs "-$TlsVersion" -CommandDescription "TLS connectivity test"
}

function Invoke-ZvmaCurl {
    <#
    .SYNOPSIS
        Executes curl command on the ZVMA to test HTTP connectivity and verbose output
    #>

    param (
        [ValidateNotNullOrEmpty()]
        [string]$TargetHost,

        [bool]$IsVerbose = $true
    )
    Write-Host "Starting $($MyInvocation.MyCommand)..."

    $commandText = "curl"
    if ($IsVerbose) {
        $commandText += " -v"
    }

    return Invoke-ZvmaNetDiagnosticCommand -Command $commandText -TargetHost "$TargetHost" -CommandDescription "HTTP connectivity test"
}

function Invoke-ZvmaNetDiagnosticCommand {
    <#
    .SYNOPSIS
        Executes a network diagnostics command on the ZVMA
    #>

    param (
        [ValidateNotNullOrEmpty()]
        [string]$Command,

        [ValidateNotNullOrEmpty()]
        [string]$TargetHost,

        [string]$CommandArgs = "",

        [ValidateNotNullOrEmpty()]
        [string]$CommandDescription
    )
    Write-Host "Starting Invoke-ZvmaNetDiagnosticCommand for $CommandDescription..."

    try {

        $fullCommand = "$Command $TargetHost $CommandArgs"
        Write-Host "Executing command: $fullCommand"
        $res = Invoke-ZVMLScript -ScriptText $fullCommand

        Write-Host "$CommandDescription for $TargetHost completed."
        return $res.ScriptOutput
    }
    catch {
        $errorMessage = "Failed to perform $CommandDescription on ZVM. Problem: $_"
        Write-Error $errorMessage
        return "Error: $errorMessage"
    }
}