Skript zum rebooten des Routers

      Skript zum rebooten des Routers

      Guten Abend liebe Community,

      aufgrund unserer schlechten ländlichen Lage kommt es bei uns oft zu Problemen mit der Internetverbindung. Den Router neu zu starten hilft ab und zu Wunder - einziges Problem ist das ständige ein- und ausstecken des Routers oder sich ständig im Router einzuloggen.

      Meine Idee wäre, auf meinem Raspberry ein Skript zu installieren, dass den Router mit einem einfachen Befehl (z.B. durch ein Web-Interface) neustarten kann. Auf folgender Seite wurde ein Python-Skript bereitgestellt, dass genau meinen Zweck erfüllen würde: https://github.com/dordnung/Speedport-Hybrid-Rebooter

      Leider gibt es seit einem Update des Routers ein bekanntes Problem das zu folgender Fehlermeldung führt:

      Quellcode

      1. File "/home/pi/scripts/speedport-rebooter.py", line 202, in <module>
      2. get_challenge_val()
      3. File "/home/pi/scripts/speedport-rebooter.py", line 68, in get_challenge_val
      4. json_string = open_site(speedport_url + login_json, {"csrf_token": "nulltoken", "showpw": 0, "challengev": "null"})
      5. File "/home/pi/scripts/speedport-rebooter.py", line 177, in open_site
      6. res = opener.open(req)
      7. File "/usr/lib/python2.7/urllib2.py", line 401, in open
      8. response = self._open(req, data)
      9. File "/usr/lib/python2.7/urllib2.py", line 419, in _open
      10. '_open', req)
      11. File "/usr/lib/python2.7/urllib2.py", line 379, in _call_chain
      12. result = func(*args)
      13. File "/usr/lib/python2.7/urllib2.py", line 1211, in http_open
      14. return self.do_open(httplib.HTTPConnection, req)
      15. File "/usr/lib/python2.7/urllib2.py", line 1184, in do_open
      16. r = h.getresponse(buffering=True)
      17. File "/usr/lib/python2.7/httplib.py", line 1034, in getresponse
      18. response.begin()
      19. File "/usr/lib/python2.7/httplib.py", line 407, in begin
      20. version, status, reason = self._read_status()
      21. File "/usr/lib/python2.7/httplib.py", line 365, in _read_status
      22. line = self.fp.readline()
      23. File "/usr/lib/python2.7/socket.py", line 447, in readline
      24. data = self._sock.recv(self._rbufsize)
      25. socket.timeout: timed out


      Ich habe zwar Erfahrungen in den Programmiersprachen C, C++ sowie Python, jedoch suche ich einen möglichst einfachen weg ohne mich in die Marterie genau einarbeiten zu müssen. Darum meine Frage: Gibt es eine aktualisierte Funktion dieses Python-Scripts? Oder gibt es vielleicht einen noch einfacheren Weg mein Vorhaben zu erreichen?

      Mit freundlichen Grüßen

      Marcel
      update 28.12.2017:
      vielen Dank für die schnellen Antworten. Ich habe mich mal ans Skript gemacht und stoße dabei noch auf Probleme. Die Challenge herauszufinden klappt scheinbar. Jedoch habe ich ein Problem beim login
      Ich wäre sehr dankbar wenn sich ein erfahrener mit den Fehlermeldungen auseinandersetzt und mir evtl. helfen kann, da ich keine Ahnung habe, wie die challenge, das passwort oder sonstige Werte aussehen sollen.

      Folgend habe ich mir die Werte ausgeben lassen, die im Programm berechnet werden. Sind diese realistisch?

      challenge =
      5B9A3fccBBA19B4F3F224EBdcE20dbb14F0B2EfBbFFeA638041FCA4BEDb55B6D

      Logging in...

      sha256_full =
      <SHA256 object at 0x75f467a0>

      encrypted password =
      0e5db0a4aaadead7844526e46a134b592ab58b6b5eb32c90e6d0ab80eb1cf5c4




      Das ganze wird mit dem folgenden Python-Skript ausgeführt:

      Quellcode

      1. def login():
      2. global derivedk
      3. # Hash password with challenge_val
      4. sha256_full = SHA256.new()
      5. print("sha256_full =")
      6. print(sha256_full)
      7. sha256_full.update("%s:%s" % (challenge_val, device_password))
      8. encrypted_password = sha256_full.hexdigest()
      9. print ("encrypted password =")
      10. print(encrypted_password)
      11. # Finally login
      12. json_string = requests.get("http://speedport.ip/data/Login.json", {"csrf_token": "nulltoken","challengev": challenge_val, "showpw": 0, "password": encrypted_password})
      13. print(json_string.content)
      14. json_object = json.loads(json_string.content)


      Das Problem ist, dass der Wert "login" nie "true" wird, weswegen ich denke, dass mein Passwort nicht stimmt.

      Frage zum erstellen des Passworts:
      string.Concat(_challenge, ":", password).sha256();

      Hier wird der Wert der Challenge mit ":" und dem Passwort konkateniert und danach die Funktion sha256() (irgendeine Krypto-Funktion?) darauf angewendet?

      $this->hash = hash('sha256', $this->challenge.':'.$password);

      Hier wird lediglich der string "sha256" mit der challenge, ":" und dem Passwort konkateniert?

      Irre ich mich, oder wären das 2 unterschiedliche Passwörter? Und wie wird letztendlich das korrekte Passwort erstellt?

      Mit freundlichen Grüßen

      Dosenfutter
      Dateien
      • reboot-html.txt

        (17,8 kB, 1 mal heruntergeladen, zuletzt: )

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Dosenfutter“ ()

      xdjbx schrieb:

      Das eine ist altes Verfahren und das andere neues, wenn ich das richtig deute. Aber da müssen die Script Experten ran.
      Für mich sieht dein Code viel zu kurz aus ;-) im Vergleich zur php


      Dann hoffe ich mal, dass sich wer findet :)

      Dass der Code so kurz ist, liegt daran dass ich nur einen Teil des Python-Scripts eingefügt habe. Im Anhang hab ich mal das komplette Script (im .txt-Format, da es als .py-Format ein ungültiger Anhang war) eingefügt, wobei ich bisher nur die Challenge-Funktion und die Login()-Funktion bearbeitet habe. Das Skript, das mit der alten GUI noch funktionierte, habe ich hierher.
      Dateien

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

      Hallo,

      da ich den Speedport Hybrid ebenfalls gerne per Script neu starten lassen möchte, gibt es ein funktionierendes Python-Script, hat da mittlerweile wer etwas?
      Das oben gepostete vom 29. Dezember 2017 funktioniert leider nicht, kein Login möglich ("Failed to login at URL...").

      Danke.