[Problem] TR-064 Traffic-Abfrage liefert nur den Wert seit dem letzten Connect

MegaV0lt

Neuer User
Mitglied seit
11 Sep 2005
Beiträge
61
Punkte für Reaktionen
2
Punkte
8
Ich möchte unter Linux (Bash) Den Traffic das aktuellen Monats abfragen. Dazu habe ich folgendes Skript gemacht:
Code:
f_linkspeed(){
  curl --silent 'http://192.168.178.1:49000/igdupnp/control/WANCommonIFC1' \
    --header 'Content-Type: text/xml; charset="utf-8"' \
    --header 'SoapAction:urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetAddonInfos' \
    --data "@${SELF_DIR}/linkspeed.xml" \
    --output "${CONKY_DATA}/linkspeed.xml"

  #<NewTotalBytesSent>563413522</NewTotalBytesSent>
  #<NewTotalBytesReceived>2093566249</NewTotalBytesReceived>
  SENT="$(grep '<NewTotalBytesSent>' "${CONKY_DATA}/linkspeed.xml")"
  RECIEVED="$(grep '<NewTotalBytesRecieved>' "${CONKY_DATA}/linkspeed.xml")"
  SENT="${SENT%\<\/*}" ; SENT="${SENT#*\>}" # "*>" und "</*" entfernen
  RECIEVED="${RECIEVED%\<\/*}" ; RECIEVED="${RECIEVED#*\>}" # "*>" und "</*" entfernen
  TOTAL=$((SENT + RECIEVED))
  numfmt --to=iec-i --suffix=B --format='%.2f' "$TOTAL" > "${CONKY_DATA}/traffic"
}
Inhalt der linkspeed.xml:
Code:
<?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:Body>
            <u:GetCommonLinkProperties xmlns:u="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1" />
        </s:Body>
    </s:Envelope>

Problem ist, dass anscheinend die Werte NewBytes... nur den Verkehr seit dem letzten DSL-Login ausgeben. Ich bräuchte aber die Werte aktueller Monat:
1505205992.png
 
Meines Wissens gibt es im TR-064-Interface keine derartige Funktion ... das ist halt der Zugriff auf das (Netzwerk-)Interface und dessen Eigenschaften (das wird auch neu initialisiert bei der DSL-Anmeldung) und nicht auf die Nutzungsstatistik der Onlineverbindung.

Die kumulierten Werte werden in der "stat.cfg" gesammelt - wenn man nicht an das GUI gehen will, ist das ggf. ein Weg (der auch über TR-064 funktioniert, wenn man keine "aktuellen" Daten braucht und die 2FA nicht aktiv ist) - indem man die aus einer Sicherungsdatei klamüsert.

Die Daten in dieser Tabelle stehen tatsächlich noch direkt in der HTML-Response und werden nicht per JSON-Notation irgendwo als Objekt übermittelt und können damit auch nicht ohne weiteres "aktualisiert" werden (daher dürfte sich die Anzeige ohne manuelles Refresh auch nicht ändern, wenn wieder ein weiteres MB dazugekommen ist).
 
@eisbaerin:
Da hast Du absolut recht (shame on me) ... da steht nur die "userstat.cfg" drin mit "aktuellem Verbrauch" für limitierte Nutzer.

Ich hätte mich erst überzeugen sollen ... ich benutze halt selbst nur noch tbackup für die Sicherung von Einstellungen.

BTW ... hast Du die Stelle mit der Info-Mail nun gefunden? Ist hier ja nur leicht OT, denn es geht immerhin auch um die "Online-Zähler".-
 
Apropos (2FA)

Selbst wenn diese Daten in der Sicherungsdatei stehen würden, müsste die "Bestätigt" werden.
...was wiederrum für die Supportdaten nicht notwendig ist.
...aber für die "Erweiterten Supportdaten"*
Wo stehen die Daten jetzt noch mal genau ?

* Fritz!OS 6.88-XXXXX Labor
 
