Website connectivity debugger
This commit is contained in:
commit
f9319e6ce6
|
@ -0,0 +1,24 @@
|
|||
# PowerShell Script for URL and Network Testing
|
||||
|
||||
This PowerShell script performs comprehensive network tests for a specified URL, including HTTP status checks, ping tests (IPv4 and IPv6), traceroute, and NSLookup. The results are automatically sent to a Hastebin server for logging, and a notification is pushed to a configured ntfy server.
|
||||
|
||||
## How to Use the Script
|
||||
|
||||
1. **Download and Save the Script**: Save the provided PowerShell script to a file on your computer, such as `TestUrl.ps1`.
|
||||
|
||||
2. **Open PowerShell**: Run PowerShell with the necessary permissions to execute scripts.
|
||||
|
||||
3. **Run the Script with a URL Argument**: Use the following command to run the script, replacing `example.com` with the target URL you wish to test:
|
||||
|
||||
```powershell
|
||||
.\TestUrl.ps1 -url "example.com"
|
||||
```
|
||||
|
||||
Make sure to provide the URL without the `https://` prefix when performing network tests like ping and traceroute.
|
||||
|
||||
4. **View the Results**: The script will perform several network tests on the specified URL, send the logs to your Hastebin server, and push a notification to your ntfy server with a link to the log and test details.
|
||||
|
||||
## Requirements
|
||||
|
||||
- This script uses only default Windows tools (e.g., `Test-Connection`, `tracert`, `nslookup`) and does not require any additional installations.
|
||||
- Make sure your network settings allow the use of PowerShell for sending HTTP requests and running network commands like ping and traceroute.
|
|
@ -0,0 +1,149 @@
|
|||
# Check if the URL is passed as a parameter
|
||||
param (
|
||||
[string]$url
|
||||
)
|
||||
|
||||
if (-not $url) {
|
||||
Write-Error "Please provide a URL as a parameter."
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Define the servers to send logs and notifications
|
||||
$hastebinUrl = "https://haste.nixc.us/documents"
|
||||
$ntfyServer = "https://ntfy.nixc.us/bnHobG80sO5ZF4SB"
|
||||
$ntfyCredentials = "admin:tiZcgc8Waf9mg5A4n2aJ4Qk2RyYnwEHDT"
|
||||
|
||||
# Function to perform the URL and network tests
|
||||
function Test-Url {
|
||||
param ($url)
|
||||
$result = @{
|
||||
Timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss") # Explicitly convert to string format to avoid epoch time
|
||||
Url = $url.Trim()
|
||||
StatusCode = ""
|
||||
ResponseTime = ""
|
||||
Error = ""
|
||||
PingIPv4 = ""
|
||||
PingIPv6 = ""
|
||||
Traceroute = ""
|
||||
NsLookupDefault = ""
|
||||
NsLookupCloudflare = ""
|
||||
NsLookupGoogle = ""
|
||||
NsLookupIBM = ""
|
||||
NameserverDefault = ""
|
||||
}
|
||||
|
||||
# Test HTTP status and response time
|
||||
Write-Host "Starting HTTP status check..."
|
||||
try {
|
||||
$startTime = Get-Date
|
||||
$response = Invoke-WebRequest -Uri $url -UseBasicParsing -TimeoutSec 10
|
||||
$endTime = Get-Date
|
||||
$result.StatusCode = $response.StatusCode
|
||||
$result.ResponseTime = [math]::Round(($endTime - $startTime).TotalMilliseconds, 2) # Time in milliseconds
|
||||
Write-Host "HTTP status check completed."
|
||||
} catch {
|
||||
$result.Error = $_.Exception.Message.Trim()
|
||||
Write-Host "HTTP status check failed: $($_.Exception.Message)"
|
||||
}
|
||||
|
||||
# Perform Ping test for IPv4
|
||||
Write-Host "Starting Ping test for IPv4..."
|
||||
try {
|
||||
$pingIPv4 = Test-Connection -ComputerName $url -Count 4 -ErrorAction Stop
|
||||
$result.PingIPv4 = ($pingIPv4 | Select-Object -First 1).Address.ToString().Trim() + ": " + [math]::Round(($pingIPv4 | Measure-Object ResponseTime -Average).Average, 2) + " ms avg"
|
||||
Write-Host "Ping test for IPv4 completed."
|
||||
} catch {
|
||||
$result.PingIPv4 = "Ping (IPv4) failed: " + $_.Exception.Message.Trim()
|
||||
Write-Host "Ping test for IPv4 failed: $($_.Exception.Message)"
|
||||
}
|
||||
|
||||
# Check if IPv6 is available and perform Ping test for IPv6
|
||||
Write-Host "Checking IPv6 availability..."
|
||||
try {
|
||||
$pingIPv6Available = Test-Connection -ComputerName $url -Count 1 -ErrorAction Stop -IPv6
|
||||
Write-Host "IPv6 is available, starting Ping test for IPv6..."
|
||||
try {
|
||||
$pingIPv6 = Test-Connection -ComputerName $url -Count 4 -ErrorAction Stop -IPv6
|
||||
$result.PingIPv6 = ($pingIPv6 | Select-Object -First 1).Address.ToString().Trim() + ": " + [math]::Round(($pingIPv6 | Measure-Object ResponseTime -Average).Average, 2) + " ms avg"
|
||||
Write-Host "Ping test for IPv6 completed."
|
||||
} catch {
|
||||
$result.PingIPv6 = "Ping (IPv6) failed: " + $_.Exception.Message.Trim()
|
||||
Write-Host "Ping test for IPv6 failed: $($_.Exception.Message)"
|
||||
}
|
||||
} catch {
|
||||
$result.PingIPv6 = "IPv6 not available"
|
||||
Write-Host "IPv6 is not available."
|
||||
}
|
||||
|
||||
# Perform Traceroute
|
||||
Write-Host "Starting Traceroute..."
|
||||
try {
|
||||
$traceroute = tracert.exe -d $url 2>&1 | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne "" }
|
||||
$result.Traceroute = ($traceroute -join " ") -replace '\s+', ' '
|
||||
Write-Host "Traceroute completed."
|
||||
} catch {
|
||||
$result.Traceroute = "Traceroute failed: " + $_.Exception.Message.Trim()
|
||||
Write-Host "Traceroute failed: $($_.Exception.Message)"
|
||||
}
|
||||
|
||||
# Function to perform nslookup with a specific DNS server
|
||||
function Perform-NsLookup {
|
||||
param ($dnsServer, $label)
|
||||
try {
|
||||
$outputFile = "$label.txt"
|
||||
$process = Start-Process nslookup.exe -ArgumentList "$url $dnsServer" -NoNewWindow -RedirectStandardOutput $outputFile -PassThru
|
||||
$process.WaitForExit()
|
||||
$nslookup = Get-Content $outputFile | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne "" }
|
||||
|
||||
# Extract the nameserver information if using the default
|
||||
if ($label -eq "Default") {
|
||||
$serverLine = $nslookup | Select-String -Pattern '^Server:'
|
||||
$addressLine = $nslookup | Select-String -Pattern '^Address:'
|
||||
$result.NameserverDefault = "Server: $($serverLine -replace 'Server:\s*','') Address: $($addressLine -replace 'Address:\s*','')"
|
||||
}
|
||||
|
||||
$result["NsLookup$label"] = ($nslookup -join " ") -replace '\s+', ' '
|
||||
Remove-Item $outputFile -Force -ErrorAction SilentlyContinue # Clean up output file
|
||||
Write-Host "NSLookup ($label) completed."
|
||||
} catch {
|
||||
$result["NsLookup$label"] = "NSLookup ($label) failed: " + $_.Exception.Message.Trim()
|
||||
Write-Host "NSLookup ($label) failed: $($_.Exception.Message)"
|
||||
}
|
||||
}
|
||||
|
||||
# Perform nslookup with default DNS, Cloudflare, Google, and IBM DNS servers
|
||||
Perform-NsLookup "Default"
|
||||
Perform-NsLookup "1.1.1.1" "Cloudflare"
|
||||
Perform-NsLookup "8.8.8.8" "Google"
|
||||
Perform-NsLookup "9.9.9.9" "IBM"
|
||||
|
||||
return $result
|
||||
}
|
||||
|
||||
# Test the URL and save the result as a log
|
||||
Write-Host "Starting URL test..."
|
||||
$log = Test-Url -url $url | ConvertTo-Json -Depth 10
|
||||
Write-Host "URL test completed. Sending results to Hastebin..."
|
||||
|
||||
# Send the log to Hastebin server
|
||||
try {
|
||||
$prettyLog = $log -replace '\n', ' ' # Replace newline characters with spaces
|
||||
$hasteResponse = Invoke-RestMethod -Uri $hastebinUrl -Method Post -Body $prettyLog -ContentType "application/json"
|
||||
$hasteKey = $hasteResponse.key
|
||||
$hasteLink = "https://haste.nixc.us/" + $hasteKey
|
||||
Write-Host "Results successfully sent to Hastebin."
|
||||
} catch {
|
||||
Write-Error "Failed to send log to Hastebin: $_"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Send a notification to ntfy server with the Hastebin link and test settings
|
||||
Write-Host "Sending notification to ntfy server..."
|
||||
try {
|
||||
$ntfyMessage = "URL test completed. Log available at: $hasteLink`nTested URL: $url"
|
||||
$ntfyResponse = Invoke-RestMethod -Uri $ntfyServer -Method Post -Body $ntfyMessage -Headers @{ Authorization = "Basic $([Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($ntfyCredentials)))" }
|
||||
Write-Host "Notification sent to ntfy."
|
||||
} catch {
|
||||
Write-Error "Failed to send notification to ntfy: $_"
|
||||
exit 1
|
||||
}
|
Loading…
Reference in New Issue