# PRTG Custom Sensor to read AVm Frit Box using Tr-64 # # 20150323 Ver 1.0 Initial Version # 20181222 Ver 2.0 Added additoinal Sensor, parameter File and https as default # 20220214 Ver 2.1 Anpassung auf Usernamen [CMDLetBinding()] param ( [string]$fritzuser = "fritzdefault", # Default User früher dslf-config [string]$fritzpass = "", # Password zur Fritz-Box [string]$definitionfile = "$($PSScriptRoot)\prtg-fritzbox2.definition.csv", #CSV File with list of channels and their settings [string]$fritzhosturl = "https://fritz.box:49443" # URl Abse IP-Address ) #set-psdebug -strict # enforce strict variable checking write-verbose "Start prtg-fritz $((get-date).tostring())" write-verbose "Parametercheck: fritzhosturl : $($fritzhosturl)" write-verbose "Disable SSl CertificateCheck" [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12 write-verbose "Initializing PRTG Result variable" [string]$prtgresult="" $prtgresult+="`r`n" $prtgresult+="`r`n" [bool]$errorfound = $false write-verbose "START Loading definitionfile $($definitionfile)" if (test-path $definitionfile -pathtype leaf) { $definitionhash=@{} try { foreach ($line in (import-csv $definitionfile)) { write-verbose " Importing definitionfile for $($line.channel)" $definitionhash[$line.channel] = $line } } catch { write-verbose "Problem importing definitionfile table" write-verbose "Error: `r`n $($_.Exception.Message)" exit } } else { write-verbose " definitionfilefile not found" exit 1 } write-verbose "END Loading definitionfile File $($definitionfile)" #region WANCommonInterfaceConfig try { write-verbose " START: Getting WANCommonInterfaceConfig" [String]$URL = "$($fritzhosturl)/igdupnp/control/WANCommonIFC1" write-verbose "SOAP-URL: $($URL)" if ($PSVersionTable.PSEdition -eq "Core") { [xml]$webresult = Invoke-WebRequest ` -Uri $url ` -Method POST ` -ContentType 'text/xml;charset="utf-8"' ` -Headers @{ "SOAPAction"= '"urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetAddonInfos"'; "Accept"="text/xml"} ` -Body ' ' ` -SkipHeaderValidation ` -SkipCertificateCheck } else { $soapWebRequest = [System.Net.WebRequest]::Create($URL) $soapWebRequest.Headers.Add("SOAPAction",'"urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetAddonInfos"') $soapWebRequest.ContentType = 'text/xml;charset="utf-8"' $soapWebRequest.Accept = "text/xml" $soapWebRequest.Method = "POST" $soapWebRequest.ServerCertificateValidationCallback = {$true} # ignore certificate write-verbose "Write SOAP Request XML to RequestStream" $requestStream = $soapWebRequest.GetRequestStream() [string]$SOAPRequest=' '; $SOAPRequestbytearray = ([System.Text.Encoding]::ASCII).GetBytes($SOAPRequest) $requestStream.write($SOAPRequestbytearray,0,$SOAPRequestbytearray.count) $requestStream.Close() write-verbose "Sending Request to Fritz!Box" $resp = $soapWebRequest.GetResponse() write-verbose "Processing Answer" $responseStream = $resp.GetResponseStream() $soapReader = [System.IO.StreamReader]($responseStream) $webresult = [Xml] $soapReader.ReadToEnd() $responseStream.Close() #$webresult.Envelope.Body.GetAddonInfosResponse } write-verbose "Parsing webresult" $properties = ($webresult.Envelope.Body.GetAddonInfosResponse | Get-Member -MemberType Property) foreach ($property in $properties) { write-verbose " Processing Datapoint : $($property.name)" $value = $($webresult.Envelope.Body.GetAddonInfosResponse.($property.name)) write-verbose " Value $($value)" try { $calcvalue = invoke-expression $($definitionhash[$property.name].calc) } catch{ $calcvalue ="NaN" } write-verbose " CalcValue $($calcvalue)" if ($definitionhash[$property.name]) { $value = $webresult.Envelope.Body.GetAddonInfosResponse.($property.name) #write-host "$($definitionhash[$property.name].calc)" $prtgresult+=" `r`n" $prtgresult+=" $($property.name)`r`n" $prtgresult+=" $($calcvalue)`r`n" $prtgresult+=" Custom`r`n" $prtgresult+=" $($definitionhash[$property.name].customunit)`r`n" $prtgresult+=" $($definitionhash[$property.name].float)`r`n" $prtgresult+=" $($definitionhash[$property.name].mode)`r`n" $prtgresult+=" `r`n" } } } catch { write-verbose "Error using HTTP: Unable to get WANCommonInterfaceConfig" write-verbose "Error: `r`n $($_.Exception.Message)" $_ $prtgresult+=" 2`r`n" $prtgresult+=" Unable to get WANCommonInterfaceConfig`r`n" $errorfound = $true } write-verbose " DONE: Getting WANCommonInterfaceConfig" #endregion #region WANDSLInterfaceConfig if (!$errorfound -and ($fritzpass -ne "")) { try { write-verbose "START Getting WANDSLInterfaceConfig" $webclient=New-Object System.Net.WebClient $webclient.Encoding=[System.Text.Encoding]::UTF8 $webclient.Headers.Set("Content-Type", 'text/xml; charset="utf-8"') $webclient.Headers.Set("SOAPACTION", 'urn:dslforum-org:service:WANDSLInterfaceConfig:1#GetInfo') $query=' ' $webclient.Credentials=New-Object System.Net.NetworkCredential($fritzuser,$fritzpass) [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} Write-Verbose " Sending Request" $webresult = [xml]$webclient.UploadString("$($fritzhosturl)/upnp/control/wandslifconfig1",$query) #$webresult.Envelope.Body.GetInfoResponse write-verbose "Parsing webresult" $properties = ($webresult.Envelope.Body.GetInfoResponse | Get-Member -MemberType Property) foreach ($property in $properties) { write-verbose " Processing Datapoint : $($property.name)" $value = $webresult.Envelope.Body.GetInfoResponse.($property.name) write-verbose " Value :$($value)" try { $calcvalue = invoke-expression $($definitionhash[$property.name].calc) } catch { $calcvalue ="NaN" } write-verbose " CalcValue $($calcvalue)" if ($definitionhash[$property.name]) { $prtgresult+=" `r`n" $prtgresult+=" $($property.name)`r`n" $prtgresult+=" $($calcvalue)`r`n" #$prtgresult+=" $($webresult.Envelope.Body.GetInfoResponse.($property.name))`r`n" $prtgresult+=" Custom`r`n" $prtgresult+=" $($definitionhash[$property.name].customunit)`r`n" $prtgresult+=" $($definitionhash[$property.name].float)`r`n" $prtgresult+=" $($definitionhash[$property.name].mode)`r`n" $prtgresult+=" `r`n" } } } catch { write-verbose "Error getting GetInfo" write-verbose "Error: `r`n $($_.Exception.Message)" $prtgresult+=" 2`r`n" $prtgresult+=" Error getting GetInfo - wrong password ?`r`n" $errorfound = $true } } write-verbose "START Getting WANDSLInterfaceConfig" #endregion #region GetStatisticsTotal if (!$errorfound -and ($fritzpass -ne "")) { try { write-verbose "START Getting WANDSLInterfaceConfig" $webclient.Headers.Set("Content-Type", 'text/xml; charset="utf-8"') $webclient.Headers.Set("SOAPACTION", 'urn:dslforum-org:service:WANDSLInterfaceConfig:1#GetStatisticsTotal') $query=' ' $webclient.Credentials=New-Object System.Net.NetworkCredential($fritzuser,$fritzpass) Write-Verbose " Sending Request" $webresult = [xml]$webclient.UploadString("$($fritzhosturl)/upnp/control/wandslifconfig1",$query) #$webresult.Envelope.Body.GetStatisticsTotalResponse write-verbose "Parsing webresult" $properties = ($webresult.Envelope.Body.GetStatisticsTotalResponse | Get-Member -MemberType Property) foreach ($property in $properties) { write-verbose " Processing Datapoint : $($property.name)" $value = $webresult.Envelope.Body.GetStatisticsTotalResponse.($property.name) write-verbose " Value: $($value)" try { $calcvalue = invoke-expression $($definitionhash[$property.name].calc) } catch { $calcvalue ="NaN" } write-verbose " CalcValue $($calcvalue)" if ($definitionhash[$property.name]) { $prtgresult+=" `r`n" $prtgresult+=" $($property.name)`r`n" $prtgresult+=" $($calcvalue)`r`n" #$prtgresult+=" $($webresult.Envelope.Body.GetStatisticsTotalResponse.($property.name))`r`n" $prtgresult+=" Custom`r`n" $prtgresult+=" $($definitionhash[$property.name].customunit)`r`n" $prtgresult+=" $($definitionhash[$property.name].float)`r`n" $prtgresult+=" $($definitionhash[$property.name].mode)`r`n" $prtgresult+=" `r`n" } } } catch { write-verbose "ERROR Getting WANDSLInterfaceConfig" write-verbose "Error: `r`n $($_.Exception.Message)" $prtgresult+=" 2`r`n" $prtgresult+=" Error getting GetStatisticsTotal`r`n" $errorfound = $true } } #endregion if (!$errorfound) { write-verbose "NoError Found" $prtgresult+=" 0`r`n" $prtgresult+=" OK - Last Run $(get-date -format o)`r`n" } $prtgresult+="" if ($errorfound) { write-verbose "Error Found. Ending with EXIT Code $(([xml]$prtgresult).prtg.error)" } write-verbose "Sending PRTGRESULT to STDOUT" $prtgresult if ($errorfound) { exit ([xml]$prtgresult).prtg.error }