Ereignisprotokoll der FRITZ!Box auf Linux-Server sichern

Bei den neuen Firmwares gibt es bei angeschlossenem UMTS Stick SMS Empfang. Das wird aber nur in den Erreignissen angezeigt und nicht als Push Nachricht versendet (Schade). Deswegen die Frage ob es möglich ist nur die SMS Erreignisse zu holen.
Tasker wäre für mich ideal. Es ist eine Android App mit der auch Scripts, SSH usw. möglich sind.
 
Verstehe. Zu Android und Tasker kann ich nicht viel sagen, weil ich das nicht einsetze. Aber nach dem, was ich darüber gelesen habe, wird Dir mein Skript da nicht viel helfen. Es bietet lediglich die Möglichkeit, das komplette Ereignisprotokoll der Box von einem Linux-System aus auszulesen. Systemvoraussetzungen sind bash und eine Handvoll Standardtools: curl, jq, md5sum, iconv, expr und cat. Vielleicht würde es sogar auch auf Android laufen, aber wie Du das dann in Tasker einbinden kannst, sehe ich nicht.
 
Halllo, bin eben über das Skript gestolpert, kriege es aber leider nicht zum Laufen. Rufe ich es mit allen Paramtern auf, also
Code:
 ./fritz-syslog.sh -a https://fritz.box -u meinuser -p meinpw -j -o /home/user/fritz.json
bekomme ich sofort nur:
Code:
extra argument https://fritz.box
und das Skript stoppt sofort.
Schreibe ich alle Parameter in das Skript hinein und rufe es nur mit
Code:
./fritz-syslog.sh
scheint irgendwas zu passieren, aber nach kurzer Zeit erhalte ich:
Code:
jq: error (at <stdin>:49): Cannot index object with number
und das Skript stoppt.

Was mache ich falsch? Bin in einer VM mit Ubuntu 16.04.
 
Zuletzt bearbeitet:
Hallo rucksman7, danke für den Bug Report. :)

Fehlermeldung 1 ist in der Tat ein Bug in der Parameterverarbeitung des Skripts.
Ich werde das umgehend korrigieren und eine neue Version hochladen.
Als Workaround kannst Du den Parameter -j als letztes angeben, dann funktioniert's:
Code:
./fritz-syslog.sh -a https://fritz.box -u meinuser -p meinpw -o /home/user/fritz.json -j

Fehlermeldung 2 konnte ich leider nicht nachstellen. Mit der Option -j wird eigentlich jq gar nicht benutzt.
Meine Vermutung ist, dass Dir beim Eintragen der Parameter in das Skript etwas schiefgegangen ist.
Bitte teste nochmal das Originalskript mit -j als letzter Option. (Oder das korrigierte Skript, wenn Du so lange warten willst.)
Wenn es dann immer noch nicht geht, probiere es bitte auch einmal ohne -j und poste von beiden Tests die Ergebnisse.
Bitte nenne mir auch Typ und Software-Version Deiner Fritzbox.
 
Danke für die schnelle Rückmeldung. Ich habe jetzt den Parameter -j hinten angehängt:
Code:
./fritz-syslog.sh -a https://fritz.box -u meinuser -p meinpw -o /home/user/fritz.json -j
Damit läuft das Skript zwar an, aber ich bekomme:
Code:
jq: error (at <stdin>:64): Cannot index object with number
Das gleiche passiert auch, wenn ich statt -j ein -r mache.

UPDATE: Mein Fehler, ich hatte einen Vertipper drin. Mit hinten angehängtem Parameter funktioniert es.
UPDATE 2: Ich kann allerdings in der Ausgabe keinen Unterschied festellen, wenn ich zwischen -j und -r wechsle.
 
Zuletzt bearbeitet:
Leider kann ich meine korrigierte Version im Moment nicht hochladen, da der Assetmanager des Forums offenbar kaputt ist. Beim Klick auf "Anhänge verwalten" bekomme ich nur ein leeres graues Popup-Fenster. Ich hoffe, das ist bald behoben.

