[Python] Speedport Reboot

      [Python] Speedport Reboot

      Hallo zusammen,

      da ich seit geraumer Zeit mit Leitungsschwankungen zu kämpfen habe, welche sich allerdings durch einen Speedport Neustart beheben lassen, habe ich nach einem Speedport Neustart-Script gesucht. Leider war eines davon outdated und das andere nur fürs Reconnecten. Ich habe gesehen, dass beide Scripts von der Struktur nahezu identisch sind, nur dass das Reconnect-Script eben keine Reboot-Funktion hatte, welches aber im Gegensatz zum Neustart-Script tadellos funktioniert hat.

      Also habe ich beide Scripts genommen und das Reconnect-Script bearbeitet. Die Reconnect-Funktion habe ich rausgeschmissen und die Reboot-Funktion reingepackt. Somit ist das Script nun funktionstüchtig. Ich hoffe, dass einige hier damit was anfangen können - ich auf jeden Fall. Da ich einen Raspberry Pi Zuhause im Netzwerk habe, wird bei mir das Speedport in Zukunft jeden Morgen um 04:00 neu gestartet. :)

      Link zum Github: github.com/Triniayo/Speedport-Reboot

      Natürlich haben die beiden Authoren, von denen ich das Script übernommen und editiert habe, einen Platz in der README.md gefunden. Wenn ihr beiden das hier lest: Vielen Dank, ihr habt mir sehr geholfen. :)
      Wenigstens das Login wollte ich schon mal ausprobieren...

      Was bei mir notwendig war, die Angabe einer IP:
      speedport_url = "http://192.168.2.1/"

      Trotz Angabe des richtiges Passwortes will das Login nicht gelingen:

      Extracting Random-Key...
      Random-Key: 9B40bFEc508CF6a03BA0C0Fb742d3FAbeF9E13D5aE40cb7fb83bD1aac161E91B
      Logging in...
      Failed to login at URL 192.168.2.1/data/Login.json


      Die beiden Angaben

      login_html = "html/login/index.html"
      login_json = "data/Login.json"

      im Script sind wohl korrekt; die beiden HTML-Seiten dahinter sind mit einem Browser erreichbar.

      Quellcode

      1. ​Extracting Random-Key...
      2. Random-Key: 4cEceC03bfecB1C1FE2941fE0aBbffBA6Ad011Ebf5cDE0cb52239Ec3dfE010C5
      3. Logging in...
      4. Login successful
      5. Extracting csrf_token...
      6. csrf_token: tR6IoKLN6kJDsm1Vvw7ujwyq4mHXGQi
      7. Requesting Reboot...


      Normalerweise sollte es so aussehen. Passwort 100% korrekt?
      Es ist das richtige Passwort im Script hinterlegt.

      Aber...bei meiner allerersten Ausführung habe ich bewusst ein falsches Kennwort angegeben.
      Kann es evtl. sein, dass das (Session-)Cookie, welches du anlegen lässt, irgendwie hängengeblieben ist?
      Ich denke mal nicht, das Cookie sollte/wird wahrscheinlich mit dem Ende des Python-Prozess entfernt.
      Der Cookie wird nur solange gespeichert wie das Script ausgeführt wird. Ich habe das Script nochmal geupdated und eine Commandline-Option "-d" bzw. "--dryrun" hinzugefügt. Bitte mal runterladen, Logindaten eintragen und testen.

      Edit: Gerade noch einmal getestet - einmal extra mit falschen Logindaten und danach noch einmal mit korrekten Logindaten.

      Mit falschem PW:

      Quellcode

      1. root@raspbian-stretch:~# python sp.py -d
      2. Extracting Random Key...
      3. Trying to login...
      4. Failed to login at URL http://speedport.ip/data/Login.json


      Mit korrektem PW:

      Quellcode

      1. root@raspbian-stretch:~# python sp.py -d
      2. Extracting Random Key...
      3. Trying to login...
      4. Login successful!
      5. Extracting CSRF Token...
      6. !!DRYRUN!!: Reboot request was successful! You can use this script without the dryrun-parameter.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „cleanlock“ ()

      Habe das geänderte Script soeben ausprobiert, will auch weiterhin nicht :(

      Die dryrun-Erweiterung bringt in meinem Fall leider nichts, da das Script bei mir mit Zeile 120 verlassen
      wird - und das ist vor dem dryrun-Test. x["varvalue"] in Zeile 119 hat bei mir den Inhalt "failed".

      Versuchsweise habe ich den Aufruf der dryrun-Funktion verschoben. Ausgabe:

      Extracting CSRF Token...
      !!DRYRUN!!: Reboot request was successful! You can use this script without the dryrun-parameter.

      Vielleicht findet sich hier noch jemand, der es mal ausprobieren könnte. Oder vielleicht läuft auf meinem
      Hybrid auch eine andere Firmware als bei dir?

      mibere schrieb:

      Habe das geänderte Script soeben ausprobiert, will auch weiterhin nicht :(

      Die dryrun-Erweiterung bringt in meinem Fall leider nichts, da das Script bei mir mit Zeile 120 verlassen
      wird - und das ist vor dem dryrun-Test. x["varvalue"] in Zeile 119 hat bei mir den Inhalt "failed"github.com/Triniayo/Speedport-…/speedport-reboot.py#L120

      Versuchsweise habe ich den Aufruf der dryrun-Funktion verschoben. Ausgabe:

      Extracting CSRF Token...
      !!DRYRUN!!: Reboot request was successful! You can use this script without the dryrun-parameter.
      github.com/Triniayo/Speedport-…/speedport-reboot.py#L120

      Vielleicht findet sich hier noch jemand, der es mal ausprobieren könnte. Oder vielleicht läuft auf meinem
      Hybrid auch eine andere Firmware als bei dir?


      Das mit der Firmware kann sehr gut sein, ich verwende die aktuellste Firmware (v050124.04.00.005)
      Jepp, ist installiert.

      $ python2.7 -c "import Crypto"
      $ echo $?
      0


      und

      $ pip list | grep -i pycryptodome
      pycryptodome (3.4.7)

      --------------------

      Der Inhalt von json_object aus Zeile 113 ist dieser

      [{u'varid': u'login', u'varvalue': u'failed', u'vartype': u'status'}, {u'varid': u'status', u'varvalue': u'ok', u'vartype': u'status'}, {u'varid': u'login_locked', u'varvalue': u'2', u'vartype': u'value'}]

      Mir fällt da nur dieses login_locked=2 auf, was auch immer das ist oder bedeutet.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mibere“ ()

      Hmmm, tu mir mal einen Gefallen und füge folgende Zeile nach "print("Login successful!")" ein:

      print("Inhalt von JSON_String: " + json_string)

      Dann führst du das Script aus und postest hier den Output.

      PS: Wenn du Telegram hast, können wir auch da schreiben. Das geht denke ich mal schneller :D
      t.me/Jerr0w

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „cleanlock“ ()

      Endlich! Es läuft!

      Nachdem ich irgendwann auf die Idee gekommen bin einen Blick in den Sourcecode der SPH-Loginseite
      zu werfen ist mir eines sofort aufgefallen: die Passwortlänge.

      Das Eingabefeld für das Passwort akzeptiert nur 8-12 Zeichen, mein Passwort war jedoch länger.
      Habe ich beim Copy&Paste nie bemerkt, dass von meinem Passwort also immer nur die ersten 12
      Zeichen akzeptiert bzw. verwendet wurden.

      Nachdem ich mein Routerpasswort nun auf 12 Zeichen geändert habe...Login per Script lief sofort.

      @cleanlock: damit dies nicht mehr bei anderen Benutzern auftritt und andere nicht mehr, wie in
      meinem Fall, mehrere Stunden investieren müssen: das Script sollte prüfen, ob das Passwort
      (device_password) 8-12 Zeichen lang ist, ansonsten mit entspr. Meldung abbrechen.

      mibere schrieb:

      Endlich! Es läuft!

      Nachdem ich irgendwann auf die Idee gekommen bin einen Blick in den Sourcecode der SPH-Loginseite
      zu werfen ist mir eines sofort aufgefallen: die Passwortlänge.

      Das Eingabefeld für das Passwort akzeptiert nur 8-12 Zeichen, mein Passwort war jedoch länger.
      Habe ich beim Copy&Paste nie bemerkt, dass von meinem Passwort also immer nur die ersten 12
      Zeichen akzeptiert bzw. verwendet wurden.

      Nachdem ich mein Routerpasswort nun auf 12 Zeichen geändert habe...Login per Script lief sofort.

      @cleanlock: damit dies nicht mehr bei anderen Benutzern auftritt und andere nicht mehr, wie in
      meinem Fall, mehrere Stunden investieren müssen: das Script sollte prüfen, ob das Passwort
      (device_password) 8-12 Zeichen lang ist, ansonsten mit entspr. Meldung abbrechen.


      Vielen Dank, dass du die Lösung geposted hast. Ich werde das Script sofort darauf anpassen! :)

      Edit: Script updated!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „cleanlock“ ()