BandWith.ps1


param(
    $Opt = 'soulard',
    $site = '*',
    $file = 'C:\git\PSOpt2\OptBox-SpeedTest.json'
)
ipmo C:\Git\RDS.Dragonfly\Ressources\RDS.DragonFly-Tools.psm1
ipmo PsWrite, PSOpt2

$ScriptBlock = {
    param($Opt)
    
    # Include Area #

    $out = Invoke-OptBoxCommand -IpAddresses $Opt.OptBox.LanInfos.IP -Commands `
        "curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py --connect-timeout 1 | python -" # ,"ip route | grep $($Opt.OptBox.LanInfos.IP -replace('\d+$'))"
    $Opt.OptBox.WebInfos = [PSCustomObject]@{
        IPPublic = $Out[1] -replace('.*\((.*)\).*','$1')
        Operator = $Out[1] -replace('Testing from (.*) \(.*','$1')
        Provider = $Out[4] -replace('Hosted by (.*]): .*','$1')
        Latence  = [double]($Out[4] -replace('Hosted by .*\]: (\d+\.\d+) ms','$1'))
        Download = [double]($Out[6] -replace('.*Download: (\d+\.\d+) Mbit/s','$1'))
        Upload   = [double]($Out[8] -replace('.*Upload: (\d+\.\d+) Mbit/s','$1'))
    }
    # $out = $out[8..$out.count]

    $Out = Invoke-OptBoxCommand -IpAddresses $Opt.OptBox.LanInfos.IP -Commands "ip route | grep $($Opt.OptBox.LanInfos.IP -replace('\d+$'))"
    $Opt.OptBox.LanInfos.Gateway = ($out -like 'default via *')[0] -replace('default via ([\d*\.]+) .*','$1')
    $Opt.OptBox.LanInfos.Mask =  ($out -like '*/*')[0] -replace('.*(/\d\d) .*' ,'$1')
    $Opt
} | Include-ToScriptblock -Functions 'Invoke-OptBoxCommand','Write-Object'


Get-Opt2 $opt -details:$false | Get-Opt2Tunnels -filter $site | %{
    foreach($tunnel in $_.tunnels){
        if ((Test-TcpPort $tunnel.IP -port 8080 -ConfirmIfDown -Quick)) {
            $size = 1
            $Upload = [math]::Round($size / (Measure-Command {
                Invoke-WebRequest -Uri "http://$($tunnel.IP):8080/${size}M" -OutFile "$env:tmp\${size}M"
            }).TotalSeconds * 8,2)
            $Download = [math]::Round($size / (Measure-Command {
                Invoke-WebRequest -Uri "http://$($tunnel.IP):8080/" -Method Post -Infile "$env:tmp\${size}M" -ContentType 'image/jpg'
            }).TotalSeconds * 8,2)
        }
        [PSCustomObject]@{
            VLAN   = $_.vlan
            Opt2   = $_.hostName
            OptBox = [PSCustomObject]@{
                Name      = $tunnel.Name
                WebInfos = [PSCustomObject]@{}
                LanInfos = [PSCustomObject]@{
                    IP        = $tunnel.IP
                    Mask      = $null
                    Gateway   = $null
                    Configs   = $tunnel.Configs
                    Latence   = [math]::Round((Test-TcpPort $tunnel.IP -port 22).time, 2)
                    Download  = $download
                    Upload    = $Upload
                }
            }
        }
    }
} | Invoke-Parallel -ScriptBlock $ScriptBlock -psmodule posh-ssh -MaxThreads 32 -TimeOutGlobal 1000 -TimeOutThread 60 | ConvertTo-Json -Depth 4 | Out-File $file -Force


# Export-Opt2Config