Kannst Du das Kommando bitte mal mit Shell-Protokollierung ausführen:
Code:
sh -x ./fritz-syslog.sh -a https://fritz.box -u meinuser -p meinpw -o /home/user/fritz.json -j
und die letzen vier Zeilen hier posten? Die SID bitte sicherheitshalber unkenntlich machen.
Bei mir sieht das so aus:
Code:
+ '[' -n '' ']'
+ case "$OUTFMT" in
+ cat
+ curl -k -s -G https://fritz.box/query.lua -d mq_log=logger:status/log -d sid=xxxxxxxxxxxxxxxx
 
Die gesamte Ausgabe:
Code:
+ FBUSER=
+ FBPASS=
+ SIDFILE=
+ _SID=
+ FBURL=https://fritz.box
+ OUTFILE=/dev/stdout
+ OUTFMT=text
+ PATH=/bin:/usr/bin
+ [ 9 -gt 0 ]
+ shift
+ FBURL=https://fritz.box
+ shift
+ [ 7 -gt 0 ]
+ shift
+ FBUSER=meinuser
+ shift
+ [ 5 -gt 0 ]
+ shift
+ FBPASS=meinpw
+ shift
+ [ 3 -gt 0 ]
+ shift
+ OUTFILE=/home/user/fritz.json
+ shift
+ [ 1 -gt 0 ]
+ shift
+ OUTFMT=json
+ shift
./fritz1.sh: 46: shift: can't shift that many

Es wird KEINE Datei erzeugt. Nur mit dem normalen Aufruf wird die Datei erzeugt, und die hat auch auf den ersten Blick einen vernünftigen Inhalt, wenngleich ich den Inhalt noch nicht mit dem tatsächlichen Log der Box verglichen habe. Es handelt sich um eine 3370 mit aktueller Firmware.

- - - Aktualisiert - - -

Neue Antwort, weil ich jetzt den vorigen Post nicht ändern wollte. Das Problem lag an "sh", wenn ich "bash" verwende, siehts so aus:
Code:
+ '[' -n '' ']'
+ curl -k -s -G https://fritz.box/query.lua -d mq_log=logger:status/log -d sid=xxx
+ case "$OUTFMT" in
+ cat
Eine Datei wurde erzeugt.
 
Zuletzt bearbeitet:
Ok, die Fehlermeldung "shift: can't shift that many" stammt von dem Bug, den ich gefixt habe.
Da das Hochladen immer noch nicht geht, hier der Patch zum Selbereinspielen:
Code:
commit 8bfa080f2d9ef7e3e736d0dd1533bf69a2c20042
Author: Tilman Schmidt <[email protected]>
Date:   Thu Jun 15 13:15:57 2017 +0200

    fix unary option handling

diff --git a/fritz-syslog.sh b/fritz-syslog.sh
index a1f5ca4..0e63c04 100755
--- a/fritz-syslog.sh
+++ b/fritz-syslog.sh
@@ -16,7 +16,7 @@
 # Free Open Source Software released under GPLv2
 # see http://www.gnu.org/licenses/gpl-2.0
 # Author: Tilman Schmidt <[email protected]>
-# Release: 0.7 2017-02-22
+# Release: 0.8 2017-06-15
 
 # default values
 FBUSER=""
@@ -35,8 +35,8 @@ do
        -a) shift ; FBURL="$1" ;;
        -u) shift ; FBUSER=$1 ;;
        -p) shift ; FBPASS=$1 ;;
-       -j) shift ; OUTFMT=json ;;
-       -r) shift ; OUTFMT=raw ;;
+       -j) OUTFMT=json ;;
+       -r) OUTFMT=raw ;;
        -o) shift ; OUTFILE=$1 ;;
        -s) shift ; SIDFILE=$1 ;;
        -h) echo "Usage: $0 { -a <url> } { -u <username> } { -p <password> } { -j | -r } { -o <outfile> } { -s <sidfile> }" ; exit 0 ;;
