[Frage] Remote reboot

Ja, das mit dem Reboot ist spätestens seit dem "responsive design" etwas speziell, wenn man da einen Browser emulieren will. Zuerst muß man einen POST-Request für "/system/reboot.lua" absetzen, der dann intern für eine gewisse Zeit (webuicookie -> allowed_action und allowed_time) diesen Neustart "freischaltet" und sich mit "302" verabschiedet, woraufhin ein Browser dann die Seite "/reboot.lua" (das ist eine andere) lädt - hier noch ohne "ajax=1" im Request und diese Seite löst dann über Javascript einen erneuten Request für sich selbst aus, diesmal mit "ajax=1" (u.a.) im Request und davon wird dann am Ende das eigentliche Reboot-Kommando für den "ctlmgr" getriggert.

Das ist alles recht kompliziert und vor allem kann es sich jederzeit wieder ändern ... daher ist die Verwendung der dokumentierten Schnittstellen sicherlich ohnehin die bessere Lösung. Bei ausgeschalteter 2FA könnte man ggf. noch ein "Update" simulieren und dabei eine falsche Datei verwenden ... in der Folge sollte irgendwann die Box auch neu starten - allerdings mit einer gewissen Verzögerung.
 
Ich habe jetzt eine Lösung mit php (per cli) gebastelt anhand eines Scripts, das ganze funktioniert auch - allerdings muss ich unterscheiden zwischen lokalen devices und Remote devices, denn der Pfad mit HTTPS den ich für eine externe Box nutze funktioniert beim Repeater im lokalen Bereich nicht.

Code:
 <?php
$fritzbox_Adresse = 'fritz.repeater';
$fritzbox_Username = 'user';
$fritzbox_Password = 'pass';
$fritzbox_Port = '443';


$context = stream_context_create([
    'ssl' => [
        // set some SSL/TLS specific options
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    ]
]);

$client = new SoapClient(
    null,
    array(
        'location'   => 'https://'.$fritzbox_Adresse.':'.$fritzbox_Port.'/tr064/upnp/control/deviceconfig',
        'uri'        => 'urn:dslforum-org:service:DeviceConfig:1',
        'noroot'     => True,
        'login'      => $fritzbox_Username,
        'password'   => $fritzbox_Password,
        'trace'      => True,
        'exceptions' => 0,
        'stream_context' => $context
    )
);

$action = 'Reboot';
$argument = 'NewSessionID';

$SID = '0000000000000000';
$direction_in_value = $SID;

//$result = $client->{$action}(new SoapParam($direction_in_value, $argument));
$result = $client->{$action}();

