Untitled
unknown
plain_text
4 months ago
5.0 kB
27
Indexable
# Path to log file
$LogFile = "network_monitor.log"
# Running averages
$global:AvgPingBBC = $null
$global:AvgPingRouter = $null
$global:PingCountBBC = 0
$global:PingCountRouter = 0
function Update-Average {
param([ref]$CurrentAvg, [ref]$Count, [double]$NewValue)
if ($null -eq $CurrentAvg.Value) {
$CurrentAvg.Value = $NewValue
$Count.Value = 1
} else {
$Count.Value++
$CurrentAvg.Value = (($CurrentAvg.Value * ($Count.Value - 1)) + $NewValue) / $Count.Value
}
}
function Get-Color {
param(
[bool]$StatusOk,
[double]$Ping,
[double]$AvgPing,
[int]$LossPercent
)
if (-not $StatusOk) { return "Red" }
if ($LossPercent -ge 50) { return "Red" }
if ($Ping -gt ($AvgPing * 1.5)) { return "Red" }
if ($LossPercent -gt 0) { return "Yellow" }
if ($Ping -gt $AvgPing) { return "Yellow" }
return "Green"
}
Write-Host "Monitoring started... press Ctrl+C to stop."
while ($true) {
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$jobs = @()
$jobs += Start-Job -ScriptBlock {
try {
Resolve-DnsName -Name "bbc.co.uk" -Server "192.168.1.254" -ErrorAction Stop | Out-Null
$true
} catch { $false }
}
$jobs += Start-Job -ScriptBlock {
try {
Resolve-DnsName -Name "bbc.co.uk" -Server "1.1.1.1" -ErrorAction Stop | Out-Null
$true
} catch { $false }
}
$jobs += Start-Job -ScriptBlock {
$count = 4
$ping = Test-Connection -ComputerName "bbc.co.uk" -Count $count -ErrorAction SilentlyContinue
if ($ping) {
$avg = [math]::Round(($ping | Measure-Object -Property ResponseTime -Average).Average, 2)
$loss = [math]::Round((($count - $ping.Count) / $count) * 100, 0)
@{ Avg = $avg; Loss = $loss }
} else { @{ Avg = $null; Loss = 100 } }
}
$jobs += Start-Job -ScriptBlock {
$count = 4
$ping = Test-Connection -ComputerName "192.168.1.254" -Count $count -ErrorAction SilentlyContinue
if ($ping) {
$avg = [math]::Round(($ping | Measure-Object -Property ResponseTime -Average).Average, 2)
$loss = [math]::Round((($count - $ping.Count) / $count) * 100, 0)
@{ Avg = $avg; Loss = $loss }
} else { @{ Avg = $null; Loss = 100 } }
}
Wait-Job $jobs | Out-Null
$results = foreach ($job in $jobs) {
try { Receive-Job $job -ErrorAction Stop } catch { $null } finally { Remove-Job $job -Force }
}
$dns1Ok = $results[0]
$dns2Ok = $results[1]
$pingBBC = $results[2]
$pingRouter = $results[3]
if ($pingBBC.Avg -ne $null) { Update-Average ([ref]$global:AvgPingBBC) ([ref]$global:PingCountBBC) $pingBBC.Avg }
if ($pingRouter.Avg -ne $null) { Update-Average ([ref]$global:AvgPingRouter) ([ref]$global:PingCountRouter) $pingRouter.Avg }
# Determine colors
$colorDns1 = if ($dns1Ok) { "Green" } else { "Red" }
$colorDns2 = if ($dns2Ok) { "Green" } else { "Red" }
$colorPingBBC = Get-Color -StatusOk $dns1Ok -Ping $pingBBC.Avg -AvgPing $global:AvgPingBBC -LossPercent $pingBBC.Loss
$colorPingRouter = Get-Color -StatusOk $dns2Ok -Ping $pingRouter.Avg -AvgPing $global:AvgPingRouter -LossPercent $pingRouter.Loss
# Compose output strings
$consoleOutput = @(
"$timestamp | DNS(192.168.1.254)=",
$dns1Ok,
" | DNS(1.1.1.1)=",
$dns2Ok,
" | PingBBC=",
"$($pingBBC.Avg) ms (loss=$($pingBBC.Loss)%, avg=$([math]::Round($global:AvgPingBBC,2)) ms)",
" | PingRouter=",
"$($pingRouter.Avg) ms (loss=$($pingRouter.Loss)%, avg=$([math]::Round($global:AvgPingRouter,2)) ms)"
)
# Print colored console output
Write-Host $consoleOutput[0] -NoNewline
Write-Host $consoleOutput[1] -ForegroundColor $colorDns1 -NoNewline
Write-Host $consoleOutput[2] -NoNewline
Write-Host $consoleOutput[3] -ForegroundColor $colorDns2 -NoNewline
Write-Host $consoleOutput[4] -NoNewline
Write-Host $consoleOutput[5] -ForegroundColor $colorPingBBC -NoNewline
Write-Host $consoleOutput[6] -NoNewline
Write-Host $consoleOutput[7] -ForegroundColor $colorPingRouter
# Decide if logging is needed: any failure or above-average ping/loss?
$logCondition = -not $dns1Ok -or -not $dns2Ok `
-or ($colorPingBBC -ne "Green") `
-or ($colorPingRouter -ne "Green")
if ($logCondition) {
$line = "$timestamp | DNS(192.168.1.254)=$dns1Ok | DNS(1.1.1.1)=$dns2Ok | " +
"PingBBC=$($pingBBC.Avg) ms (loss=$($pingBBC.Loss)%, avg=$([math]::Round($global:AvgPingBBC,2)) ms) | " +
"PingRouter=$($pingRouter.Avg) ms (loss=$($pingRouter.Loss)%, avg=$([math]::Round($global:AvgPingRouter,2)) ms)"
Add-Content -Path $LogFile -Value $line
}
Start-Sleep -Seconds 15
}
Editor is loading...
Leave a Comment