Die stehen schon in der Support-Datei (da werden ja viele TFFS-Nodes mit Endung ".cfg" im Text aufgeführt, siehe /bin/supportdata) ... aber das wäre dann wieder Quatsch, weil man die wieder nur über das GUI auslesen kann und dann kann man auch gleich "scraping" im HTML-Code der Seite betreiben. Ich würde ja ohnehin eine neue Seite hinzufügen, die mir die Daten direkt als JSON-Objekt liefert und wo man nicht im HTML suchen muß und einem AVM nicht mit Änderungen an der Seite in die Parade fahren kann ... die internen Variablen sind sicherlich "stabiler" als der HTML-Code in der Seite.

Spaßig wäre es nur, wenn man die Support-Daten über TR-069 auslesen würde (da gibt es die wieder) ... allerdings wird das dann ohne eigenen ACS (oder zumindest eine "Rumpfform" eines solchen, die nach INFORM-Requests der Box dann den Upload-Request für die Support-Datei sendet) wieder nicht funktionieren. Aber das wäre doch mal eine "kreative Nutzung" von TR-069 durch den Besitzer einer Box ... der ACS darf jedenfalls auch über die LAN-Seite der FRITZ!Box erreichbar sein, der muß sich nicht im WAN befinden.
 
Ich weiß das nur zu gut, daß die nicht in der Sicherungsdatei stehen, da ich schon 'zig mal darauf reingefallen bin, und trotzdem wird es mir wieder mal passieren:

Sicherungsdatei erstellt, irgend was ausprobiert, Sicherung wieder eingespielt, und ich dachte es wäre alles so wie vorher - Pustekuchen, die Online-Zähler sind weg!

Warum AVM die nicht mit sichert wird wohl deren ewiges Geheimnis bleiben.

Gibt es eine Möglichkeit die wieder zu setzen?


ich benutze halt selbst nur noch tbackup für die Sicherung von Einstellungen.
Wie benutzt man das? Auf einer 7362SL und 7580 bekomme ich folgenden Fehler:
line 26: syntax error: unexpected "else" (expecting "then")

hast Du die Stelle mit der Info-Mail nun gefunden?
Ja, läuft bei mir. Dazu schreibe ich dir im anderen Thema.

@koyaanisqatsi: Ich gratuliere zur neuen FB (Avatar).
 
Zuletzt bearbeitet:
Wie benutzt man das? Auf einer 7362SL und 7580 bekomme ich folgenden Fehler:

Code:
line 26: syntax error: unexpected "else" (expecting "then")

Könntest Du mal das Skript wie folgt starten: /bin/sh -x tbackup
dann sollte der Fehler genauer lokalisierbar sein.
 
könntest Du mal die Zeile "if find_executable "decode_secrets" then" wie folgt anpassen:

Code:
diff  tbackup._save_  tbackup
--- tbackup._save_
+++ tbackup
@@ -19,7 +19,8 @@
                checkempty $td/cdev >/dev/null 2>&1
                if [ $? -ne 0 ]; then
                        if grep -q '$$$$[A-Z1-6]*' $td/cdev 2>/dev/null; then
-                               if find_executable "decode_secrets" then
+                               find_executable "decode_secrets"
+                               if [ $? -ne 0 ]; then
                                        printf "\x1B[5m decoding content\x1B[25m" 1>&2
                                        decode_secrets $td/cdev >$td/$minor
                                        decoded=",decoded=1"
und dann testen
 
Zuletzt bearbeitet:
if find_executable "decode_secrets" then
IMO fehlt im Original dort ein Semikolon vor "then":
if find_executable "decode_secrets"; then
 
Ja, da habe ich in der Version im Repo einfach ein Semikolon versaubeutelt, als ich die Suche nach dem "decode_secrets" geändert habe, denn vorher war das nur ein "if [ -x decode_secrets ]", IIRC.

Das muß in der Zeile eigentlich so aussehen:

if find_executable "decode_secrets"; then

(kein CODE-Tag, weil da farbig nicht geht) - korrigiere ich nachher gleich noch.

Das Skript sichert alle TFFS-Nodes mit Inhalt (also wirklich alle, egal ob die ein char-Device zugeordnet haben oder nicht - es wird von 1 bis 255 hochgezählt) in ein TAR-File, was anschließend auf STDOUT ausgegeben wird .. man sollte also die Ausgabe in eine Datei umleiten. Die Anzeige der Nodes erfolgt auf STDERR, man kann das also auch nach "/dev/null" umleiten und dann geht das auch im "Batch-Betrieb".

