Husemanns Fritzdocsis wiederbeleben

Diskutiere Husemanns Fritzdocsis wiederbeleben im FRITZ!Box für Kabel Internet Forum im Bereich Internet und Telefon bei Unitymedia; Hallo, aufgrund der Probleme der letzten Tage haben ich mir die Sachen auf Github im Bezug auf Fritzbox Kanalparameter-Ausleserei...

MartinP_Do

Beiträge
2.983
Reaktionen
63
Hallo, aufgrund der Probleme der letzten Tage haben ich mir die Sachen auf Github im Bezug auf Fritzbox Kanalparameter-Ausleserei https://github.com/husemann/fritzdocsis noch einmal angeschaut..... und etwas experimentiert

mit ...
Code:
curl "http://192.168.2.1/internet/docsis_info.lua?sid=e5c1232323292cb0" >mist.txt
(sid-Wert ist ein Beispiel, die "sid" muss man vorher zwischen Browser und Fritzbox auswürfeln lassen)

... kann man immer noch die Kanalwerte aus der Fritzbox auslesen lassen. Der Stand auf Github fußt aber auf einer so alten FritzOS Version, dass entweder das Parsen des ausgelesenen (sehr viel Beiwerk enthaltenden) html-Inhalts nicht mehr klappt, oder das Aktiv-Halten der "sid" nicht mehr funktioniert....

Die "sid" bekommt man, indem man sich in der Web-Oberfläche der Fritzbox einloggt, und irgendwo auf eine Unterseiten-Verlinkung rechts-klickt und "Hyperlink Kopieren" auswählt

Das sieht dann so aus

Code:
http://192.168.2.1/?sid=e5c1232323292cb0&lp=inet
So sieht übrigens der horizontal scrollbare Bereich der Tabelle der Downstream-Kanäle aus (mit Notepad++ XML-Erweiterung und der Option "Pretty Print" bearbeitet):
HTML:
 <div id="uiInfo_ds" class="hscrollContainer"> <table class="zebra hscroll"> <tr> <th/> <th>1</th> <th>2</th> <th>3</th> <th>4</th> <th>5</th> <th>6</th> <th>7</th> <th>8</th> <th>9</th> <th>10</th> <th>11</th> <th>12</th> <th>13</th> <th>14</th> <th>15</th> <th>16</th> <th>17</th> <th>18</th> <th>19</th> <th>20</th> <th>21</th> <th>22</th> <th>23</th> <th>24</th> </tr> <tr> <td>&nbsp;</td> <td>24</td> <td>2</td> <td>3</td> <td>4</td> <td>5</td> <td>6</td> <td>7</td> <td>8</td> <td>9</td> <td>10</td> <td>11</td> <td>12</td> <td>13</td> <td>14</td> <td>15</td> <td>16</td> <td>17</td> <td>18</td> <td>19</td> <td>20</td> <td>21</td> <td>22</td> <td>23</td> <td>1</td> </tr> <tr> <td>&nbsp;</td> <td>770</td> <td>554</td> <td>562</td> <td>570</td> <td>578</td> <td>586</td> <td>594</td> <td>602</td> <td>618</td> <td>626</td> <td>634</td> <td>642</td> <td>650</td> <td>658</td> <td>666</td> <td>674</td> <td>682</td> <td>690</td> <td>698</td> <td>706</td> <td>746</td> <td>754</td> <td>762</td> <td>546</td> </tr> <tr> <td>&nbsp;</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> <td>256QAM</td> </tr> <tr> <td>&nbsp;</td> <td>5.7</td> <td>2.5</td> <td>3.9</td> <td>4.0</td> <td>4.5</td> <td>5.1</td> <td>4.7</td> <td>5.0</td> <td>5.2</td> <td>5.8</td> <td>5.2</td> <td>4.9</td> <td>4.9</td> <td>4.2</td> <td>4.5</td> <td>4.6</td> <td>4.6</td> <td>6.2</td> <td>5.7</td> <td>6.1</td> <td>6.2</td> <td>5.9</td> <td>5.2</td> <td>2.9</td> </tr> <tr> <td>&nbsp;</td> <td>-35.6</td> <td>-34.5</td> <td>-34.9</td> <td>-35.1</td> <td>-35.1</td> <td>-35.8</td> <td>-35.1</td> <td>-35.6</td> <td>-35.8</td> <td>-36.4</td> <td>-35.8</td> <td>-35.8</td> <td>-35.6</td> <td>-35.6</td> <td>-35.1</td> <td>-35.1</td> <td>-34.9</td> <td>-35.8</td> <td>-35.6</td> <td>-35.6</td> <td>-35.8</td> <td>-35.8</td> <td>-34.9</td> <td>-34.5</td> </tr> <tr> <td>&nbsp;</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> <td>0.32</td> </tr> <tr> <td>&nbsp;</td> <td>2265</td> <td>39873</td> <td>8437</td> <td>6218</td> <td>5291</td> <td>3231</td> <td>5107</td> <td>3177</td> <td>2449</td> <td>1775</td> <td>2493</td> <td>2422</td> <td>1988</td> <td>2794</td> <td>4854</td> <td>4695</td> <td>7199</td> <td>1278</td> <td>1470</td> <td>1519</td> <td>1224</td> <td>879</td> <td>5082</td> <td>20120</td> </tr> <tr> <td>&nbsp;</td> <td>0</td> <td>5</td> <td>0</td> <td>1</td> <td>0</td> <td>0</td> <td>1</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>2</td> </tr> </table> </div>
 
