Тестирование скорости интернет с помощью powershell и speedtest.net
24 Sep 2017
local_offer
powershell
local_offer
Icinga2
Для работы powershell скрипта необходим speedtest-cli, а также Python версии 2.4-3.5.
Скрипт тестирования скорости интернет для Icinga2:
```powershell
<#
icinga2scripts
Version 1.0
Description: Скрипт для Icinga 2 - Проверка скорости интернет
Pavel Satin (c) 2017
pslater.ru@gmail.com
#>
#[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$returnStateOK = 0
$returnStateWarning = 1
$returnStateCritical = 2
$returnStateUnknown = 3
#$ErrorActionPreference = "SilentlyContinue"
$down_speed_warn = [single]$args[0]
$down_speed_crit = [single]$args[1]
$up_speed_warn = [single]$args[2]
$up_speed_crit = [single]$args[3]
$spdtest = New-Object System.Diagnostics.ProcessStartInfo
$spdtest.FileName = "python.exe"
$spdtest.RedirectStandardError = $true
$spdtest.RedirectStandardOutput = $true
$spdtest.UseShellExecute = $false
$spdtest.Arguments = "c:\ProgramData\icinga2\scripts\icinga2\speedtest.py.ps1"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $spdtest
$p.Start() | Out-Null
$p.WaitForExit()
$stdout = $p.StandardOutput.ReadToEnd()
$stderr = $p.StandardError.ReadToEnd()
#Write-Host "stdout: $stdout"
#Write-Host "stderr: $stderr"
#Write-Host "exit code: " + $p.ExitCode
#if ($stderr -ne $Null) {
# $output = $stderr
# $output += $stdout
# Write-Host $output
#[System.Environment]::Exit($returnStateCritical)
#} else {
$stdout | Out-File "c:\\ProgramData\\icinga2\\scripts\\icinga2\\speedtest-out.txt"
foreach ($str in Get-Content "c:\\ProgramData\\icinga2\\scripts\\icinga2\\speedtest-out.txt")
{
if ($str -match 'Download:') {
$downloadspeed = $str -split ": "
} elseif ($str -match 'Upload:') {
$uploadspeed = $str -split ": "
} elseif ($str -match 'Hosted by ') {
$pingresp = $str -split ": "
}
}
$intDownloadspeed = [single]$downloadspeed[1].Split(" ")[0]
$strDowloadUnit = [string]$downloadspeed[1].Split(" ")[1]
$intUploadspeed = [single]$uploadspeed[1].Split(" ")[0]
$strUploadUnit = [string]$uploadspeed[1].Split(" ")[1]
$intPing = [single]$pingresp[1].Split(" ")[0]
$strPingUnit = [string]$pingresp[1].Split(" ")[1]
$strHostedBy = [string]$pingresp[0]
$returnIconP = "IconInfoEncoded"
if ($intDownloadspeed -ge $down_speed_warn) {
$returnIconD = "IconSuccessEncoded"
$returnState = $returnStateOK
} elseif (($intDownloadspeed -lt $down_speed_warn) -AND ($intDownloadspeed -gt $down_speed_crit)) {
$returnIconD = "IconWarningEncoded"
$returnState = $returnStateWarning
} elseif ($intDownloadspeed -le $down_speed_crit) {
$returnIconD = "IconErrorEncoded"
$returnState = $returnStateCritical
}
if ($intUploadspeed -ge $up_speed_warn) {
$returnIconU = "IconSuccessEncoded"
$returnState = $returnStateOK
} elseif (($intUploadspeed -lt $up_speed_warn) -AND ($intUploadspeed -gt $up_speed_crit)) {
$returnIconU = "IconWarningEncoded"
$returnState = $returnStateWarning
} elseif ($intUploadspeed -le $up_speed_crit) {
$returnIconU = "IconErrorEncoded"
$returnState = $returnStateCritical
}
#$output += "OK"
$output += "<div class='plsatin-ps-style'><table>"
$output += "<tr><td class='$returnIconD'></td><td>Download: </td><td>" + $intDownloadspeed + " " + $strDowloadUnit + "</td></tr>"
$output += "<tr><td class='$returnIconU'></td><td>Upload: </td><td>" + $intUploadspeed + " " + $strUploadUnit + "</td></tr>"
$output += "<tr><td class='$returnIconP'></td><td>Ping: </td><td>" + $intPing + " " + $strPingUnit + "</td></tr>"
$output +="</table>$strHostedBy</div>"
$output += "|'download'=$intDownloadspeed;$down_speed_warn;$down_speed_crit"
$output += " 'upload'=$intUploadspeed;$up_speed_warn;$up_speed_crit"
$output += " 'ping'=$intPing;;"
Write-Host $output
[System.Environment]::Exit($returnState)
#}
```
Мониторинг
Подключаем к системе мониторинга Icinga2:
apply Service "speedtest" {
max_check_attempts = 2
check_interval = 60m
retry_interval = 3m
enable_perfdata = true
assign where host.name == "dc01e.pshome.local"
ignore where host.vars.os_family == "Linux"
check_command = "powershell"
vars.ps_command = "c:\\ProgramData\\icinga2\\scripts\\icinga2\\check_speedtest.ps1"
vars.ps_args = [ "130", "100", "30", "20" ]
command_endpoint = host.vars.client_endpoint
}