Kann es mein Programm zum Entschlüsseln von Einstellungen finden, werden die vor der Sicherung auch entschlüsselt ... um die Sicherheit der enthaltenen Daten kann man sich kümmern, indem man z.B. das TAR-File dann irgendwie verschlüsselt.

Dieses Vorgehen, wirklich jeden Node zu sichern, der irgendeinen Inhalt hat, sorgt auch dafür, daß von der Box selbst generierte Zertifikate und Keys mit gesichert werden, die fehlen bei AVM auch in der Export-Datei und noch einiges anderes - wer es genau wissen will, kann ja mal die Ausgabe von "tlist" (liegt auch im YourFritz-Repo, die "tffs.files" nicht vergessen, wenn man es einzeln kopiert) mit dem Inhalt einer Sicherungsdatei von AVM vergleichen ... das "tlist" verwende ich halt auch immer, um irgendwelche "versteckten" Settings als Resultat eines ggf. erfolgreichen Angriffs zu finden. Läuft zwar nur auch der Box selbst, ist aber "handlicher" als das externe Zerlegen eines TFFS-Dumps, wo das natürlich auch alles "nachzulesen" wäre.

PS: Wer "tlist" probiert ... das ist ein "vi", der am Ende für die Ausgabe aufgerufen wird; also mit ":q" zu verlassen.
 
Ok, über TR-064 geht es wohl nicht.
Ich brauche nur den einen Wert. Der steht auch auf der Startseite (Nach dem Login). Wie komme ich da am besten dran? SSH, Telnet oder HTML-Seite auslesen?
 
Im Prinzip wäre es wohl am Einfachsten die HTML gleich mit einer SSID, z.B. vorher mit SOAP/TR-064 geholt/validiert/geprüft, zu holen und auszuwerten.
 
Zuletzt bearbeitet:
Gibt es dafür ein Beispiel? Ich habe da leider nicht so viel Ahnung
 
@koy:
Ich kaufe Dir ein "S" ab ... dann hat @MegaV0lt auch ein funktionierendes Stichwort für die Suche nach passenden Beiträge mit der Xenforo-eigenen Suchfunktion. Die Suche über "externe" Suchmaschinen (zumindest eine ohne explizite "site:"-Beschränkung) kann man ja nicht mehr als eigenen "Beweis" heranziehen und irgendjemandem "zum Vorwurf machen". (Trotzdem werde ich mich nicht davon überzeugen lassen, daß man bei eigenen Antworten jetzt immer selbst dafür zuständig ist, auch noch die passenden Links herauszusuchen.)

@MegaV0lt:
Das hängt ja nun auch ganz stark davon ab, was Du da nun wirklich auslesen willst ... und wenn das auch auf der Übersichtsseite stehen sollte, dann bräuchte es vielleicht ein weiteres Bild. Ich finde jedenfalls bei einer 7490 in der "Übersicht" (und diese Seite hat sich auch in der Labor-Version praktisch nicht geändert) keine Stelle (hängt ggf. auch von Einstellungen ab), wo irgendwelche Angaben zur bisher im Monat übertragenen Datenmenge oder zur "Online-Zeit" stehen würden.

Da diese Seite sich ja automatisch aktualisiert, gibt es hier tatsächlich die Chance, daß man die gesuchten Daten irgendwo in einem JSON-Objekt in einer Antwort findet ... dazu muß man aber erst mal wissen, wonach man/Du nun wirklich such(s)t.
 
  • Like
Reaktionen: koyaanisqatsi
Kein Problem. Der "Beweis":
1505293439.png


Könnte sein, dass der Wert erst erscheint, wenn man auch einen "Tarif" einstellt...
Ich brauche nur den einen Wert (Als Bonus den zweiten, der aber immer fest ist)
 