Anders ausgedrückt: die shift-Befehle bei -j und -r müssen raus.
Wundert mich zwar, dass sh dann abbricht - aber das brauchen wir jetzt nicht weiter zu analysieren.

Das zweite Ergebnis sieht genau so aus wie es sein soll: kein Aufruf von jq.
Ist denn die jq-Fehlermeldung damit jetzt weg?
Und kannst Du dasselbe mal ohne die Option -j laufen lassen?
Was sagt es dann?
 
Man kann den Parameter -j jetzt auch mitten im Aufruf benutzen. Der Bug ist also gefixt. Lasse ich den Parameter raus, kommt wieder die Fehlermeldung:
Code:
jq: error (at <stdin>:79): Cannot index object with number

Was mich nach wie vor irritiert: Egal ob ich den Parameter -j oder -r benutze, das Ergebnis ist immer absolut identisch.

- - - Aktualisiert - - -

Ich habe jetz noch einmal frisch Deine zip-Datei runtergeladen, die beiden shifts entfernt und den gleichen Aufruf gemacht, den Du in Deinem Eingangspost zeigst: Ich bekomme immer diesen jq-Fehler.

- - - Aktualisiert - - -

Ich habs jetzt nochmal an einer 7490 mit aktueller Firmware versucht, aber die Ausgabe ist immer gleich, egal ob -j oder -r.
 
Zunächst mal zur Klarstellung: dass die Parameter -j und -r dasselbe Ergebnis liefern, ist korrekt und erwartungsgemäß. Seit der Anpassung an FRITZ!OS 6.80 (Version 0.7) ist das von der Fritzbox gelieferte raw-Format JSON.
(Zum Hintergrund: Bis Version 0.6 benutzte das Skript eine andere, mit FRITZ!OS 6.80 abgeschaffte Schnittstelle, bei der man sowohl JSON als auch Text erst extrahieren musste; damals waren also "raw" und "JSON" noch unterschiedliche Dinge.)

Nun zu der jq-Fehlermeldung: Mir ist nach Deinen letzten Berichten nicht mehr klar, wann genau die bei Dir auftritt.

* Mit der Option -j bzw. -r? Das wäre ausgesprochen rätselhaft, denn mit dieser Option sollte jq überhaupt nicht benutzt werden.

* Ohne die Option -j bzw. -r? Dann produziert Deine Fritzbox halt eine Ausgabe, die Deine jq-Version nicht parsen kann. Sowas kommt vor. In diesem Fall wäre es nett, wenn Du mir die raw-Ausgabe zwecks Analyse zur Verfügung stellen könntest. Vielleicht lässt sich da mit etwas sed Abhilfe schaffen. Auch die von Dir verwendete jq-Version wäre interessant. "jq --help" gibt sie aus.
 
Die jq-Fehlermeldung tritt dann auf, wenn ich keinen der beiden Parameter angebe (-j oder -r). Gebe ich einen explizit an, tritt der Fehler nicht auf. Also:
Code:
sh -x ./fritz-syslog.sh -a https://fritz.box -u meinuser -p meinpw -o /home/user/fritz.json -j
--> Kein Fehler

Code:
sh -x ./fritz-syslog.sh -a https://fritz.box -u meinuser -p meinpw -o /home/user/fritz.json
-->Fehler
 
Hm, meine letzte Antwort scheint nicht angekommen zu sein ...

Wenn Du die Ausgabe der Fritzbox mit der Option -j mir nicht zur Analyse zur Verfügung stellen magst, kannst Du sie auch selber anschauen, ob Dir in Zeile 79 etwas auffällt, woran sich jq verschlucken könnte.
Du kannst sie auch mal von Hand dem Kommando
Code:
jq -r '.mq_log|.[]|.[0]'
verfüttern und schauen ob das dieselbe Fehlermeldung produziert.
Oder Du kannst sie einem der zahlreichen anderen JSON-Parser vorwerfen und schauen, was die dazu meinen.
 
