<#
.SYNOPSIS
	Lists DNS servers
.DESCRIPTION
	This PowerShell script list public and free DNS servers together with IPv4 addresses and measured latency.
.EXAMPLE
	PS> ./list-dns-servers.ps1
      
	DNS PROVIDER            IPv4 ADDRESSES                   LATENCY
	------------            ---- ---------                   -------
	AdGuard DNS (Cyprus)    94.140.14.14 · 94.140.15.15      222 · 205 ms
	...
.LINK
	https://github.com/fleschutz/PowerShell
.NOTES
	Author: Markus Fleschutz | License: CC0
#>

function MeasureDNSServer([string]$provider, [string]$IPv4Pri, [string]$IPv4Sec) {
	$time=[system.diagnostics.stopwatch]::startNew();$null=(nslookup fleschutz.de $IPv4Pri 2>$null);[int]$lat1=$time.Elapsed.TotalMilliseconds

	$time=[system.diagnostics.stopwatch]::startNew();$null=(nslookup fleschutz.de $IPv4Sec 2>$null);[int]$lat2=$time.Elapsed.TotalMilliseconds

	New-Object PSObject -Property @{ 'DNS PROVIDER'=$provider; 'IPv4 ADDRESSES'="$IPv4Pri · $IPv4Sec"; LATENCY="$lat1 · $lat2 ms" }
}

function List-DNS-Servers {
	Write-Progress "Loading data/public-dns-servers.csv..."
	$table = Import-CSV "$PSScriptRoot/../data/public-dns-servers.csv"
	Write-Progress -completed "Done."
	foreach($row in $table) { MeasureDNSServer $row.PROVIDER $row.IPv4_PRI $row.IPv4_SEC }
	
}
 
try {
	List-DNS-Servers | Format-Table -property @{e='DNS PROVIDER';width=50},@{e='IPv4 ADDRESSES';width=32},@{e='LATENCY';width=15}
	exit 0 # success
} catch {
	"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
	exit 1
}
