# PRTG Custom Sensor to read TP-Link 24port SoHo Switch # # 20150413 Ver 1.0 Initial Version # param ( [string]$ipaddress = "192.168.178.2", [string]$Username = "admin", [string]$password = "admin", [long]$portnumber= 1, [long]$cacheage = 60, # maxiumum cache age of the file [string]$cachefile = ".\prtg-tplink.cache" ) #set-psdebug -strict # enforce strict variable checking, not ussable in a PRTG Shell write-host "PRTG-TPLINK:Start" (get-date).tostring() write-host "PRTG-TPLINK:Initializing PRTG Result variable" [string]$prtgresult="" $prtgresult+="`r`n" $prtgresult+="`r`n" [bool]$errorfound = $false if ($cachefile -ne "") { write-host "PRTG-TPLINK:Cached Mode enabled" try { if (((get-date) - (Get-Item -Path $cachefile -erroraction silentlycontinue).lastwritetime).totalseconds -lt $cacheage) { write-host "PRTG-TPLINK:Loading Data from Cache File" $data=get-content $cachefile -erroraction silentlycontinue } else { write-host "PRTG-TPLINK:Cached File to old" $data ="" } } catch { write-host "PRTG-TPLINK:Cache File not loaded or not found - get online data" $data="" $error.clear() } } if ($data -eq "") { write-host "PRTG-TPLINK:Login at Switch" $postParams = @{Username=$Username;password=$password;logon='login'} $loginresult=Invoke-WebRequest -Uri ("http://"+$ipaddress+"/logon.cgi") -Method POST -Body $postParams -UseBasicParsing if (($loginresult.StatusCode) -ne 200) { write-host "PRTG-TPLINK:Error using HTTP: Invalid Login Credentials" $prtgresult+=" 2`r`n" $prtgresult+=" Error using HTTP: Invalid Login Credentials`r`n" $errorfound = $true } else { write-host "PRTG-TPLINK:Loading PortStatisticsRpm" $PortStatisticsPrm = Invoke-WebRequest -Uri ("http://"+$ipaddress+"/PortStatisticsRpm.htm") -Method GET -UseBasicParsing if (($loginresult.StatusCode) -ne 200) { write-host ("PRTG-TPLINK:Error: unable to get PortStatisticsRpm.htm with code " + $loginresult.StatusCode) $prtgresult+=" 2`r`n" $prtgresult+=" Error: unable to get PortStatisticsRpm.htm with code " + ($loginresult.StatusCode) +"`r`n" $errorfound = $true } else { write-host "PRTG-TPLINK:Matching Data Payload" if ($PortStatisticsPrm.RawContent -match 'var tmp_info = "(.*?)";') { $data = $Matches[1].trim().split(" ") if ($PortStatisticsPrm.RawContent -match 'var tmp_info2 = "(.*?)";') { $data+= $Matches[1].trim().split(" ") } if ((($data.count)%6) -ne 0) { write-host "PRTG-TPLINK:Error: Content Validation failed 6teilbar" $prtgresult+=" 2`r`n" $prtgresult+=" Error: Content Validation failed 6teilbar`r`n" $errorfound = $true } else { if ($cachefile -ne "") { write-host "PRTG-TPLINK:Write CacheFile" $data | out-file -filepath $cachefile } } } else { write-host "PRTG-TPLINK:Error: Content Validation failed RegEx no match" $prtgresult+=" 2`r`n" $prtgresult+=" Error: Content Validation failed RegEx no match`r`n" $errorfound = $true } } write-host "PRTG-TPLINK:Logout from Switch" #Invoke-WebRequest -Uri ("http://"+$ipaddress+"/Logout.htm") -Method GET -UseBasicParsing | out-null } } if ($data -ne "") { if ($portnumber -eq "0"){ write-host ("PRTG-TPLINK:Processing Summary" + $portnumber) $summary = ("" | select enabled,GlobalBadTxPakets,GlobalBadRxPakets,GlobalTxPakets,GlobalRxPakets,link0,link1,link2,link3,link4,link5,link6) $summary.enabled=0 $summary.GlobalBadTxPakets=0 $summary.GlobalBadRxPakets=0 $summary.GlobalTxPakets=0 $summary.GlobalRxPakets=0 $summary.link0=0 $summary.link1=0 $summary.link2=0 $summary.link3=0 $summary.link4=0 $summary.link5=0 $summary.link6=0 for ($i=1;$i -le 24; $i++){ write-host "Building summary für $i" $data[[int]($i-1)*6] $summary.enabled += $data[[int]($i-1)*6] $summary.GlobalBadTxPakets += ([int]($data[[int]($i-1)*6+3])) $summary.GlobalBadRxPakets += ([int]($data[[int]($i-1)*6+5])) $summary.GlobalTxPakets += ([int]($data[[int]($i-1)*6+2])) $summary.GlobalRxPakets += ([int]($data[[int]($i-1)*6+4])) switch (($data[[int]($i-1)*6+1])) { "0" {$summary.link0++} "1" {$summary.link1++} "2" {$summary.link2++} "3" {$summary.link3++} "4" {$summary.link4++} "5" {$summary.link5++} "6" {$summary.link6++} } } $prtgresult+=" `r`n" $prtgresult+=" TotalEnabled`r`n" $prtgresult+=" "+$summary.enabled+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" LinkDown`r`n" $prtgresult+=" "+$summary.link0+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" Link1`r`n" $prtgresult+=" "+$summary.link1+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" Link10Half`r`n" $prtgresult+=" "+$summary.link2+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" Link10Full`r`n" $prtgresult+=" "+$summary.link3+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" Link100Half`r`n" $prtgresult+=" "+$summary.link4+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" Link100Full`r`n" $prtgresult+=" "+$summary.link5+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" Link1000Full`r`n" $prtgresult+=" "+$summary.link6+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" GlobalBadTxPakets`r`n" $prtgresult+=" "+$summary.GlobalBadTxPakets+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Difference`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" GlobalBadRxPakets`r`n" $prtgresult+=" "+$summary.GlobalBadRxPakets+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Difference`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" GlobalTxPakets`r`n" $prtgresult+=" "+$summary.GlobalTxPakets+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Difference`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" GlobalRxPakets`r`n" $prtgresult+=" "+$summary.GlobalRxPakets+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Difference`r`n" $prtgresult+=" `r`n" } else { write-host ("PRTG-TPLINK:Processing Port " + $portnumber) $prtgresult+=" `r`n" $prtgresult+=" TotalGoodPkt`r`n" $prtgresult+=" "+([int]($data[[int]($portnumber-1)*6+4]) + [int]($data[[int]($portnumber-1)*6+2]))+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Difference`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" TotalBadPkt`r`n" $prtgresult+=" "+([int]($data[[int]($portnumber-1)*6+3]) + [int]($data[[int]($portnumber-1)*6+5]))+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Difference`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" enabled`r`n" $prtgresult+=" "+$data[[int]($portnumber-1)*6]+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" Speed`r`n" $prtgresult+=" "+$data[[int]($portnumber-1)*6+1]+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Absolute`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" TxGoodPkt`r`n" $prtgresult+=" "+$data[[int]($portnumber-1)*6+2]+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Difference`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" TxBadPkt`r`n" $prtgresult+=" "+$data[[int]($portnumber-1)*6+3]+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Difference`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" RxGoodPkt`r`n" $prtgresult+=" "+$data[[int]($portnumber-1)*6+4]+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Difference`r`n" $prtgresult+=" `r`n" $prtgresult+=" `r`n" $prtgresult+=" RxBadPkt`r`n" $prtgresult+=" "+$data[[int]($portnumber-1)*6+5]+"`r`n" $prtgresult+=" 0`r`n" $prtgresult+=" Difference`r`n" $prtgresult+=" `r`n" } } $prtgresult+="" if ($errorfound) { write-host "PRTG-TPLINK:Error Found. Ending with EXIT Code" ([xml]$prtgresult).prtg.error } write-host "PRTG-TPLINK:Sending PRTGRESULT to STDOUT" $prtgresult if ($errorfound) { exit ([xml]$prtgresult).prtg.error }