if(is_soap_fault($result))
{
 print(" Fehlercode: $result->faultcode | Fehlerstring:
         $result->faultstring");
}
else
{
 print "$result\n";
}

var_dump ($result);
?>

Setze ich Daten für eine externe Box ein funktioniert der Aufruf so (06.06 - 06.83), im internen Netz mag es aber nicht. Da kann ich natürlich über 49000 und ohne /tr064 rangehen, da muss ich das Script aber noch so erweitern, dass es die Daten Zeile pro Zeile aus einer externen Datei liest und dann anhand des Ports unterscheidet was für eine URL er aufrufen soll. Da ich selber mit PHP nix am Hut habe muss ich mir das erstmal ansehen wie das geht und mir wäre eine Lösung als reines Shellscript lieber gewesen das ähnlich dem Config Speichern ist das ich schon habe, daher der Weg über die URLs - aber so geht auch.
 
Ich habe vorhin noch einmal nachgesehen ... das "firmwarecfg"-CGI kennt nach wie vor auch die Option zum Neustarten der Box - das wurde früher mal benutzt, als es noch unsignierte Firmware-Images akzeptierte und dann als Option auch "reboot" zur Auswahl stand.

Allerdings muß es da als POST-Request und mit "multipart/form-data" eingehen, wie das folgende Skript es macht:
Code:
  1 #! /bin/bash
  2 #####################################################################################
  3 #                                                                                   #
  4 # create the HTTP request                                                           #
  5 #                                                                                   #
  6 #####################################################################################
  7 post_request()
  8 {
  9         printf "POST /cgi-bin/firmwarecfg HTTP/1.1\r\n"
 10         printf "User-Agent: handcrafted_request/1 (shell)\r\n"
 11         printf "Accept: */*\r\n"
 12         printf "Host: %s\r\n" "$2"
 13         printf "Connection: Close\r\n"
 14         printf "%s" "$1"
 15 }
 16 #####################################################################################
 17 #                                                                                   #
 18 # parameters and defaults                                                           #
 19 #                                                                                   #
 20 #####################################################################################
 21 # IP address of FRITZ!Box
 22 host="${2:-192.168.178.1}"
 23 #####################################################################################
 24 #                                                                                   #
 25 # SID has to be the first parameter                                                 #
 26 #                                                                                   #
 27 #####################################################################################
 28 [ -z "$1" ] && echo "Missing SID ..." && exit 1
 29 . $YF_SCRIPT_DIR/multipart_form
 30 td=$(multipart_form new)
 31 multipart_form addfield $td sid $1
 32 multipart_form addfield $td reboot
 33 request="$(multipart_form postdata $td)"
 34 printf "=== request ===\n" 1>&2
 35 printf "%s\n" "$(post_request "$request" "$host")" 1>&2
 36 printf "=== response ===\n" 1>&2
 37 post_request "$request" "$host" | nc -q 1 -C -w 2 $host 80
 38 printf "\n=== end of communication ===\n" 1>&2
 39 multipart_form cleanup $td
Das kann man nun entweder mit "curl" oder irgendeinem anderen Programm angehen, was den Aufbau eines solchen Requests beherrscht oder so wie oben gezeigt ... allerdings braucht es in Zeile 29 ein Skript aus meinem YourFritz-Repository (habe ich mal neu eingecheckt, war ohnehin fällig) und ein "nc"-Kommando, was die Optionen in Zeile 37 versteht (das geht auch anders, aber das ist hier nur das Prinzip).

Wenn man ansonsten kein PHP verwendet und nicht unbedingt scharf auf TR-064 ist, wäre das zumindest eine Alternative - aber auch wieder nur so lange, wie das "firmwarecfg" von AVM noch das "reboot"-Kommando kennt. Aber das sollte (Stand heute) auch für alle denkbaren FRITZ!OS-Versionen seit 05.xx funktionieren - theoretisch auch (mit der passenden URL) von extern über TLS.
 
Ich habe jetzt ein PHP Script gebaut das ich per Cron auf meinem Server ausführen lasse. Da ich nicht noch eine zweite Datei/Liste pflegen wollte habe ich das Script so gebaut, dass es die Zeilen mit den Daten der Boxen/Repeater des bereits von mir verwendeten Backup-Scripts benutzt

Code:
 <?php
$lines = file('/path/to/fritz.list');

foreach($lines as $line_num => $line)
{
        $teile = explode(",", $line);
        if ($teile[1] != "")
        {
                $fritzbox_Proto = 'http';
                $fritzbox_Adresse = $teile[1];
                $fritzbox_Port = '49000';
                $fritzbox_Url = '/upnp/control/deviceconfig';
                $fritzbox_Username = 'admin';
                $fritzbox_Password = $teile[5];
                $fritzbox_Name = $teile[0];
                $context = '';
        }
        else
        {
                $fritzbox_Proto = 'https';
                $fritzbox_Adresse = $teile[0];
                $fritzbox_Port = trim(preg_replace('/\s+/', ' ', $teile[6]));
                $fritzbox_Url = '/tr064/upnp/control/deviceconfig';
                $fritzbox_Username = $teile[4];
                $fritzbox_Password = $teile[5];
                $fritzbox_Name = $teile[0];
                $context = stream_context_create(['ssl' => [
                'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true]]);
        }

        $client = new SoapClient(null, array(
                'location' => $fritzbox_Proto . '://' . $fritzbox_Adresse . ':' . $fritzbox_Port . '' . $fritzbox_Url,
                'uri' => 'urn:dslforum-org:service:DeviceConfig:1',
                'noroot' => True,
                'login' => $fritzbox_Username,
                'password' => $fritzbox_Password,
                'trace' => True,
                'exceptions' => 0,
                'stream_context' => $context
        ));
        $action = 'Reboot';
        $argument = 'NewSessionID';
        $SID = '0000000000000000';
        $direction_in_value = $SID;

        // $result = $client->{$action}(new SoapParam($direction_in_value, $argument));

        $result = $client->
        {
                $action}();

                //
                // if(is_soap_fault($result))
                // {
                // print(" Fehlercode: $result->faultcode | Fehlerstring:
                //         $result->faultstring");
                // }
                // else
                // {
                // print "$result\n";
                // }

                if ($result != null)
                {
                        print "Fehler bei Reboot fuer $fritzbox_Name\n";
                }
                else
                {
                        print "Reboot fuer $fritzbox_Name ausgefuehrt\n";
                }

                // var_dump ($result);

        }

?>

Grundsätzlich basiert es auf dem Script von koyaanisqatsi auf der ersten Seite das ich nur für meine Zwecke abgewandelt habe. Es ist keine große Fehlerabfrage drin bzgl. des einlesens der Daten, ob z.B. die Datei geöffnet werden konnte etc... - in meinem Fall nicht nötig, da ich weiß, dass es die Datei gibt. Ich poste es hier der Vollständigkeit halber falls nochmal jemand suchen sollte :)
 
Zuletzt bearbeitet:
Hallo @All,

hat jemand ein fertiges "Neustart-Script" für die 7490 bzw. 7590, was er bitte als *.zip anhängen kann?

Das wäre super, vielen Dank ;)
 
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.