Welche Ausgabe meinst du denn? Die Protokoll-Ausgabe (also das, was mit bash -x auf der Konsole ausgegeben wird) oder die erzeugte json-Datei? Wenn ich
Code:
jq -r '.mq_log|.[]|.[0]' fritz.json
mache, kommt
Code:
jq: error (at fritz.json:254): Cannot index object with number
Zeile 254 ist die letzte Zeile mit der schließenden geschweiften Klammer, die in der ersten Zeile (vor mq_log) geöffnet wurde.
Was ist eigentlich das Ziel der jq-Anweisung? Wenn ich
Code:
curl -k -s -G https://fritz.box/query.lua -d mq_log=logger:status/log -d sid=XXX
mache, bekomme ich die exakte Ausgabe, die auch mit -j in der Datei steht. Der Fehler wundert mich insofern nicht, da der letzte Filter bei jq in der Tat nichts mehr zu filtern hat, da nach dem zweiten Filter nur noch die einzelnen Einträge übrigbleiben, also kein Array mehr da ist, das gefiltert werden könnte.
Wenn ich also den letzten Array-Filter inkl. der letzte pipe weglassem, kommt keine Fehlermeldung
Code:
cat fritz.json | jq -r '.mq_log|.[]'
Es wird die json-Datei ohne das umschließende mq_log ausgegeben, also
Code:
{
  "_node": "20.06.17 09:42:34 Die FRITZ!Box-Einstellungen wurden über die Benutzeroberfläche geändert.",
  "row_2": "502",
  "row_3": "1"
}
{
  "_node": "20.06.17 09:42:27 Anmeldung an der FRITZ!Box Benutzeroberfläche von IP-Adresse 192.168.XXX.XXX.",
  "row_2": "500",
  "row_3": "1"
}
Insofern würde mich interessieren, was Du mit jq eigentlich bezwekcen willst. Vielleicht kann ich dann ja bei der Fehlerbehebung helfen.

Aber insgesamt ist das ja nicht so wichtig, denn mit dem Paramter -j bzw. -r funktioniert es ja ohne Fehlermeldung.

- - - Aktualisiert - - -

Könnte eventuell das Dein Wunschformat sein, das Du mit dem jq erreichen willst:
Code:
20.06.17 09:42:34 Die FRITZ!Box-Einstellungen wurden über die Benutzeroberfläche geändert.
20.06.17 09:42:27 Anmeldung an der FRITZ!Box Benutzeroberfläche von IP-Adresse 192.168.XXX.XXX.

Das habe ich mit
Code:
jq -r '.mq_log|.[]|._node'
erzeugt
 
Zuletzt bearbeitet:
Vielen Dank für die ausführliche Analyse. Sehr aufschlussreich.

Das Ziel der jq-Anweisung ist in der Tat, aus der JSON-Ausgabe der Fritzbox das reine Text-Ausgabeformat mit Datum, Uhrzeit und Meldungstext zu extrahieren.
Bei mir funktioniert das mit dem Formatstring
Code:
'.mq_log|.[]|.[0]'
der bei Dir die Fehlermeldung
Code:
Cannot index object with number
produziert. Umgekehrt produziert der Formatstring
Code:
'.mq_log|.[]|._node'
der bei Dir das gewünschte Ergebnis erzeugt, bei mir die Fehlermeldung:
Code:
Cannot index array with string "_node"

Gehen wir einen Schritt zurück zum Format
Code:
'.mq_log|.[]'
Das produziert bei mir:
Code:
[
  "20.06.17 14:40:43 WLAN-Gerät angemeldet (2,4 GHz), 65 Mbit/s, iPhone-TS, IP 192.168.59.111, MAC EC:85:2F:87:E6:96.",                                         
  "748",
  "4"
]
[
  "20.06.17 14:39:36 WLAN-Gerät hat sich abgemeldet (2,4 GHz), iPhone-TS, IP 192.168.59.111, MAC EC:85:2F:87:E6:96.",                                           
  "752",
  "4"
]
Also JSON Arrays, aus denen ich mit Index 0 den Textstring der Logmeldung extrahieren kann. Bei Dir kommen da offenbar Hashes raus, aus denen man ihn per _node extrahieren muss. Sehr spannend.

