Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Off Topic
    4. [gelöst] - Zabbix (FritzBox etc.)

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] - Zabbix (FritzBox etc.)

    This topic has been deleted. Only users with topic management privileges can see it.
    • BananaJoe
      BananaJoe Most Active @Codierknecht last edited by

      @codierknecht sagte in [gelöst] - Zabbix (FritzBox etc.):

      Das gieße ich dann noch in ein Template und hänge das später hier an.

      Da bin ich schon gespannt drauf 🙂
      Sieht so aus als hättest du das http agent Item entdeckt und den Rest hast du vermutlich mit Dependent Items gelöst - sehr gut

      Codierknecht 1 Reply Last reply Reply Quote 0
      • Codierknecht
        Codierknecht Developer Most Active @MartinP last edited by

        @martinp sagte in [gelöst] - Zabbix (FritzBox etc.):

        gibt es für die Signatur anscheinend keine Längenbeschränkung

        Doch. 320 Zeichen 😞

        1 Reply Last reply Reply Quote 0
        • Codierknecht
          Codierknecht Developer Most Active @BananaJoe last edited by Codierknecht

          @bananajoe sagte in [gelöst] - Zabbix (FritzBox etc.):

          Sieht so aus als hättest du das http agent Item entdeckt und den Rest hast du vermutlich mit Dependent Items gelöst

          Exakt.
          Nur durch den SOAP-Kram zu steigen hat 'ne Weile gedauert.

          https://github.com/DEV2DEV-DE/zabbix-templates/blob/b86ec42e12d84657995fed390ddb7e5aea98f514/zbx_template_fritzbox.xml

          32fcc26d-7ab6-470d-a2af-71a4f4fb6bf2-image.png

          1 Reply Last reply Reply Quote 2
          • Codierknecht
            Codierknecht Developer Most Active last edited by Codierknecht

            Wenn jemand hierzu noch Input liefern kann: Jederzeit gerne!

            Unter der Adresse http://192.168.178.1:49000/tr64desc.xml lässt sich der Fritte eine Liste der unterstützten Services entlocken.
            Nur bei diesen bekomme ich allerdings ein Ergebnis:

            • urn:schemas-upnp-org:service:WANIPConnection:1#GetStatusInfo
            • urn:schemas-upnp-org:service:WANIPConnection:1#GetConnectionTypeInfo
            • urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress
            • urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetCommonLinkProperties
            • urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetTotalBytesReceived
            • urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetTotalBytesSent

            Bei allen anderen Service bin ich bislang gescheitert und erhalte lediglich einen HTTP 500 - Internal server error zurück.
            Dabei ist es egal, ob ich das über http mit Port 49000 oder mit https über Port 49443 (langsamer) versuche.
            Auch muss der URL zu den Service mittlerweile /igdupnp/ lauten und nicht wie in fast allen Dokus /upnp/.

            Edit
            Scheint so, als käme man nicht so ohne Weiteres einfach nur mit Benutzername/Kennwort an die gewünschten Informationen.
            https://www.msxfaq.de/tools/prtg/getfritzmactable.htm
            Das Ganze muss dann in mehreren Schritten über Authenticate: Digest laufen.
            Habe ich allerdings bislang noch nicht zum Fliegen gebracht. Ich wüsste jetzt auch gar nicht wie ich Zabbix sowas beibringen könnte.

            BananaJoe 1 Reply Last reply Reply Quote 0
            • BananaJoe
              BananaJoe Most Active @Codierknecht last edited by

              @codierknecht Als Item kann man ein Script benutzen - das ist dann ein JavaScript wo du das dann so ähnlich wie in ioBroker machen kannst, also erst Anmelden und dann mit dem Token die daten holen.
              Irgendwo gibt es ein Beispiel dafür ... ich meine bei HPE Storage per API

              1 Reply Last reply Reply Quote 0
              • Codierknecht
                Codierknecht Developer Most Active last edited by Codierknecht

                @BananaJoe Der Tipp war Gold wert 😄

                Falls es jemanden interessiert:
                Ich hab's jetzt hinbekommen, über die TR-064 Schnittstelle der Fritte auch geschützte Daten auszulesen.

                const axios = require('axios');
                const crypto = require('crypto');
                const xml = require('xmldom');
                const parser = new xml.DOMParser();
                
                async function getForwardedPortsCount(username, password) {
                
                    const requestHeader = {
                        'Content-Type': 'text/xml; charset="utf-8"',
                        'SoapAction': 'urn:dslforum-org:service:Layer3Forwarding:1' + '#' + 'GetForwardNumberOfEntries'
                    };
                    
                    var requestBody = '<?xml version="1.0" encoding="utf-8"?>' +
                    '<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' +
                    '    <s:Header>' +
                    '        <h:InitChallenge xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1">' +
                    '            <UserID>' + username + '</UserID>' +
                    '        </h:InitChallenge>' +
                    '    </s:Header>' +
                    '    <s:Body>' +
                    '        <u:' + 'GetForwardNumberOfEntries' + ' xmlns:u="' + 'urn:dslforum-org:service:Layer3Forwarding:1' + '" />' +
                    '    </s:Body>' +
                    '</s:Envelope>';
                
                    // Initialize challenge with Fritz!Box
                    var uri = 'http://' + '192.168.178.1' + ':49000' + '/upnp/control/layer3forwarding';
                    var response = await axios.post(uri, requestBody, { headers: requestHeader });
                
                    // Calculate authentication
                    var doc = parser.parseFromString(response.data, 'text/xml');
                    const nonce = doc.getElementsByTagName('Nonce')[0].childNodes[0].nodeValue;
                    const realm = doc.getElementsByTagName('Realm')[0].childNodes[0].nodeValue;
                    const secret = crypto.createHash('md5').update(username + ':' + realm + ':' + password).digest('hex');
                    const auth = crypto.createHash('md5').update(secret + ':' + nonce).digest('hex');
                
                    // Get values with authentication
                    requestBody = '<?xml version="1.0" encoding="utf-8"?>' +
                    '<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' +
                    '    <s:Header>' +
                    '        <h:ClientAuth xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1">' +
                    '            <Nonce>' + nonce + '</Nonce>' +
                    '            <Auth>' + auth + '</Auth>' +
                    '            <UserID>' + username + '</UserID>' +
                    '            <Realm>' + realm + '</Realm>' +
                    '        </h:ClientAuth>' +
                    '    </s:Header>' +
                    '    <s:Body>' +
                    '        <u:' + 'GetForwardNumberOfEntries' + ' xmlns:u="' + 'urn:dslforum-org:service:Layer3Forwarding:1' + '" />' +
                    '    </s:Body>' +
                    '</s:Envelope>';
                
                    response = await axios.post(uri, requestBody, { headers: requestHeader });
                
                    // return result
                    var doc = parser.parseFromString(response.data, 'text/xml');
                    const ports = doc.getElementsByTagName('NewForwardNumberOfEntries')[0].childNodes[0].nodeValue;
                    return(ports);
                
                }
                

                Allerdings erst einmal nur direkt im ioBroker und nicht als Zabbix-Script-Item.
                Das liefert mir blöderweise beim POST-Request einen 404 😞
                Alles was ich dort mit GET-Requests mache, funktioniert tadellos.
                Warum GET funktioniert und POST nicht, ist mir (noch) schleierhaft.

                Codierknecht 1 Reply Last reply Reply Quote 2
                • Codierknecht
                  Codierknecht Developer Most Active @Codierknecht last edited by

                  @codierknecht
                  @Garfonso @fastfoot
                  Ich hab' die Diskussion aus Discord mal hier weitergetrieben.
                  Hier kriegen das mehr User mit ... falls es wen interessiert.

                  Das "fehlerhafte" Script in Zabbix sieht so aus:

                  const params = JSON.parse(value);
                  
                  const requestBody = '<?xml version="1.0" encoding="utf-8"?>' +
                  '<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' +
                  '    <s:Header>' +
                  '        <h:InitChallenge xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1">' +
                  '            <UserID>' + params.username + '</UserID>' +
                  '        </h:InitChallenge>' +
                  '    </s:Header>' +
                  '    <s:Body>' +
                  '        <u:' + params.action + ' xmlns:u="' + params.urn + '" />' +
                  '    </s:Body>' +
                  '</s:Envelope>';
                  
                  const action = params.urn + '#' + params.action;
                  
                  // Initialize challenge with Fritz!Box
                  var url = 'http://' + params.ip + ':49000' + params.url;
                  const request = new HttpRequest();
                  request.addHeader('Content-Type', 'text/xml; charset="utf-8"');
                  request.addHeader('SoapAction', action);
                  var response = request.post(url, requestBody);
                  
                  return JSON.stringify(response);
                  

                  Der POST-Request liefert ein 404.
                  Teste ich das mit einem GET gegen die Fritte (z.B. http://192.168.178.1:49000/tr64desc.xml), funktioniert das einwandfrei ... auch mit Port 49000.

                  Wenn ich den hier verwendeten Header und den URL in Postman einsetze, funktioniert das auch problemlos.

                  e6711c35-7202-40db-a29d-5648b80c557a-image.png

                  1 Reply Last reply Reply Quote 0
                  • Codierknecht
                    Codierknecht Developer Most Active last edited by

                    Ich habe mir mal einen kleinen Test-Service gebaut, der bei gleichem Endpunkt & Port sowohl auf GET als auch auf POST horcht.
                    Ergebnis: Funktioniert einwandfrei.
                    Es ist also nicht Zabbix, das hier das Problem verursacht, sondern die Fritte selbst.
                    Irgend etwas fehlt bei meinem Request oder ist falsch.

                    Bin für jede Idee zu haben ...

                    arteck 1 Reply Last reply Reply Quote 0
                    • arteck
                      arteck Developer Most Active @Codierknecht last edited by

                      @codierknecht dann nimm doch den GET

                      Codierknecht 1 Reply Last reply Reply Quote 0
                      • Codierknecht
                        Codierknecht Developer Most Active @arteck last edited by

                        @arteck sagte in [gelöst] - Zabbix (FritzBox etc.):

                        dann nimm doch den GET

                        Das funktioniert nur bei meinem Test-Service.
                        Die Fritte erwartet für TR-064 schon einen POST und einen entsprechenden body.

                        6211c640-da5d-41ba-8d0f-2068b3c79151-image.png

                        1 Reply Last reply Reply Quote 0
                        • Codierknecht
                          Codierknecht Developer Most Active last edited by

                          Des Rätsels Lösung:

                          Die Header für den Request müssen so gesetzt werden:

                          request.setHeader('Content-Type: text/xml');
                          

                          und nicht so:

                          request.setHeader('Content-Type', 'text/xml');
                          

                          Dummerweise wirft die JS-Enginge von Zabbix hier keinen Fehler.

                          Es kann jetzt also an der Ecke weitergehen.
                          Als erstes soll ein Check auf die Portfreigaben eingerichtet werden.
                          Das Abfragen der Fritte über TR-064 ist nämlich deutlich schneller als der Kram über .../xyz.lua.

                          Was fällt euch so alles ein, was sich mit Zabbix an der Fritte monitoren lässt?

                          BananaJoe 1 Reply Last reply Reply Quote 0
                          • BananaJoe
                            BananaJoe Most Active @Codierknecht last edited by

                            @codierknecht das Problem mit Zabbix ist ja das man manchmal einfach in eine Sammelwut verfällt. Ist zwar schön was man alles abrufen kann, aber ob man das braucht ...

                            Up- und Download Auslastung frage ich zum Beispiel meinen Switch hinter der Fritte per SNMP statt der Fritte selbst.

                            Trotzdem nehme ich nur zu gerne dann dein fertiges Template, zum einen als schönes Beispiel, zum anderen weil man das dann auch schön zeigen kann und die Leute damit etwas anfangen können.

                            Du kannst noch die DECT Geräte abfragen usw. Dann bist du irgendwann bei allem was der TR064 und/oder FritzDECT Adapter raussaugt, nur ohne steuern. Kannst dir ja bei den Adapter Inspiration holen.
                            Statistiken zur Verbindung / Fehlerrate werden auch immer gerne genommen. Wobei es da ja DSL, Glasfaser und LTE gäbe.

                            Das Muster-Template kann gerne alles herausholen was es gibt - man kann dann ja das deaktivieren was man nicht braucht bzw. das Template klonen und zusammenstreichen ...

                            1 Reply Last reply Reply Quote 0
                            • Codierknecht
                              Codierknecht Developer Most Active last edited by

                              Der Vollständigkeit halber hier nun das komplette Script in Zabbix, um die Anzahl der Portweiterleitungen zu ermitteln:

                              const params = JSON.parse(value);
                              
                              var requestBody = '<?xml version="1.0" encoding="utf-8"?>' +
                              '<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' +
                              '    <s:Header>' +
                              '        <h:InitChallenge xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1">' +
                              '            <UserID>' + params.username + '</UserID>' +
                              '        </h:InitChallenge>' +
                              '    </s:Header>' +
                              '    <s:Body>' +
                              '        <u:' + params.action + ' xmlns:u="' + params.urn + '" />' +
                              '    </s:Body>' +
                              '</s:Envelope>';
                              
                              const action = params.urn + '#' + params.action;
                              
                              // Initialize challenge with Fritz!Box
                              var url = 'http://' + params.ip + ':49000' + params.url;
                              const request = new HttpRequest();
                              request.addHeader('Content-Type: text/xml; charset="utf-8"');
                              request.addHeader('User-Agent: AVM UPnP/1.0 Client 1.0');
                              request.addHeader('SoapAction: ' + action);
                              var response = request.post(url, requestBody);
                              
                              var statusCode = request.getStatus();
                              if (statusCode != 200) {
                                  throw 'Error ' + statusCode + ' initializing authentication!';
                              } else {
                                  // Calculate authentication
                                  const nonce = XML.query(response, '//Nonce/text()');
                                  const realm = XML.query(response, '//Realm/text()');
                                  const secret = md5(params.username + ':' + realm + ':' + params.password);
                                  const auth = md5(secret + ':' + nonce);
                              
                                  // Get values with authentication
                                  requestBody = '<?xml version="1.0" encoding="utf-8"?>' +
                                  '<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' +
                                  '    <s:Header>' +
                                  '        <h:ClientAuth xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1">' +
                                  '            <Nonce>' + nonce + '</Nonce>' +
                                  '            <Auth>' + auth + '</Auth>' +
                                  '            <UserID>' + params.username + '</UserID>' +
                                  '            <Realm>' + realm + '</Realm>' +
                                  '        </h:ClientAuth>' +
                                  '    </s:Header>' +
                                  '    <s:Body>' +
                                  '        <u:' + params.action + ' xmlns:u="' + params.urn + '" />' +
                                  '    </s:Body>' +
                                  '</s:Envelope>';
                              
                                  response = request.post(url, requestBody);
                                  var statusCode = request.getStatus();
                                  if (statusCode != 200) {
                                      throw 'Error ' + statusCode + ' sending authenticated request!';
                                  } else {
                                      return(XML.query(response, 'number(//NewForwardNumberOfEntries/text())'));
                                  }
                              }
                              

                              Die Parameter "ip", "username" und "password" sollten klar sein.
                              Was zusätzlich noch benötigt wird:
                              "action" = "GetForwardNumberOfEntries"
                              "url" = "/upnp/control/layer3forwarding"
                              "urn" = "urn:dslforum-org:service:Layer3Forwarding:1"

                              Jetzt werde ich nach und nach die Doku von AVM durchgehen, und sehen was da sinnvoll nutzbar ist.
                              Das Ganze werde ich dann als Template für Zabbix veröffentlichen.
                              Wie gesagt: Wer Vorschläge hat, darf die gerne äußern.

                              Aktueller Zwischenstand:
                              840cb744-a6b8-47c2-a467-1e6bae7c8a60-grafik.png

                              1 Reply Last reply Reply Quote 2
                              • Codierknecht
                                Codierknecht Developer Most Active last edited by

                                Here it is:

                                https://github.com/DEV2DEV-DE/zabbix-templates/blob/main/zbx_template_fritzbox.xml

                                04037cb0-8e7d-4c51-a4f1-9686c1042750-image.png

                                BananaJoe 1 Reply Last reply Reply Quote 1
                                • BananaJoe
                                  BananaJoe Most Active @Codierknecht last edited by

                                  @codierknecht argh, Version 6.4. Da müsste ich noch eben warten bis 7.0 raus ist ... ich setze in dem Bereich nur die LTS-Versionen ein.

                                  Codierknecht 2 Replies Last reply Reply Quote 0
                                  • Codierknecht
                                    Codierknecht Developer Most Active @BananaJoe last edited by

                                    @bananajoe sagte in [gelöst] - Zabbix (FritzBox etc.):

                                    Version 6.4

                                    Lässt sich das unter 6.0 importieren, wenn man einfach im XML die Versionsnummer runterdreht?
                                    Oder hat sich zu 6.4 das Format maßgebend geändert?

                                    BananaJoe 1 Reply Last reply Reply Quote 0
                                    • BananaJoe
                                      BananaJoe Most Active @Codierknecht last edited by

                                      @codierknecht Kollege testet gerade 🙂 Könnte reichen, ansonsten sagt er einem was ihn stört

                                      1 Reply Last reply Reply Quote 1
                                      • Codierknecht
                                        Codierknecht Developer Most Active last edited by

                                        Wenn man einmal weiß wie es geht ... wer einen Hammer hat, sieht eine Welt voller Nägel 😀

                                        Mittlerweile sind's > 80 Items 😉
                                        Obwohl so eine Fritte eigentlich recht "unkommunikativ" ist. Kein SNMP, kein Telnet, kein SSH.

                                        1 Reply Last reply Reply Quote 0
                                        • Codierknecht
                                          Codierknecht Developer Most Active @BananaJoe last edited by

                                          @bananajoe sagte in [gelöst] - Zabbix (FritzBox etc.):

                                          Da müsste ich noch eben warten bis 7.0 raus ist

                                          Just for info:
                                          7.0 LTS ist draußen ... 😄

                                          1 Reply Last reply Reply Quote 1
                                          • BananaJoe
                                            BananaJoe Most Active last edited by

                                            Was ist neu in Zabbix 7.0?
                                            https://www.youtube.com/watch?v=60Zy3bw-wOs

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            784
                                            Online

                                            31.6k
                                            Users

                                            79.6k
                                            Topics

                                            1.3m
                                            Posts

                                            6
                                            37
                                            2133
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo