[Gelöst] Zusammenlegen von Scripten

S

SF1975

Guest
Hallo,
Mittels des folgenden Scripts prüfe ich den Status einer VoIP-Rufnummer (sip settings/sip8/). Nun möchte ich aber in diesem einen Script 3 Rufnummern "überwachen" und mit 3 LEDs darstellen (sip7,sip8,sip9).
Ich komme da nicht weiter. Wie legt man das zusammen?
PHP:
 <?php

        /*
                +---------------------------------------------------------------------+
                |                                                                     |
                |   SensorAndSwitch Automation Pro                                    |
                |   PseudoGeräte-Script                                               |
                |   ===============================================================   |
                |   -> SIP                                                            |
                |      Fritz!Box Rufnummer 123456-Status                              |
                |                                                                     |
                +---------------------------------------------------------------------+
        */

        error_reporting(0);
        include "include/includefunctions.php";
        include "include/includefritzbox.php";
        include "include/includedateien.php";
        include "include/includeconf.php";
        include "include/includeconfig.php";
        include "include/includedefine.php";

        $fehler=true;
        if ($_GET["info"]=="status") {
            $Status = shell_exec("/usr/bin/ctlmgr_ctl r sip settings/sip8/activated");
            if ($Status) {
                $fehler=false;
                echo "S#".trim($Status)."#";
            }
            else {
                $fehler=true;
            }
        }
        if ($_GET["schalter"]=="1") {
            $Status = shell_exec("/usr/bin/ctlmgr_ctl w sip settings/sip8/activated 1");
            if ($Status) {
                $fehler=false;
                echo "S#1#";
            }
            else {
                $fehler=true;
            }
        }
        if ($_GET["schalter"]=="0") {
            $Status = shell_exec("/usr/bin/ctlmgr_ctl w sip settings/sip8/activated 0");
            if ($Status) {
                $fehler=false;
                echo "S#0#";
            }
            else {
                $fehler=true;
            }
        }

        if ($fehler) {
            $Login=$Conf["FB"]."/login_sid.lua";
            $user=$Conf["USER"];
            $password=$Conf["PASSWORD"];
            $url=FB."/query.lua?sid=".GetSessionID($Login,$user,$password)."&wlan=sip:settings/sip8/activated";
            $ch = curl_init();
            $timeout = 5;
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
            curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
            $Status = curl_exec($ch);
            curl_close($ch);
            if ($Status) {
                $x=explode('"',$Status);
                if ($x[3]=="0" or $x[3]=="1") {
                    $fehler=false;
                    echo 'P#Rufnummer-Status: <img src="'.PIC.'mled'.$x[3].'.png">*HTML#';
                }
                else {
                    $fehler=true;
                    echo "P##E##";
                }
            }
            else {
                $fehler=true;
                echo "P##E##";
            }
        }
        exit;
?>

Danach geht es mir um den Mediaserver (mediasrv settings) und den Onlinespeicher (webdavclient status).
PHP:
 <?php

        /*
                +---------------------------------------------------------------------+
                |                                                                     |
                |   SensorAndSwitch Automation Pro                                    |
                |   PseudoGeräte-Script                                               |
                |   ===============================================================   |
                |   -> WLAN                                                           |
                |      Fritz!Box Mediaserver-/Onlinespeicher-Status                   |
                |                                                                     |
                +---------------------------------------------------------------------+
        */

        error_reporting(0);
        include "include/includefunctions.php";
        include "include/includefritzbox.php";
        include "include/includedateien.php";
        include "include/includeconf.php";
        include "include/includeconfig.php";
        include "include/includedefine.php";

        $fehler=true;
        if ($_GET["info"]=="status") {
            $Status = shell_exec("/usr/bin/ctlmgr_ctl r webdavclient status/connection_state");
            if ($Status) {
                $fehler=false;
                echo "S#".trim($Status)."#";
            }
            else {
                $fehler=true;
            }
        }
        if ($_GET["schalter"]=="1") {
            $Status = shell_exec("/usr/bin/ctlmgr_ctl w webdavclient status/connection_state 1");
            if ($Status) {
                $fehler=false;
                echo "S#1#";
            }
            else {
                $fehler=true;
            }
        }
        if ($_GET["schalter"]=="0") {
            $Status = shell_exec("/usr/bin/ctlmgr_ctl w webdavclient status/connection_state 0");
            if ($Status) {
                $fehler=false;
                echo "S#0#";
            }
            else {
                $fehler=true;
            }
        }

        if ($fehler) {
            $Login=$Conf["FB"]."/login_sid.lua";
            $user=$Conf["USER"];
            $password=$Conf["PASSWORD"];
            $url=FB."/query.lua?sid=".GetSessionID($Login,$user,$password)."&wlan=webdavclient:status/connection_state";
            $ch = curl_init();
            $timeout = 5;
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
            curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
            $Status = curl_exec($ch);
            curl_close($ch);
            if ($Status) {
                $x=explode('"',$Status);
                if ($x[3]=="0" or $x[3]=="1") {
                    $fehler=false;
                    echo 'P#Mediaserver-/Onlinespeicher-Status: <img src="'.PIC.'mled'.$x[3].'.png">*HTML#';
                }
                else {
                    $fehler=true;
                    echo "P##E##";
                }
            }
            else {
                $fehler=true;
                echo "P##E##";
            }
        }
        exit;
?>

Vielleicht kann mir ja jemand unter die Arme greifen.

Vielen Dank vorab.

Frank
 
Zuletzt bearbeitet von einem Moderator:
Moins

Mit "SaS@Fritz!Box" ?
Als CGI würd ich alle Variablen auf einmal holen und in der CGI aufbereiten und zurückliefern.
Ein "simples" Beispiel, alle Registrare (username) holen/anzeigen...
cgi-bin/queries
Code:
#!/bin/sh
echo 'content-type: text/plain
'
cat extensions | ../scripts/query.lua > queries.txt
. queries.txt
echo -ne $VOIP_EXT_1_username $VOIP_EXT_2_username $VOIP_EXT_3_username $VOIP_EXT_4_username $VOIP_EXT_5_username $VOIP_EXT_6_username $VOIP_EXT_7_username $VOIP_EXT_8_username $VOIP_EXT_9_username $VOIP_EXT_10_username
#EOF
Erläuterung:
Da query.lua in einem Rutsch ganze Listen holen kann, in einem Format welches sich im Shellskript (CGI) als Variablen importieren läßt (. queries.txt), lassen sich einzelne Werte mit echo wie man es braucht ausgeben.
Die Liste die query.lua holt steht in...
cgi-bin/extensions
Code:
VOIP_EXT=voipextension:settings/extension/list(enabled,username,authname,clientid,extension_number,connect,reg_from_outside,gsm_tethering)
(Hier "nur" eine Liste, Mediaserver und Onlinespeicher können da natürlich auch noch rein)

Wenn du das erfolgreich nachvollziehen kannst, dann schau mal in die cgi-bin/queries.txt rein und achte auch mal auf die Geschwindigkeit. :D
 
Zuletzt bearbeitet:
Hallo,
Die Box möchte ich dabei unangetastet lassen. Die einzelnen Daten kommen ja auch ohne SAS auf der FBF.
 
Zuletzt bearbeitet von einem Moderator:
:confused: Das verstehe ich jetzt nicht.
Mindestens eine SaS Installation mit sashelper muss auf der FB vorhanden sein damit FB Kommandos überhaupt ausgeführt werden können.
Und eine CGI ist nichts anderes wie ein Shellskript welches auch Servervariablen verarbeiten kann.
Demnach ist dein Vorhaben unmöglich.
 
Zuletzt bearbeitet:
Ohne sashelper-Installation keine Betriebssystembefehle zur Werteerzeugung.
Die FritzboxGUI läuft intern als root und kann per lua sich die Werte generieren, ABER das ist im unveränderbar geschützten Bereich. Wie koyaanisqatsi sagt: Ohne FB-Installation von sashelper läuft da nichts, was nicht von AVM gewollt ist und das ist herzlich wenig. :mrgreen:
 
Ohne sashelper-Installation keine Betriebssystembefehle zur Werteerzeugung.
Eigentlich nicht mein Tisch ... aber eine Bemerkung erlaube ich mir trotzdem.

Die reine Abfrage wäre auch lösbar, wenn man auf der Box selbst nichts verändert. Das Lua-Variableninterface läßt sich auch über HTTP ansprechen (query.lua, zum Gebrauch einfach mal in die Datei hineinsehen, ist mit Beispiel gezeigt), gibt die Ergebnisse als JSON-Array zurück und kann damit - solange es nur als Sensor verwendet wird - auch ohne Modifikationen der Box (und damit auch für ansonsten unzugängliche Modelle, wie die DOCSIS-Boxen) benutzt werden. Allerdings ist für Queries eine gültige Anmeldung (also eine gültige SID) erforderlich, aber das ist bestimmt im Framework ohnehin irgendwo realisiert (nehme ich an, ich kenne es nicht wirklich).
 
Danke für die Info. Muss ich mich auch nochmal näher mit beschäftigen. Wo finde ich die query.lua im Verzeichnisbaum der FB?
 
/usr/www/avm/query.lua

Beispiel: "http://fritz.box/query.lua?sid=08154711usw&ld=landevice:settings/landevice/list(name,ip,mac)"

:cool: Dankeschön @PeterPawn
 
Hallo,
Das Script oben fragt ja auch nur ab ;) Es soll ja nichts geschaltet werden. Es geht um die Anzeige, ob die Rufnummern verfügbar sind ;):
 
Zuletzt bearbeitet von einem Moderator:
Ah, ok, nochmal vielen Dank an PeterPawn und koyaanisqatsi. :)
 
Hallo,
;) Es sollen quasi dann in einer Zeile 3 LED angezeigt werden, Farbe danach, ob die Rufnummer registriert ist oder nicht.
Da hapert es leider bei meinen Versuchen. Wenn ich versuche, 3 einzelne Scripte zu einem zusammen zu fassen, geht nichts mehr.
 
PHP:
<?php

        /*
                +---------------------------------------------------------------------+
                |                                                                     |
                |   SensorAndSwitch Automation Pro                                    |
                |   PseudoGeräte-Script                                               |
                |   ===============================================================   |
                |   -> SIP                                                            |
                |      Fritz!Box Rufnummer 123456-Status                              |
                |                                                                     |
                +---------------------------------------------------------------------+
        */

        error_reporting(0);
        include "include/includefunctions.php";
        include "include/includefritzbox.php";
        include "include/includedateien.php";
        include "include/includeconf.php";
        include "include/includeconfig.php";
        include "include/includedefine.php";

		$Login=$Conf["FB"]."/login_sid.lua";
		$user=$Conf["USER"];
		$password=$Conf["PASSWORD"];
		$url=FB."/query.lua?sid=".GetSessionID($Login,$user,$password)."&wlan=sip:settings/sip8/activated";
		$ch = curl_init();
		$timeout = 5;
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
		curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
		$Status1 = curl_exec($ch);
		curl_close($ch);
		$Login=$Conf["FB"]."/login_sid.lua";
		$user=$Conf["USER"];
		$password=$Conf["PASSWORD"];
		$url=FB."/query.lua?sid=".GetSessionID($Login,$user,$password)."&wlan=webdavclient:status/connection_state";
		$ch = curl_init();
		$timeout = 5;
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)");
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
		curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
		curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
		$Status2 = curl_exec($ch);
		curl_close($ch);
		$t1="2";
		$t2="2";
		$x1=explode('"',$Status1);
		if ($x1[3]=="0" or $x1[3]=="1") {
			$t1=$x1[3];
		}
		$x2=explode('"',$Status2);
		if ($x2[3]=="0" or $x2[3]=="1") {
			$t2=$x2[3];
		}
		echo 'P#RufnummerStatus: <img src="'.PIC.'mled'.$t1.'.png"> MediaStatus: <img src="'.PIC.'mled'.$t2.'.png">*HTML#';
        exit;
?>
 
@JL3: Hmm ... ich würde zwar freiwillig nichts selbst in PHP schreiben, aber das kann es eigentlich nicht sein. Du bist noch beim Editieren ?
 
Nein, ich habe nur SF1975's beide Scripte oben zusammengefügt, dass er sie wiedererkennt und weiß, worauf er da achten muss. ;)
 
Nein, ich habe nur SF1975's beide Scripte oben zusammengefügt
Ok, ich habe mal noch eine Frage zum Framework, die ich sicherlich auch aus dem PHP-Code heraussuchen könnte, die Du aber vielleicht auch mal schnell beantworten kannst.

Gibt es irgendwo einen "Session-Cache", der die Logins in die FRITZ!Box zusammenfaßt und das GetSessionID greift auf diesen Cache zurück oder wird da tatsächlich jedesmal eine neue Anmeldung an der FRITZ!Box ausgeführt ?