Zuletzt bearbeitet:

MartinP_Do

Beiträge
2.983
Reaktionen
63
Hier noch ein Experiment

Kanal123456789101112131415161718192021222324
Kanal-ID242345678910111213141516171819202122231
Frequenz [MHz]770554562570578586594602618626634642650658666674682690698706746754762546
Modulation256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM256QAM
Power Level [dBmV]5.72.53.94.04.55.14.75.05.25.85.24.94.94.24.54.64.66.25.76.16.25.95.22.9
MSE [dB]-35.6-34.5-34.9-35.1-35.1-35.8-35.1-35.6-35.8-36.4-35.8-35.8-35.6-35.6-35.1-35.1-34.9-35.8-35.6-35.6-35.8-35.8-34.9-34.5
Latenz [ms]0.320.320.320.320.320.320.320.320.320.320.320.320.320.320.320.320.320.320.320.320.320.320.320.32
korrigierbare Fehler2265398738437621852913231510731772449177524932422198827944854469571991278147015191224879508220120
nicht korrigierbare Fehler050100100000000000000002
 
Zuletzt bearbeitet:

MartinP_Do

Beiträge
2.983
Reaktionen
63
Die Fritzbox Tools habe ich mir schon heruntergeladen, und damit etwas herumgespielt... recht kompliziert ...

Das Projekt von Husemann hatte ich auch einige Zeit auf einer Seagate Dockstar mit Debian am Laufen. Da konnte man sich die Fehlerzähler mit dem eigentlich für Serverüberwachungen gedachten "Munin" als Grafiken im Browser anzeigen lassen... insbesondere als "Bitfehler pro Zeit" und ähnliche abgeleitete Werte...

Wenn man ein paar Mal pro Tag auf die entsprechende Fritzbox - Webseite schaut, kriegt man immer nur Momentaufnahmen, und keinen Verlauf....
Versprach mir durch die nachträglich mögliche zeitliche Zuordnung ggfs. Störern auf die Spur zu kommen, weil ich anhand der Grafiken genau feststellen kann wann die Bitfehlerrate ansteigt und wieder abfällt ...
 
boba

boba

Beiträge
1.019
Reaktionen
196
Ich habe mir eine sehr simple universelle php Bibliothek für die Fritzbox zurechtgestrickt, ausgehend aus derselben Vorgängerbibliothek wie das Husemann Dingens. Authentifizierung ist da komplett neu zu machen. Benutze ich für die Kabel-Werte für eine eigene Auswertung in cacti. Demo siehe hier.
Abfragemodul hier im Quelltext: https://www.wombaz.de/uploads/2018/12/
Am besten die *.tar.gz nehmen, dort drin findet man unter anderem ein fritzbox_api.class.php für den reinen Fritzbox Zugriff und ein ss_fritzbox.php als Nutzer dieser Klasse, die dann auch die docsis URLs abfragt und in php Arrays einliest.
Ist eigentlich als Abfragemodul für cacti gemacht, lässt sich natürlich für andere Auslesefunktionen ausschlachten.

Achtung: Version 1.2.1 ist für die gewohnte horizontale docsis Tabelle bis FritzOS 7.13, und die Version 1.3.0 ist für die neue vertikale docsis Tabelle ab FritzOS 7.19 - die muss völlig anders abgefragt werden. Bis 7.13 ist es als html importierbar, ab 7.19 hingegen als json.
 
  • Gefällt mir
Reaktionen: nightmare28b

MartinP_Do

Beiträge
2.983
Reaktionen
63
Danke, werde ich mir bei Gelegenheit mal anschauen ... in PHP bin ich zwar nicht sehr geschmeidig unterweg, aber wird schon gehen ...
 
boba

boba

Beiträge
1.019
Reaktionen
196
Wenn du das hast, dann zeig doch mal bitte eine Docsis-Grafik, die so ähnlich wie mein Cacti die Fehler, die MSE, und die Powerlevel der ganzen Kanäle darstellt. Ich würde gerne was moderner aussehendes als Cacti einsetzen. Ich kenne Grafana nicht, aber bei Cacti kannst du mit der Maus in den Grafiken hin- und herzoomen. Bei meinen Grafiken kannst du bei einigen bis Anfang 2012 zurückgehen und dir die Daten von damals anzeigen. Sowas sollte auch bei anderen Monitoring-Tools gehen - nur einen Schnappschuss der letzten paar Stunden würde mir nicht reichen.
 
  • Gefällt mir
Reaktionen: nightmare28b

lupus

