Zum Inhalt springen

Internet-Speedtest-Monitoring mit PowerShell

Autobahn

Mit dem folgenden Script lässt sich ein automatisiertes Internet-Speedtest-Monitoring mit PowerShell inkl. optionalem Logging und optionaler E-Mailalarmierung durchführen.

Im ersten Script-Abschnitt müssen die jeweils gewünschten Einstellungen gesetzt werden. Für den Speedtest wird die kostenlos erhältliche Speedtest.exe von Ookla verwendet. Das Script wurde für die Speedtest.exe-Version 1.0.0 entwickelt. Für das automatische Monitoring kann eine Windows-Aufgabe verwendet werden.

################################################################################################################################################
# Pfad zur speedtest.exe, Download unter: https://www.speedtest.net/apps/cli
$speedtestExe = "C:\Scripts\speedtest.exe"
# Mail-Einstellungen
$mail = "error"                                           # none = Mails deaktiviert, all = alle Speedtests senden, error = nur Probleme senden
$mailTo = "mail@domain.tld";                              # Empfänger
$mailFrom = "mail@domain.tld";                            # Absender
$mailSubject = $env:computername+": Internet-Speedtest";  # Betreff "Computername: Internet-Speedtest"
$mailSMTP = "smtp.domain.tld";                            # SMTP-Server
# Log-Einstellungen
$log = "all"                              # none = Logging deaktiviert, all = alle Speedtests loggen, error = nur Probleme loggen
$logFile = "C:\Scripts\speedtestlog.txt"  # Log-Datei
# Testeinstellungen
$tests = 3         # Anzahl der Speedtests (min. 1)
$testsDelay = 120  # Sekunden Verzögerung zwischen mehreren Speedtests
$minDown = 100     # Minimum Download MBit/s
$minUp = 10        # Minimum Upload MBit/s
$packetLoss = 2    # Maximum % Paketverlust
# Ping-Testeinstellungen
$pingTest = $true            # $true = Ping-Test aktivieren, $false = Ping-Test deaktivieren
$pingTarget = "google.at"    # Ping-Ziel
$pingCount = 10              # Anzahl der Pings
$maxPing = 100               # Maximum Ping ms
################################################################################################################################################
# Speedtest-Datei vorhanden?
if((Test-Path $speedtestExe) -eq $false){
Write-Host "Fehler: speedtest.exe nicht gefunden!"
exit
}
# Tests durchführen
$runningTest = 0
$err = $false
$mailBody = ""
do {
# Anzahl gelaufener Tests erhöhen
$runningTest++
# Speedtest ausführen und in CSV konvertieren
$csv = & $speedtestExe @('-f','csv','--accept-license','--accept-gdpr')
$csvHeader = "server name","server id","latency","jitter","packetloss","download","upload","downloadbytes","uploadbytes","shareurl"
$speed = ConvertFrom-Csv -inputobject $csv -Delimiter "," -Header $csvHeader
# Down/Upload in MBit umrechnen
$download = [math]::Round($speed.download / 1000000 * 8,2)
$upload = [math]::Round($speed.upload / 1000000 * 8,2)
# Speedtest-Ergebnisse überprüfen
$errText = ""
if($download -gt 0 -and $upload -gt 0){
# Download
if($download -lt $minDown){
$errText += "Download unter "+$minDown+" MBit!`r`n"
$err = $true
}
# Upload
if($upload -lt $minUp){
$errText += "Upload unter "+$minUp+" MBit!`r`n"
$err = $true
}
# Paketverlust
if($speed.packetloss -ne "N/A" -and $speed.packetloss -gt $packetLoss){
$errText += $speed.packetloss+" % Paketverlust!`r`n"
$err = $true
}
} else {
# Down- und Upload unter 0
$err = $true
$errText = "Fehler beim Speedtest!"
}
# Ping-Test
if($pingTest -eq $true){
$pingStr = ""
$pingErr = $false
$ping = Test-Connection $pingTarget -Count $pingCount
# Ping-Ergebnisse prüfen
for($i=0; $i -lt $ping.length; $i++){
# Ping-Ergebnisse für Ausgabe speichern  
if($i -gt 0){
$pingStr += ", "
}
$pingStr += [string] $ping[$i].ResponseTime +" ms"
# Ping-Limit überschritten
if($ping[$i].ResponseTime -gt $maxPing){
$pingErr = $true
}
}
# Ping-Limit-Überschreitung an Log/Mail übergeben
if($pingErr -eq $true){
$errText += "Ping über "+$maxPing+" ms!`r`n"
$err = $true
}
Write-Host $pingStr
}
# Mail vorbereiten
if($mail -ne "none" -and ($mail -eq "all" -or ($mail -eq "error" -and $err -eq $true))){
$mailBody += "::: TEST "+$runningTest+"`r`n`r`n"
# Mailbody erstellen
if($errText -ne ""){
$mailBody += "ACHTUNG:`r`n"+$errText+"`r`n"
}
# Mailbody ergänzen
$mailBody += "Gemessene Werte:`r`n"
$mailBody += "Download: "+$download+" MBit`r`n"
$mailBody += "Upload: "+$upload+" MBit`r`n"
$mailBody += "Paketverlust: "+$speed.packetloss+" %"
# Ping-Test in Mailbody ergänzen
if($pingTest -eq $true){
$mailBody += "`r`nPings: "+$pingStr
}
if($runningTest -lt $tests){
$mailBody += "`r`n--------------------------------------------`r`n"
}
}
# Log-Datei schreiben
if($log -ne "none" -and ($log -eq "all" -or ($log -eq "error" -and $err -eq $true))){
$line = (Get-Date).ToString("dd.MM.yyyy HH:mm:ss")+"   "+$download+" MBit down   "+$upload+" MBit up   "+$speed.packetloss+" % Paketverlust"
# Log-Zeile um Ping-Ergebnisse erweitern
if($pingTest -eq $true){
$line += "   "+$pingStr
}
# Testausgabe
Write-Host $line
# In Log-Datei speichern
Add-Content -path $logFile -Value $line
}
# nächsten Test verzögern
if($runningTest -lt $tests -and $testsDelay -gt 0){
Write-Host "Nächster Test beginnt in" $testsDelay "Sekunden"
Start-Sleep($testsDelay);
}
} while($runningTest -lt $tests)
# Mail senden
if($mail -ne "none" -and ($mail -eq "all" -or ($mail -eq "error" -and $err -eq $true))){
# Mail senden
Send-MailMessage -To $mailTo -From $mailFrom -Subject $mailSubject -SmtpServer $mailSMTP -Body $mailBody -Encoding utf8
}Code-Sprache: PHP (php)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

7 + 13 =