Für die schnelle Antwort reicht ein "Ja, wird gecached." oder ein "Nein". ;) Danke vorab
 
Sorry, aber was hat wlan mit sip zu tun?

PHP:
            $url=FB."/query.lua?sid=".GetSessionID($Login,$user,$password)."&wlan=sip:settings/sip8/activated";

Sollte es nicht so sein hier:
PHP:
            $url=FB."/query.lua?sid=".GetSessionID($Login,$user,$password)."&sip_8=sip:settings/sip8/activated";

oder

PHP:
            $url=FB."/query.lua?sid=".GetSessionID($Login,$user,$password)."&sip_0=sip:settings/sip0/activated&sip_1=sip:settings/sip1/activated&sip_2=sip:settings/sip2/activated&sip_3=sip:settings/sip3/activated&sip_4=sip:settings/sip4/activated&sip_5=sip:settings/sip5/activated&sip_6=sip:settings/sip6/activated&sip_7=sip:settings/sip7/activated&sip_8=sip:settings/sip8/activated&sip_9=sip:settings/sip9/activated";

Den Status der sip_0 - sip_9 kannst du mit den Json Parser in der query.lua Auslesen.

Die einsel abfrage lässt sich einfacher Parsen als die List Variante.
 
Sorry, aber was hat wlan mit sip zu tun?
Natürlich nichts, aber es ist egal, welcher Begriff da steht. Hier geht's nur darum, wie pseudoscripte zusammengeführt werden. Es funktioniert übrigens auch, wenn da wlan steht ;)
Also keine Aufregung, das passt so schon ;)

Aber danke für den query-Aufruf, so wäre es selbstverständlich eleganter zu lösen, aber darauf kam es bei dem Beispiel oben nicht an. :)
 
Die einsel abfrage lässt sich einfacher Parsen als die List Variante.
Na ja, das kommt sicherlich auf den Parser an.

Der Vorteil der Listenvariante ist es jedenfalls, daß diese sich automatisch an die tatsächlich vorhandenen SIP-Accounts anpaßt, seien es nun 3 oder 20 (diese Anzahl "reserviert" AVM bei den DOCSIS-Boxen, d.h. bis dahin werden vom Nutzer selbst erzeugte Einträge ggf. überschrieben bei der 6490).

Auch bei der Ausführungsgeschwindigkeit der query.lua müßte es - zumindest theoretisch - einen Unterschied machen, ob eine Listenabfrage mit 20 Einträgen oder 20 Einzelabfragen ausgeführt werden.
 
Ok, ich habe mal noch eine Frage zum Framework, die ich sicherlich auch aus dem PHP-Code heraussuchen könnte, die Du aber vielleicht auch mal schnell beantworten kannst.

Gibt es irgendwo einen "Session-Cache", der die Logins in die FRITZ!Box zusammenfaßt und das GetSessionID greift auf diesen Cache zurück oder wird da tatsächlich jedesmal eine neue Anmeldung an der FRITZ!Box ausgeführt ?

Für die schnelle Antwort reicht ein "Ja, wird gecached." oder ein "Nein". ;) Danke vorab
Nein, wird nicht gecached. Die Session-Cache-Umsetzung würde kompliziert werden, da theoretisch unbegrenzt viele Fritzboxen abgefragt werden können. Da ist mir vom bestehenden Konzept her nichts Brauchbares eingefallen. Das Ereignisprotopkoll ist bei meiner Fritzbox dennoch nicht mit Anmeldungen vollgeschrieben. Die Vergabe jeweils einer neuen SessionID sehe ich auch nicht als Problem.
 
:doktor:
PeterPawn schrieb:
Der Vorteil der Listenvariante ist es jedenfalls, daß diese sich automatisch an die tatsächlich vorhandenen SIP-Accounts anpaßt, seien es nun 3 oder 20 (diese Anzahl "reserviert" AVM bei den DOCSIS-Boxen, d.h. bis dahin werden vom Nutzer selbst erzeugte Einträge ggf. überschrieben bei der 6490).
Außerdem kommen noch Apps* daher die sich automatisch einen Registrar anlegen wollen.

Von Skripterseite, im speziellen vorgefertigten Skripten, soll heissen, wo der Benutzer am End selber nicht im Skript editieren will, erleichtert die Listenform doch auch Einiges.



* Fritz!App Fon
 
Zuletzt bearbeitet:
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.