Die gesuchte Zeichenkette (deshalb sind da dann auch automatisch beide Zahlen enthalten) steht nach einem Aufruf von "data.lua" (der aber als POST-Request erfolgen muß) mit "page=overview" in den zurückgelieferten JSON-Daten ... im Objekt "data.comfort.func[x]" (data.comfort.func ist ein Array von Objekten), wobei man den gesuchten Wert (das "x" ist nicht fest, sondern von der Anzahl der Anzeigen bei den "Komfortfunktionen" abhängig und da sollte man keinen festen Index beim Auslesen verwenden) daran erkennen kann, daß er (es ist ja ein weiteres Objekt, mit verschiedenen Properties) in seiner Eigenschaft "link" die Zeichenkette "netCnt" enthält. Das gesuchte Ergebnis steht dort dann in der Eigenschaft "details". Das ist auch - mit einem JSON-Parser in der verwendeten Programmierumgebung - relativ leicht zu durchsuchen ... für Shell-Code gibt es irgendwo einen, der u.a. auch in einem anderen Thread hier Thema war/ist, wo es um das Auslesen und Sichern des Event-Logs einer Box geht.

Die vollständigen Parameter für den POST-Request ("curl" kann das dann auch zu allem Überfluß wirklich als "POST" senden und man muß gar keine Kopfstände weiter machen, wie es bei "wget" (der BusyBox) der Fall wäre) würden so aussehen:

xhr=1&lang=de&page=overview&xhrId=first&noMenuRef=1&no_sidrenew=&sid=<sid>

wobei natürlich das "<sid>" durch einen gültigen Wert zu ersetzen ist. Die aufzurufende Seite ist - wie oben schon angemerkt - die "data.lua". Einige Parameter kann man ggf. wieder auslassen ... welche genau, mußt Du selbst testen oder Du gibst einfach alle mit an.
 
Ich habe nun den Wert aus dem Webinterface so ausgelesen bekommen:
Code:
f_fbtraffic(){
  avmfbip=${tempip:-fritz.box}
  avmfbuser=${tempuser:-'xxx'}
  avmfbpwd=${temppwd:-'xxx'}
  avmsidfile=${tempid:-/dev/shm/~avmsid}
  REQUESTPAGE='/internet/inetstat_counter.lua'
  OUTPUTFILE='/dev/shm/~fbout.html'

  if [ ! -f $avmsidfile ]; then
    touch $avmsidfile
  fi

  avmsid=$(cat $avmsidfile)

  # check if current login is valid, otherwise generate session id
  result=$(curl -s "http://$avmfbip/login_sid.lua?sid=$avmsid" | grep -c "0000000000000000")

  if [ $result -gt 0 ]; then
      echo "Login neccessary"
      challenge=$(curl -s http://$avmfbip/login_sid.lua |  grep -o "<Challenge>[a-z0-9]\{8\}" | cut -d'>' -f 2)
      hash=$(echo -n "$challenge-$avmfbpwd" |sed -e 's,.,&\n,g' | tr '\n' '\0' | md5sum | grep -o "[0-9a-z]\{32\}")
      curl -s "http://$avmfbip/login_sid.lua" -d "response=$challenge-$hash" -d 'username='${avmfbuser} \
        | grep -o "<SID>[a-z0-9]\{16\}" |  cut -d'>' -f 2 > $avmsidfile
  fi
  avmsid=$(cat $avmsidfile)
  echo "SID: $avmsid"

  # end of login function

  curl -s "${avmfbip}${REQUESTPAGE}" -d "sid=${avmsid}" > "$OUTPUTFILE"

  # Zeilen aus der Tabelle einlesen
  mapfile -t < <(grep "Datenvolumen gesamt" "$OUTPUTFILE")
  for i in "${!MAPFILE[@]}" ; do
    if [[ "${MAPFILE[i]}" =~ 'Vormonat' ]] ; then  # Vormonat, weil der Wert in der Zeile steht
      AM_TRAFFIC="${MAPFILE[i]#*class=\"vol\"\>}"  # *class=""vol" abschneiden
      AM_TRAFFIC="${AM_TRAFFIC%%\<\/td*}"  #  </td* abschneiden
    fi
  done

  echo "$AM_TRAFFIC MB" ; AM_TRAFFIC=$((AM_TRAFFIC * 1024*1024))
  echo "$AM_TRAFFIC B"
  numfmt --to=iec-i --suffix=B --format='%.2f' "$AM_TRAFFIC" > "${CONKY_DATA}/traffic"
}
Jetzt noch eine Frage: Die Anzeige spricht von MB. Sind das 1000*1000*1000 Byte oder 1024*1024*1024 Byte?
 
Kostenlos!

Statistik des Forums

Themen
248,906
Beiträge
2,304,640
Mitglieder
378,608
Neuestes Mitglied
Ra67