[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“ ()

      cleanlock schrieb:


      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.


      Ich habe seit ca. 3-4 Wochen das selbe Phänomen.
      Läuft 3-4 Tage, ab dann gehts mit der Leistung und Reaktion Berg ab. Reboot und sofort wieder Full-Speed da..
      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“ ()

      Hallo zusammen,

      ich habe das Script heruntergeladen und die Abhängigkeiten installiert. Allerdings erscheint bei mir folgende Fehlermeldung:

      python speedport-reboot.py -d

      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      Script Version: 1.4
      GitHub: git.io/fjqOs
      Telegram Support: t.me/Jerr0w
      Credits: Dordnung, Bizzy13

      Thank you for using this script! :)

      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

      [INFO] Checking password length...
      [SUCCESS] Password length checked successfully!

      [INFO] Trying to fetch the Challenge Token...
      [SUCCESS] Challenge token has been fetched successfully!

      [INFO] Trying to log in...
      Traceback (most recent call last):
      File "speedport-reboot.py", line 300, in <module>
      login()
      File "speedport-reboot.py", line 141, in login
      json_string = open_site(speedport_url + login_json, {"csrf_token": "nulltoken", "showpw": 0, "password": encrypted_password, "challengev": challenge_val})
      File "speedport-reboot.py", line 272, in open_site
      res = opener.open(req)
      File "/usr/lib/python2.7/urllib2.py", line 435, in open
      response = meth(req, response)
      File "/usr/lib/python2.7/urllib2.py", line 548, in http_response
      'http', request, response, code, msg, hdrs)
      File "/usr/lib/python2.7/urllib2.py", line 467, in error
      result = self._call_chain(*args)
      File "/usr/lib/python2.7/urllib2.py", line 407, in _call_chain
      result = func(*args)
      File "/usr/lib/python2.7/urllib2.py", line 633, in http_error_302
      new = self.redirect_request(req, fp, code, msg, headers, newurl)
      File "/usr/lib/python2.7/urllib2.py", line 594, in redirect_request
      raise HTTPError(req.get_full_url(), code, msg, headers, fp)
      urllib2.HTTPError: HTTP Error 307: Temporary Redirect

      Verwendet wird ein Ubuntu 18.04.3

      URL und Passwort Parameter habe ich angepasst, jemand eine Idee?

      Vielen Dank schon einmal für die Hilfe.

      Viele Grüße
      @cleanlock
      Danke für das Script. Es hat lange auf meinem Pi4 funktioniert.
      Ich musste ihn jetzt leider neu aufsetzen - alles neu - Bullseye, Python 3... und pycryptodome-3.19.0.
      Jetzt bekomme ich das Script leider nicht mehr zum Laufen, obwohl ich schon einiges nach den Fehlermeldungen im Script ändern konnte.
      Aber ich bin und bleibe ein Linux-Laie. Sitze schon tagelang daran und komme nicht weiter.
      Wäre es möglich, dass du dir das Script unter der veränderten Umgebung (Bullseye, Python 3... und pycryptodome-3.19.0) nochmal ansiehst und anpasst.
      Auch nach längerem Googlen konnte ich nichts neueres zu diesem Thema finden.
      Das wäre toll, wenn du mir da helfen könntest.
      Gruß
      harrysam