Beiträge
464
Reaktionen
53
Wird leider noch ne ganze Weile dauern. Habe gemerkt dass man an die Docsis Daten nicht über TR064 rankommt. Man muss also definitiv scrappen. Habe hier ( https://github.com/nohn/monitoring-plugins_check_fritzbox_docsis_parameters ) auch etwas gefunden.

Zu Grafana: Daten von damals kann man sich angucken, man kann Zeitbereiche definieren, wie in Cacti. Reines reinklicken geht (noch?) nicht. Habe eh kaum Daten drin, evtl. müssen mehr Daten rein oder es lässt sich per Plugin erweitern. Wenn man in den Graphen klickt, kann man eine Annotation an der Stelle hinzufügen. Das sollte also theoretisch durch einen Zomm ersetzen lasen.

Schade dass ich mein TC4400 gestern abgebeben habe, da wäre was fertiges vorhanden :D ( )
 
boba

boba

Beiträge
1.019
Reaktionen
196
Ja, die docsis Daten muss man definitiv über die html Oberfläche abgreifen. Sind wirklich nicht via TR064 verfügbar. Hab ich mir auch schon nen Wolf danach gesucht, aber in der offiziellen AVM Doku zu ihrer TR064 Implementation ist davon leider nichts zu finden.
Schau dir meine php Skripte an, da ist das implementiert. In der ss_fritzbox habe ich unter anderem dazu eine Klasse definiert, die die entsprechenden Abfragen in der Box implementiert und die zurückgegebenen Daten intern in ein php Array einträgt. Das solltest du mit wenigen Änderungen nutzen können. Aus Effizienzgründen musste ich für Cacti auch noch ein Caching implementieren. Möglicherweise brauchst du das nicht, wenn collectd sämtliche Kanäle in einer Abfrage in einem Rutsch einlesen würde. Cacti liest immer nur einen einzigen Wert, d.h. für 5 Grafiken (Fehler, MSE, Pegel, Frequenz, Modulation) auf 31 Channels würde er alle 5 Minuten 5*31=155 mal das Webinterface abfragen, wenn man das nicht cachen würde.

Das ist echt keine Raketenwissenschaft, sollte man sicher problemlos auch in andere Skriptsprachen wie python portieren können. Wirklich know-how steckt nur in der Login-Routine drin, um die challenge-response der Fritzbox-Authentifizierung zu implementieren, und in den Namen der abgefragten URLs. Der Rest ist nur Datenhinunherschaufelei und -konvertierung.
Bis Firmware 7.13 gehts mit der Konvertierung so: docsis html Seite->DOM Objekt->xml Objekt->php array. Ab Firmware 7.19 gehts so: docsis json ajax Request->json_decode->php Array.
Bei den Husemann Skripten für FritzOS 5.x waren diese Daten als LUA Tabelle maschinenlesbar verfügbar, also weder html noch json. Da hat AVM von Firmware zu Firmware ständig dran rumgeschraubt, und ich persönlich habe für mein cacti über die Jahre dem allem immer hinterherprogrammiert.
 

omodebach

Beiträge
97
Reaktionen
5
Ich habe mir da schon vor längerer Zeit mal was gebaut:
screencapture-monitoring-fritz-box-3000-d-yV4kK7BWk-kabel-fritz-boxen-2020-05-28-17_51_40.png
Grafana holt sich die Daten aus Prometheus. Dort stammen Sie dann auch wieder aus drei verschiedenen Quellen:
Wenn ab der 7.19/7.20 die DOCSIS-Daten dann als JSON zur Verfügung stehen, muss ich halt mal basteln, das dürfte aber keine Raketenwissenschaft werden.
 

lupus

Beiträge
464
Reaktionen
53
Magst du die Bash Scripte mal zur Verfügung stellen?
 

omodebach

Beiträge
97
Reaktionen
5
Ob die tauglich für die Öffentlichkeit sind? Ich denke eher nicht. Ich musste im Studium zwar auch programmieren lernen, aber das war in einem anderen Jahrtausend und die Programmiererei und ich sind seither nie wirklich Freunde geworden.

ich schaue am WE mal nach der DOCSIS-Geschichte. Kanalauslastung ist ja zur Genüge diskutiert und kommentiert.
 

omodebach

Beiträge
97
Reaktionen
5
Wenn ab der 7.19/7.20 die DOCSIS-Daten dann als JSON zur Verfügung stehen, muss ich halt mal basteln, das dürfte aber keine Raketenwissenschaft werden.
So schnell kann's gehen, es wird dann doch zur Raketenwissenschaft 😂 Gestern gab's das erste 7.19 Labor für die 6660 und jetzt liefert "docsis_info.lua" in der Art, wie ich es bisher immer ausgelesen habe, genau gar nichts mehr.
Code:
[email protected]:~# curl http://fritz.box/internet/docsis_info.lua?sid=$sid
[email protected]:~#
Die SID ist gültig, das kann's nicht sein:
Code:
[email protected]:~# curl "http://fritz.box/data.lua" -d "xhr=1&sid=$sid&lang=de&page=ecoStat&xhrId=all&no_sidrenew"
{"pid":"ecoStat","hide":{"wps":true,"liveTv":true,"tvsd":true,"wGuest":true,"dvbSet":true,"mobile":true,"wKey":true,"ssoSet":true,"tvhd":true,"chan":true,"dvbSig":true,"dvbradio":true},"time":[],"data":{"cputemp":{"series":[["72","73","73","74","73","73","73","73","73","73","73","73","73","73","73","73","73","73","73","73","73","73","74","74","74","74","74","74","74","74","74","75","74","75","74","73","73","73","73","73","73","73","72","73","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","73","72","72","72","72","72","72","72","72","73","72","72","72","72","72","72","72","73","73","72","72","73","73","73","73","73","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","72","71","72","72","72","72","72","72","72","72","72","73","73","72","73","73","73","73","72","73","72","72","72","72","72","72","72","72","71","71","71","72","72","72","73","72","72","72","72","72","73","72","72","72","72","71","71","71","71","71","71","71","71","71","71","71","71","72","71","71","71","71","72","71","71","71","71","71","71","71","71","71","71","71","71","71","71","71","71","71","71","71","71","71","71","71","71","71","71","72","72","72","72","72","72","71","71","71","72","72","71","71","72","72","72","72","72","72","72","73","72","72","72","72","72","72","72","72","71","71","71","71","72","71"]],"labels":[false,false,false,false,false,false,false,false,20,false,false,false,false,false,false,false,false,false,21,false,false,false,false,false,false,false,false,false,22,false,false,false,false,false,false,false,false,false,23,false,false,false,false,false,false,false,false,false,0,false,false,false,false,false,false,false,false,false,1,false,false,false,false,false,false,false,false,false,2,false,false,false,false,false,false,false,false,false,3,false,false,false,false,false,false,false,false,false,4,false,false,false,false,false,false,false,false,false,5,false,false,false,false,false,false,false,false,false,6,false,false,false,false,false,false,false,false,false,7,false,false,false,false,false,false,false,false,false,8,false,false,false,false,false,false,false,false,false,9,false,false,false,false,false,false,false,false,false,10,false,false,false,false,false,false,false,false,false,11,false,false,false,false,false,false,false,false,false,12,false,false,false,false,false,false,false,false,false,13,false,false,false,false,false,false,false,false,false,14,false,false,false,false,false,false,false,false,false,15,false,false,false,false,false,false,false,false,false,16,false,false,false,false,false,false,false,false,false,17,false,false,false,false,false,false,false,false,false,18,false,false,false,false,false,false,false,false,false,19,false]},"cpuutil":{"series":[["12","10","10","10","11","11","11","10","9","10","9","10","10","32","9","21","14","12","11","9","9","10","10","9","10","11","11","11","11","11","11","12","10","9","11","10","9","9","11","9","9","9","8","9","10","10","12","10","9","9","8","9","10","10","9","9","10","10","10","9","9","11","11","9","9","8","9","9","9","11","11","10","8","9","9","8","9","10","20","13","9","9","9","9","9","10","10","8","8","10","8","9","9","9","9","9","9","10","9","14","9","9","9","9","10","8","9","9","9","10","9","10","15","10","14","9","10","10","10","10","8","24","10","15","14","8","9","9","9","9","9","9","9","9","10","9","9","10","13","10","8","9","9","9","12","8","11","9","9","9","8","8","10","9","9","9","9","11","9","11","10","10","10","9","10","12","10","18","9","10","10","9","9","10","11","10","9","9","15","11","9","9","9","11","11","11","9","8","9","16","10","9","10","9","10","14","11","11","10","10","10","9","10","10","10","18","13","9","10","9","12","10","10","10","9","9","11","10","11","10","9","9","9","17","12","23","13","9","14","14","11","24","10","15","9","9","11","14","15","10"],["0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0","0"]],"labels":[false,false,false,false,false,false,false,false,20,false,false,false,false,false,false,false,false,false,21,false,false,false,false,false,false,false,false,false,22,false,false,false,false,false,false,false,false,false,23,false,false,false,false,false,false,false,false,false,0,false,false,false,false,false,false,false,false,false,1,false,false,false,false,false,false,false,false,false,2,false,false,false,false,false,false,false,false,false,3,false,false,false,false,false,false,false,false,false,4,false,false,false,false,false,false,false,false,false,5,false,false,false,false,false,false,false,false,false,6,false,false,false,false,false,false,false,false,false,7,false,false,false,false,false,false,false,false,false,8,false,false,false,false,false,false,false,false,false,9,false,false,false,false,false,false,false,false,false,10,false,false,false,false,false,false,false,false,false,11,false,false,false,false,false,false,false,false,false,12,false,false,false,false,false,false,false,false,false,13,false,false,false,false,false,false,false,false,false,14,false,false,false,false,false,false,false,false,false,15,false,false,false,false,false,false,false,false,false,16,false,false,false,false,false,false,false,false,false,17,false,false,false,false,false,false,false,false,false,18,false,false,false,false,false,false,false,false,false,19,false]},"ramusage":{"series":[[13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,16,13],[39,39.2,39.9,39.7,39.1,39.4,43,43.2,43,43,43,43,43.2,43.5,43.4,43.6,43.5,43.3,43.3,43.3,43.4,43.8,39.4,31.3],[48,47.8,47.1,47.3,47.9,47.6,44,43.8,44,44,44,44,43.8,43.5,43.6,43.4,43.5,43.7,43.7,43.7,43.6,43.2,44.6,55.7]],"labels":[20,21,22,23,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]}},"sid":"59b7012bb5b04731"}
Irgendwie scheint man also "docsis_info.lua" nicht mehr so einfach aufrufen zu können. Oder geht das auf der 6591 und es handelt sich um einen Bug des 6660 Labors? Jemand eine Idee?
 
boba

boba

Beiträge
1.019
Reaktionen
196
Ab der 7.19 werden alle (oder fast alle, oder zumindest sehr viele) Werte in der Weboberfläche über json ajax Requests befüllt. Die kommen als json-formatierter Text über /data.lua. Welche Info geliefert wird, bestimmt der page=<keyword> Parameter.

Die docsis Info kommt über diese URL:
/data.lua?xhr=1&reload=&lang=de&page=docInfo&sid=xxxxxxxxx

Rausfinden kann man die Keywords mit Chrome, wenn man im Kontext-Menü der Seite->Untersuchen anwählt und dann in der Developer-Konsole auf den Tab Network geht. Die meisten Daten werden regelmäßig refresht, da sieht man dann alle paar Sekunden einen neuen Request und kann genau schauen, was requestet wurde und was zurückgegeben wurde.
 
Zuletzt bearbeitet:

omodebach

Beiträge
97
Reaktionen
5
Danke @boba für das Schubsen in die richtige Richtung. Bei Deiner vorherigen Aussage, dass die Daten jetzt per JSON zur Verfügung stehen, hätte ich eigentlich auch von selbst drauf kommen können, dass ich /data.lua anzapfen muss.

Auch die Erklärung, wie man an die Keywords kommt, war sehr aufschlussreich.

Das Script sieht jetzt so aus:
Bash:
#!/bin/bash
fritzbox=$1
user=<username>
pass=<password>
sidfile=/dev/shm/$fritzbox.sid
if [ ! -f $sidfile ]; then touch $sidfile
fi
sid=$(cat $sidfile)
# Pruefen, ob aktueller Login gültig ist, ansonsten neue SID erzeugen
result=$(curl -s "http://$fritzbox/login_sid.lua?sid=$sid" | grep -c "0000000000000000")
if [ $result -gt 0 ]; then challenge=$(curl -s http://$fritzbox/login_sid.lua | grep -o "<Challenge>[a-z0-9]\{8\}" | cut -d'>' -f 2) hash=$(echo -n "$challenge-$pass" |sed -e 's,.,&\n,g' | tr '\n' '\0' | md5sum | grep -o "[0-9a-z]\{32\}") curl -s "http://$fritzbox/login_sid.lua" -d "response=$challenge-$hash" -d 'username='${user} | grep -o "<SID>[a-z0-9]\{16\}" | cut -d'>' -f 2 > $sidfile
fi
sid=$(cat $sidfile)
# DOCSIS-Infos holen und in Variable ablegen
docsis=$(curl -s "http://$fritzbox/data.lua" -d "xhr=1&sid=$sid&lang=de&page=docInfo&xhrId=all&no_sidrenew")
# Globale Daten holen
energy=$(curl -s "http://$fritzbox/data.lua" -d "xhr=1&sid=$sid&lang=de&page=ecoStat&xhrId=all&no_sidrenew")
# Ausgabedatei anlegen
if [ -f "/tmp/fritzcable.txt" ]; then rm /tmp/fritzcable.txt
fi
touch /tmp/fritzcable.txt
# Anzahl Upstream-Kanäle ermitteln
kanaeleup=$(/usr/bin/echo ${docsis} | /usr/bin/jq ".data.channelUs.docsis30[].powerLevel" | wc -l)
# Anzahl Downstream-Kanäle ermitteln
kanaeledown=$(/usr/bin/echo ${docsis} | /usr/bin/jq ".data.channelDs.docsis30[].powerLevel" | wc -l)
# Upstream-Werte ermitteln und in Prometheus-Syntax ausgeben
for (( c=0; c<=$kanaeleup-1; c++ )); do FreqUp[$c]=$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelUs.docsis30[$c].frequency") echo "# HELP fritzbox_cable_powerup"${FreqUp[$c]}" Upstream "${FreqUp[$c]}" MHz Powerlevel" >> /tmp/fritzcable.txt echo "# TYPE fritzbox_cable_powerup"${FreqUp[$c]}" gauge" >> /tmp/fritzcable.txt echo "fritzbox_cable_powerup"${FreqUp[$c]}" "$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelUs.docsis30[$c].powerLevel") >> /tmp/fritzcable.txt echo "# HELP fritzbox_cable_modulationup"${FreqUp[$c]}" Upstream "${FreqUp[$c]}" MHz Modulation" >> /tmp/fritzcable.txt echo "# TYPE fritzbox_cable_modulationup"${FreqUp[$c]}" gauge" >> /tmp/fritzcable.txt echo "fritzbox_cable_modulationup"${FreqUp[$c]}" "$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelUs.docsis30[$c].type" | cut -d 'Q' -f 1) >> /tmp/fritzcable.txt
done
# Downstream-Werte ermitteln und in Prometheus-Syntax ausgeben
for (( c=0; c<=$kanaeledown-1; c++ )); do FreqDown[$c]=$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelDs.docsis30[$c].frequency") echo "# HELP fritzbox_cable_powerdown"${FreqDown[$c]}" Downstream "${FreqDown[$c]}" MHz Powerlevel" >> /tmp/fritzcable.txt echo "# TYPE fritzbox_cable_powerdown"${FreqDown[$c]}" gauge" >> /tmp/fritzcable.txt echo "fritzbox_cable_powerdown"${FreqDown[$c]}" "$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelDs.docsis30[$c].powerLevel") >> /tmp/fritzcable.txt echo "# HELP fritzbox_cable_snr"${FreqDown[$c]}" Downstream "${FreqDown[$c]}" MHz SNR" >> /tmp/fritzcable.txt echo "# TYPE fritzbox_cable_snr"${FreqDown[$c]}" gauge" >> /tmp/fritzcable.txt echo "fritzbox_cable_snr"${FreqDown[$c]}" "$(/usr/bin/echo ${docsis} | echo "scale=0 ; $(/usr/bin/jq -r ".data.channelDs.docsis30[$c].mse") * -1" | bc) >> /tmp/fritzcable.txt echo "# HELP fritzbox_cable_latency"${FreqDown[$c]}" Downstream "${FreqDown[$c]}" MHz Latenz" >> /tmp/fritzcable.txt echo "# TYPE fritzbox_cable_latency"${FreqDown[$c]}" gauge" >> /tmp/fritzcable.txt echo "fritzbox_cable_latency"${FreqDown[$c]}" "$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelDs.docsis30[$c].latency") >> /tmp/fritzcable.txt echo "# HELP fritzbox_cable_correctables"${FreqDown[$c]}" Downstream "${FreqDown[$c]}" MHz Correctables" >> /tmp/fritzcable.txt echo "# TYPE fritzbox_cable_correctables"${FreqDown[$c]}" gauge" >> /tmp/fritzcable.txt echo "fritzbox_cable_correctables"${FreqDown[$c]}" "$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelDs.docsis30[$c].corrErrors") >> /tmp/fritzcable.txt echo "# HELP fritzbox_cable_uncorrectables"${FreqDown[$c]}" Downstream "${FreqDown[$c]}" MHz Uncorrectables" >> /tmp/fritzcable.txt echo "# TYPE fritzbox_cable_uncorrectables"${FreqDown[$c]}" gauge" >> /tmp/fritzcable.txt echo "fritzbox_cable_uncorrectables"${FreqDown[$c]}" "$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelDs.docsis30[$c].nonCorrErrors") >> /tmp/fritzcable.txt
done
# System-Werte ermitteln und ausgeben
echo "# HELP fritzbox_cable_cpuusage Fritzbox CPU Usage" >> /tmp/fritzcable.txt
echo "# TYPE fritzbox_cable_cpuusage gauge" >> /tmp/fritzcable.txt
echo "fritzbox_cable_cpuusage "$(/usr/bin/echo ${energy} | /usr/bin/jq -r '.data.cpuutil.series[0] | last') >> /tmp/fritzcable.txt
echo "# HELP fritzbox_cable_cputemp Fritzbox CPU Temperature" >> /tmp/fritzcable.txt
echo "# TYPE fritzbox_cable_cputemp gauge" >> /tmp/fritzcable.txt
echo "fritzbox_cable_cputemp "$(/usr/bin/echo ${energy} | /usr/bin/jq -r '.data.cputemp.series[0] | last') >> /tmp/fritzcable.txt
echo "# HELP fritzbox_cable_ramfree Fritzbox RAM Free" >> /tmp/fritzcable.txt
echo "# TYPE fritzbox_cable_ramfree gauge" >> /tmp/fritzcable.txt
echo "fritzbox_cable_ramfree "$(/usr/bin/echo ${energy} | /usr/bin/jq -r '.data.ramusage.series[2] | last') >> /tmp/fritzcable.txt
Das geht bestimmt besser / eleganter, aber wie schon erwähnt bin ich Admin, kein Coder.

Am Ende stehen alle Werte in Prometheus-Syntax in der Datei "/tmp/fritzcable.txt", die man dann einfach über den XINETD als "Prometheus Exporter" zur Verfügung stellen kann (https://apawel.me/exporting-prometheus-metrics-with-bash-scripts/).
 

MartinP_Do

Beiträge
2.983
Reaktionen
63
Naja, auch wenn die 7.12 auf meiner 6490 (lgi) Leihbox wahrscheinlich noch etwas verbleiben wird, bevor da eine 7.19 aufgespielt wird, ist das Beschäftigen mit dem alten Format der Übergabe der Messwerte dann doch mehr oder weniger nur von kurzfristigem Nutzen ... schade ...
 

lupus

Beiträge
464
Reaktionen
53
Vielen Dank @omodebach ! Die Challenge funktioniert bei mir mit der 6660 nicht, aber wenn ich temporär eine passende sid in /dev/shm* eintrage bekomme ich die Daten raus. Wenn ich morgen Zeit finde, schaue ich mir das mal genauer mit der Challenge an.
 

omodebach

Beiträge
97
Reaktionen
5
Das Erzeugen der SID funktioniert bei mir mit einer 6660, einer 7530, zwei 7430 und zwei 7490, daher bin ich sicher, dass der Code so passt. Mir fällt aber auf, dass die Formatierung des Codes kaputt ist, da fehlen Zeilenumbrüche.

Bash:
#!/bin/bash
fritzbox=$1
user=<username>
pass=<password>
sidfile=/dev/shm/$fritzbox.sid
if [ ! -f $sidfile ]; then touch $sidfile
fi
sid=$(cat $sidfile)
# Pruefen, ob aktueller Login gültig ist, ansonsten neue SID erzeugen
result=$(curl -s "http://$fritzbox/login_sid.lua?sid=$sid" | grep -c "0000000000000000")
if [ $result -gt 0 ]; then challenge=$(curl -s http://$fritzbox/login_sid.lua | grep -o "<Challenge>[a-z0-9]\{8\}" | cut -d'>' -f 2) hash=$(echo -n "$challenge-$pass" |sed -e 's,.,&\n,g' | tr '\n' '\0' | md5sum | grep -o "[0-9a-z]\{32\}") curl -s "http://$fritzbox/login_sid.lua" -d "response=$challenge-$hash" -d 'username='${user} | grep -o "<SID>[a-z0-9]\{16\}" | cut -d'>' -f 2 > $sidfile
fi
sid=$(cat $sidfile)
# DOCSIS-Infos holen und in Variable ablegen
docsis=$(curl -s "http://$fritzbox/data.lua" -d "xhr=1&sid=$sid&lang=de&page=docInfo&xhrId=all&no_sidrenew")
# Globale Daten holen
energy=$(curl -s "http://$fritzbox/data.lua" -d "xhr=1&sid=$sid&lang=de&page=ecoStat&xhrId=all&no_sidrenew")
# Ausgabedatei anlegen
if [ -f "/tmp/fritzcable.txt" ]; then rm /tmp/fritzcable.txt
fi
touch /tmp/fritzcable.txt
# Anzahl Upstream-Kanäle ermitteln
kanaeleup=$(/usr/bin/echo ${docsis} | /usr/bin/jq ".data.channelUs.docsis30[].powerLevel" | wc -l)
# Anzahl Downstream-Kanäle ermitteln
kanaeledown=$(/usr/bin/echo ${docsis} | /usr/bin/jq ".data.channelDs.docsis30[].powerLevel" | wc -l)
# Upstream-Werte ermitteln und in Prometheus-Syntax ausgeben
for (( c=0; c<=$kanaeleup-1; c++ )); do FreqUp[$c]=$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelUs.docsis30[$c].frequency") echo "# HELP fritzbox_cable_powerup"${FreqUp[$c]}" Upstream "${FreqUp[$c]}" MHz Powerlevel" >> /tmp/fritzcable.txt echo "# TYPE fritzbox_cable_powerup"${FreqUp[$c]}" gauge" >> /tmp/fritzcable.txt echo "fritzbox_cable_powerup"${FreqUp[$c]}" "$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelUs.docsis30[$c].powerLevel") >> /tmp/fritzcable.txt echo "# HELP fritzbox_cable_modulationup"${FreqUp[$c]}" Upstream "${FreqUp[$c]}" MHz Modulation" >> /tmp/fritzcable.txt echo "# TYPE fritzbox_cable_modulationup"${FreqUp[$c]}" gauge" >> /tmp/fritzcable.txt echo "fritzbox_cable_modulationup"${FreqUp[$c]}" "$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelUs.docsis30[$c].type" | cut -d 'Q' -f 1) >> /tmp/fritzcable.txt
done
# Downstream-Werte ermitteln und in Prometheus-Syntax ausgeben
for (( c=0; c<=$kanaeledown-1; c++ )); do FreqDown[$c]=$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelDs.docsis30[$c].frequency") echo "# HELP fritzbox_cable_powerdown"${FreqDown[$c]}" Downstream "${FreqDown[$c]}" MHz Powerlevel" >> /tmp/fritzcable.txt echo "# TYPE fritzbox_cable_powerdown"${FreqDown[$c]}" gauge" >> /tmp/fritzcable.txt echo "fritzbox_cable_powerdown"${FreqDown[$c]}" "$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelDs.docsis30[$c].powerLevel") >> /tmp/fritzcable.txt echo "# HELP fritzbox_cable_snr"${FreqDown[$c]}" Downstream "${FreqDown[$c]}" MHz SNR" >> /tmp/fritzcable.txt echo "# TYPE fritzbox_cable_snr"${FreqDown[$c]}" gauge" >> /tmp/fritzcable.txt echo "fritzbox_cable_snr"${FreqDown[$c]}" "$(/usr/bin/echo ${docsis} | echo "scale=0 ; $(/usr/bin/jq -r ".data.channelDs.docsis30[$c].mse") * -1" | bc) >> /tmp/fritzcable.txt echo "# HELP fritzbox_cable_latency"${FreqDown[$c]}" Downstream "${FreqDown[$c]}" MHz Latenz" >> /tmp/fritzcable.txt echo "# TYPE fritzbox_cable_latency"${FreqDown[$c]}" gauge" >> /tmp/fritzcable.txt echo "fritzbox_cable_latency"${FreqDown[$c]}" "$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelDs.docsis30[$c].latency") >> /tmp/fritzcable.txt echo "# HELP fritzbox_cable_correctables"${FreqDown[$c]}" Downstream "${FreqDown[$c]}" MHz Correctables" >> /tmp/fritzcable.txt echo "# TYPE fritzbox_cable_correctables"${FreqDown[$c]}" gauge" >> /tmp/fritzcable.txt echo "fritzbox_cable_correctables"${FreqDown[$c]}" "$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelDs.docsis30[$c].corrErrors") >> /tmp/fritzcable.txt echo "# HELP fritzbox_cable_uncorrectables"${FreqDown[$c]}" Downstream "${FreqDown[$c]}" MHz Uncorrectables" >> /tmp/fritzcable.txt echo "# TYPE fritzbox_cable_uncorrectables"${FreqDown[$c]}" gauge" >> /tmp/fritzcable.txt echo "fritzbox_cable_uncorrectables"${FreqDown[$c]}" "$(/usr/bin/echo ${docsis} | /usr/bin/jq -r ".data.channelDs.docsis30[$c].nonCorrErrors") >> /tmp/fritzcable.txt
done
# System-Werte ermitteln und ausgeben
echo "# HELP fritzbox_cable_cpuusage Fritzbox CPU Usage" >> /tmp/fritzcable.txt
echo "# TYPE fritzbox_cable_cpuusage gauge" >> /tmp/fritzcable.txt
echo "fritzbox_cable_cpuusage "$(/usr/bin/echo ${energy} | /usr/bin/jq -r '.data.cpuutil.series[0] | last') >> /tmp/fritzcable.txt
echo "# HELP fritzbox_cable_cputemp Fritzbox CPU Temperature" >> /tmp/fritzcable.txt
echo "# TYPE fritzbox_cable_cputemp gauge" >> /tmp/fritzcable.txt
echo "fritzbox_cable_cputemp "$(/usr/bin/echo ${energy} | /usr/bin/jq -r '.data.cputemp.series[0] | last') >> /tmp/fritzcable.txt
echo "# HELP fritzbox_cable_ramfree Fritzbox RAM Free" >> /tmp/fritzcable.txt
echo "# TYPE fritzbox_cable_ramfree gauge" >> /tmp/fritzcable.txt
echo "fritzbox_cable_ramfree "$(/usr/bin/echo ${energy} | /usr/bin/jq -r '.data.ramusage.series[2] | last') >> /tmp/fritzcable.txt
In der Vorschau sieht's jetzt richtig aus. Das müssen incl. der Leerzeilen 86 Zeilen sein.
 
  • Gefällt mir
Reaktionen: lupus

lupus

Beiträge
464
Reaktionen
53
Danke, das lag tatsächlich an der Formattierung. Der Challenge funktioniert nun auch.

Die Formattierung hier im Forum ist kaputt. Man muss deinen Beitrag zitieren und dann den Code entweder direkt im Text kopieren oder aus der Vorschau.
 
  • Gefällt mir
Reaktionen: nightmare28b

nightmare28b

Beiträge
43
Reaktionen
1
Moin eigentlich sehr cool.
Aber irgendwie frisst mein RPi mit aktuellsten Buster das Skript nicht.

Bash:
./fritzboxcable.sh
./fritzboxcable.sh: Zeile 29: /usr/bin/echo: Datei oder Verzeichnis nicht gefunden
0
./fritzboxcable.sh: Zeile 32: /usr/bin/echo: Datei oder Verzeichnis nicht gefunden
./fritzboxcable.sh: Zeile 65: /usr/bin/echo: Datei oder Verzeichnis nicht gefunden
./fritzboxcable.sh: Zeile 68: /usr/bin/echo: Datei oder Verzeichnis nicht gefunden
./fritzboxcable.sh: Zeile 71: /usr/bin/echo: Datei oder Verzeichnis nicht gefunden
ich habe die Null ausgeben lassen, durch "echo $kanaeleup".
aber jq parst quasi die vorliegende $docsis Datenstruktur nicht richtig, obwohl die $docsis Datenstruktur richtig ausgelesen wird.

Im normalen Ubuntu 20.04 Linux läuft das Skript 1a ab :)

muss wohl einmal ubuntu auf dem RPi probieren...
 
Zuletzt bearbeitet:

omodebach

Beiträge
97
Reaktionen
5
Da hast Du doch schon des Rätsels Lösung: ersetze /usr/bin/echo durch /bin/echo
 

nightmare28b

Beiträge
43
Reaktionen
1
which echo
/bin/echo

teste aber gerade ubuntu 20.04 server, wenn das geht muss es nicht via raspbian laufen....
unter 20.04 auf dem rpi
[email protected]:~$ which echo
/usr/bin/echo
aber es kommen auch die Fehlermeldungen...
./fritzboxcable.sh: line 29: /usr/bin/jq: No such file or directory
./fritzboxcable.sh: line 31: /usr/bin/jq: No such file or directory
./fritzboxcable.sh: line 64: /usr/bin/jq: No such file or directory
./fritzboxcable.sh: line 67: /usr/bin/jq: No such file or directory
./fritzboxcable.sh: line 70: /usr/bin/jq: No such file or directory
 
Thema:

Husemanns Fritzdocsis wiederbeleben