Wie sieht denn bei Dir das rohe von der Fritzbox gelieferte JSON aus? Bei mir beginnt die Ausgabe von
Code:
fritz-syslog.sh -u meinuser -p meinpw -j
so:
Code:
{"mq_log":[["21.06.17 20:07:49 WLAN-Gerät hat sich abgemeldet (2,4 GHz), coraline, IP 192.168....
Sieht das bei Dir auch anders aus, also geschweifte Klammern statt der eckigen? Dann hätten wir tatsächlich zwei inkompatible JSON-Ausgaben.

Puh, wie kriege ich das im Skript abgefangen? Ich will eigentlich nicht jedem Benutzer zumuten, erst einmal den richtigen JSON-Filter herauszufinden und ins Skript zu basteln.
 
Zuletzt bearbeitet von einem Moderator:
Die Antwort, die ich auf
Code:
 curl -k -s -G https://fritz.box/query.lua -d mq_log=logger:status/log -d sid=XXX
erhalte, fängt so an:
Code:
{
 "mq_log" : [
 {
 "_node" : "22.06.17 10:44:34 Anmeldung an der FRITZ!Box Benutzeroberfläche von IP-Adresse 192.168.177.22. [10 Meldungen seit 21.06.17 10:25:38]",
 "row_2" : "500",
 "row_3" : "1"
 },
 {
 "_node" : etc.
Die Arrays sind bei mir also tatsächlich in runden Klammern und nicht in eckigen...
 
Verschiedene Fritzboxen produzieren also tatsächlich inkompatibles JSON. Danke, AVM!:rolleyes:

Ich habe mal ein bisschen mit der Filtersprache von jq gespielt. Einfache Ideen wie '._node // .[0]' klappen leider nicht, weil jq dermaßen beleidigt ist, dass man überhaupt versucht, ein Array als Hash anzusprechen oder umgekehrt, dass es die Alternative gar nicht mehr anschaut. Funktioniert hat es bei mir schließlich mit:
Code:
jq -r '.mq_log|.[]|._node? // .[0]'
Magst Du das mal bei Dir testen?

Edit: Filter optimiert. Falls AVM sich noch eine weitere inkompatible Variante einfallen lässt, hätte die vorige Version einfach eine leere Ausgabe produziert. Diese wird wieder einen Fehler auswerfen und mir so die Chance geben, den Filter zu ergänzen. Jetzt müsste nur noch die Upload-Funktion des Forums repariert werden, damit ich die neue Version des Skripts hochladen kann.
 
Zuletzt bearbeitet von einem Moderator:
Sieht gut aus. Liefert bei mir das gewünschte Resultat. Werde es heute abends mal mit der 7490 probieren, aber so weit ich mich erinnere, gabs dort das gleiche Format wie mit der 3370. Danke für Deine Mühe! Und ja, jq ist jetzt nicht direkt eingängig, wie ich finde :p

- - - Aktualisiert - - -

alles, was hier stand, war Blödsinn. Alles funktioniert wunderbar.
 
Auch mit der 7490 funktioniert das jetzt und der Output ist wie gewünscht. Vielen Dank!
 
Nach einem Hinweis im Forum "Über dieses Forum", den Dateimanager des Forums abzuschalten, hat es jetzt auch mit dem Upload der neuen Version geklappt.
 
Sorry, habe gerade bemerkt, dass ich statt der neuen eine Uraltversion hochgeladen hatte. Ist jetzt korrigiert.

Bei allen, die zwischen Samstag und heute das ZIP-Archiv heruntergeladen haben, entschuldige ich mich. Bitte nochmal neu herunterladen.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.