.titleBar { margin-bottom: 5px!important; }

WakeOnLan-Mod

Dieses Thema im Forum "FRITZ!Box Fon: Modifikationen" wurde erstellt von MaZderMind, 25 Aug. 2005.

  1. MaZderMind

    MaZderMind Neuer User

    Registriert seit:
    30 Juli 2005
    Beiträge:
    169
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi

    Angeregt von einigen Posts hier im Forum schreibe ich grade an einem WakeOnLan-Mod. Ziel ist es, im Webinterface der Fritz!Box eine Seite unterzubringen, über die bequem per Inter- und Intranet ein angegebener Rechner gestartet werden kann. Vorher wird mit Hilfe des webcm-Mods das Webinterface vor (einfachen) externen Zugriffen geschützt.
    Da ich noch Linux-Neuling bin, habe ich noch einige Fragen. Ich hoffe ihr könnt mir damt helfen.

    1. debug.cfg, wget oder eigenens Char-Device
    Der Mod muss einige Dateien ins Dateisystem schreiben (etherwake-Binary und wake-Shellscript als cgi-binary). Das wake-script wird mit seinen HTML-Ausgaben 4 bis 6 kb groß (ist noch nicht fertig). Bisher habe ich das shellsript aus der debug.cfg raus geschrieben und das etherwake-Binary von http://www.akk.org/~enrik/fbox/OLD/etherwake nachgeladen.
    Ich würde gern einen anderen weg finden als ~6kb in die debug.cfg zu klatschen. Entweder könntem an beide Files fest auf einem Server hosten (ich habe keine Domain deren Beständigkeit ich auf Dauer garaniteren könnte..) und beide nachladen, oder man könnte die Files aus dem Setup extrahieren lassen und dann als character-devices deklarieren, sodass sie einen reboot überleben (geht das u.U. auch mit dem etherwake-binary?)
    Nach meinem Unfall mit den Character-Devices wollte ich nur nochmal nachfragen..

    2. Variablen dauerhaft Speichern
    Da ich bei einem Pseudo-Image ja keien Einstellungen angeben kann, müssen die über das Webinterface geschehen. Ich rufe also das Interface auf und werde aufgefordert Daten einzugeben. Jetzt, so hab ich mir gedacht, speichere ich diese Daten in Umgebungsvariablen, sodass beim nächsten Aufruf des Webinterfaces diese zur verfügung stehen. Leider überleben die Variabeln nicht von einem Aufruf zum nächsten. Auch mit TESTVAR=hallo; export TESTVAR; nicht.. Weiß jemand wie das geht? Desweiteren müssen auch diese Einstellungen in der debug.cfg gespeichert werden, aber auch eine in der debug.cfg definierte Variable überlebt nicht bis zum Scriptaufruf...

    3. websvr, cgi-bin und POST
    Weiß jemand wie ich bei cgi-bins auf POST-Request reagieren kann (evtl Stdin?) oder wie ich den Querystring mit sed ordentlich verarbeiten kann.

    4. Portfreigabe automatisieren
    Kann man über ein Script eine Portfreigabe erwirken? es gibt ein ar7cfgctl-Kommando, mit dem das möglich sein sollte - weiß jemand näheres darüber?

    Vielen Dank & Gruß, Peter
     
  2. olistudent

    olistudent IPPF-Urgestein

    Registriert seit:
    19 Okt. 2004
    Beiträge:
    14,756
    Zustimmungen:
    1
    Punkte für Erfolge:
    0
    Beruf:
    Softwareentwickler
    Ort:
    Kaiserslautern
    1. Ich hab ein 15kb großes Testfile nach /var/flash/test kopiert, das war auch nach einem reboot noch da.
    Du musst halt aufpassen, dass du mit deiner minor nicht einem AVM-File in den Weg kommst.

    2. http://www.linuxquestions.org/questions/history/344057 :mrgreen:
    Klingt irgendwie logisch, ist aber .... Und hat mich 30 min gekostet. Ich dachte schon, ich wäre zu blöd dafür.
    Code:
    foo=${foo}
    if [ -z $foo ] ; then
    export foo="test"
    else
    echo $foo
    fi
    Aufrufen mit ". ./test".

    3.) Geht nur mit GET? http://www.ippf.tk/forum/viewtopic.php?p=161452#161452
    Das busybox wget kann leider kein POST

    4.) Keine Ahnung, wie das gehen soll!?

    MfG Oliver
     
  3. MaZderMind

    MaZderMind Neuer User

    Registriert seit:
    30 Juli 2005
    Beiträge:
    169
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hmm.. das etherwake-binary ist 618kb groß.. das is wohl zu groß für den flash.. oder? wie löscht man solche character-devices eigentlich ordenlich? einfach mir rm? warum hat dann meien fbf so einen schaden gehabt (s. oben verlinkter thread).

    zu 2. - Danke - habsch nisch gwusst ;)
    zu 3. - ich meinte das anders.. ein shellscript im cgi-bin wird vom websvr als cgi-binary aufgerufen, und der websvr kann postanfragen entgegennehmen. das webcm-binary arbeitet z.B. in der portforwaring-seite mit post.

    zu 4. das Webinterface kanns auch.. aber die hier (http://www.wehavemorefun.de/fritzbox/Ar7cfgctl) wissen auch nicht wie. Aber zum lesen von parametern ist es ganz nützlich:
    echo ar7cfg.ethinterfaces[eth0].ipaddr | ar7cfgctl -s gibt die IP-Adresse des eth0 aus. ebenso gehen alle anderen werteaus der ar7.cfg.. Ich würde ja mal bei avm anfragen - aber antworten die überhaupt auf solche Anfragen..?

    Gruß, Peter

    [edit] ich hab jetz einfach mal gefragt.. mal sehen wann und ob was kommt..
     
  4. Andrej

    Andrej Gesperrt

    Registriert seit:
    21 Feb. 2005
    Beiträge:
    2,209
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    HI
    Ich wollte mich mal erkundigen wie der stand der dinge ist.
    Und wenns fertig ist wie bringe ich das in die Box rein ?
     
  5. buehmann

    buehmann Aktives Mitglied

    Registriert seit:
    11 Juni 2005
    Beiträge:
    1,810
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    2. Das Speichern von Daten in Umgebungsvariablen wird nicht funktionieren, da diese nur an Kindprozesse vererbt werden. Und jeder Aufruf eines CGI-Skripts erzeugt einen neuen, von anderen Aufrufen unabhängigen Kindprozess des Webservers. (Die Methode von Oliver würde deswegen auch nur funktionieren, wenn du deinen eigenen Webserver als Shellskript schreibst.) Am besten schreibst du die Zustandsdaten in eine Datei und liest sie später wieder daraus ein.

    3. Hier findest du einen Überblick: http://hoohoo.ncsa.uiuc.edu/cgi/forms.html. Der Inhalt des POST-Requests kommt über stdin rein, aber leider ohne Dateiende, so dass du mit cat, read, etc. nicht besonders weit kommst (sie blockieren am Ende). (In $CONTENT_LENGTH steht, wieviel du lesen kannst.)
    Zum Dekodieren des Querystrings habe ich irgendwann mal etwas Experimentelles als Shellskript geschrieben:
    Code:
    #!/bin/sh
    url_decode() {
      local line
      echo "$*" | sed -e 's/+/ /g' \
        -e 's/\\/\\\\/g' -e 's/%\([0-9a-fA-F][0-9a-fA-F]\)/\\x\1/g' |
      while read -r line; do echo -ne "$line"; done
    }
    get_params() {
      local IFS="="
      local name value
      if [ -z "$*" ]; then return; fi
      echo "$*" | sed -e 's/&/\n/g' |
      while read -r name value
      do
        name=$(url_decode "$name"; echo _)
        value=$(url_decode "$value"; echo _)
        name=PARAM_$(echo -n "$name" | tr -c A-Za-z0-9_ _)
        value=$(echo -n "$value" | sed -e "s/'/'\\\\''/")
        echo "${name%_}='${value%_}'"
      done
    }
    echo -ne "Content-Type: text/plain\n\n"
    eval "$(get_params "$QUERY_STRING")"
    set
    
     
  6. MaZderMind

    MaZderMind Neuer User

    Registriert seit:
    30 Juli 2005
    Beiträge:
    169
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi
    Deine get_param-Routine ist der Hammer - vielen Dank.
    Mit dem STDIN hab ich mior fast gedacht - aber wie kann mandas nu einlesen..? Kann man vllt irgendwie ein Endezeichen einbauen? Wenn nicht dann halt nich...

    aber viel wichtiger wäre es, die Portfreigabe zu aufomatisieren. Da ich mit ar7cfgctl nicht weitergekommen bin, wäre es das einfachste, einen Request auf das webcm auszuführen - aber wie kann ich auf der Konsole POST-Daten an das Script übergeben?

    Code:
    export REMOTE_ADDR='192.168.178.210'
    export REQUEST_METHOD='GET'
    /usr/www/cgi-bin/webcm
    
    führt leider erstmal zur Login-Seite..

    Gruß, Peter

    [edit]
    ..oder auch nicht. Neue Konsole auf und nochmal versucht - nix. Aberes ging und ich werd morgen versuchen genau rauszufinden wo der haken ist.
     
  7. buehmann

    buehmann Aktives Mitglied

    Registriert seit:
    11 Juni 2005
    Beiträge:
    1,810
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Das ginge z.B. mit dd, aber das hast du in der Standardfirmware nicht zur Verfügung. Du brauchst halt eine beliebige Methode, mit der du eine bestimmte Anzahl Bytes von STDIN lesen kannst und nicht alles.
     
  8. MaZderMind

    MaZderMind Neuer User

    Registriert seit:
    30 Juli 2005
    Beiträge:
    169
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi
    Also heißt - es geht nicht. Naja macht nix, bleibts halt bei GET.. schade..
    Noch eine Frage - hast du eine Idee wie man einen Redirect aus einem Shellscript anstoßen kann?
    Normalerweise schickt man dazu einen Header wie
    Code:
    HTTP/1.1 302 Found
    Location: /
    Die beiden Headerzeilen kommen an, aber es wird ein 200er Statuscode geschickt und meine eigene Zeile ausgefiltert. (hab mit Telnet nachgeguckt was tatsächlich ankommt)

    Gruß, Peter
     
  9. buehmann

    buehmann Aktives Mitglied

    Registriert seit:
    11 Juni 2005
    Beiträge:
    1,810
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    (Nebenbei: Die URL hinter "Location" muss immer absolut sein, wenn ich mich recht erinnere.)

    Ja, das kam bei meinen Experimenten gerade auch raus. Interessant ist auch die Warnung des Webservers in der Situation (mit einer Statuszeile, die das CGI-Skript schreibt):
    Code:
    websrv: warning: cgi sent multiple statuslines for /cgi-bin/redirect
    
     
  10. MaZderMind

    MaZderMind Neuer User

    Registriert seit:
    30 Juli 2005
    Beiträge:
    169
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi
    / ist doch absolut ;)
    ich nehme an dass die "cgi-funktion" des Webservers selbst eien Statuszeiel generiert. zusammen mit der des cgi-Scriptes kommen zwei beim Webserver an - oder so. Ich weiß es nicht... Naja ist nicht soo wichtig, ich mache es per meta-redirect. Es ging nur darum, dass das PW ja offen in der Adresszeile angezeigt wird (beim aufwecken). Nach dem Aufwecken würde ich dann auf eine Erfolgs/Fehlerseite weiterleiten.

    Du kennst dich scheinbar mit Linux recht gut aus, darum hab ich noch ein paar Fragen:
    die Configdatei, die vom der Konfigurationsoberfläche eschrieben wird, sollte etwa so aussehen:
    Code:
    WOLMOD_PCS=2
    WOLMOD_INT_1='eth0'
    WOLMOD_MAC_1='00:11:22:33:44:55'
    WOLMOD_NAME_1='Arbeitsrechner'
    WOLMOD_INT_2='eth0'
    WOLMOD_MAC_2='11:22:33:44:55:66'
    WOLMOD_NAME_2='Laptop'
    Wie kann ich jetzt diese Liste durchlaufen und für jeden Eintrag eine bestimmte Aktion durchführen und dabei die Parametrer verwenden?

    Danke & Gruß, Peter

    [edit]
    Die Configdatei wird mittels . /var/flash/wolmod.cfg eingebunden, wodurch obige Einstellungen einfach als Variablen zugänglich sind.
     
  11. buehmann

    buehmann Aktives Mitglied

    Registriert seit:
    11 Juni 2005
    Beiträge:
    1,810
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Absoluter Pfad ja, aber absolute URL ... :)
    In einer Schleife von 1 bis $WOLMOD_PCS laufen und dynamisch die Variablennamen zusammenbauen:
    Code:
    i=1
    while [ $i -le $WOLMOD_PCS ]
    do
            for var in WOLMOD_INT WOLMOD_MAC WOLMOD_NAME
            do
                    eval "$var=\$${var}_$i"
            done
    
            echo $WOLMOD_INT
            echo $WOLMOD_MAC
            echo $WOLMOD_NAME
            echo
    
            i=$(( $i + 1 ))
    done
    
    Eine Unix-typischere Konfigurationsdatei würde übrigens die einzelnen Informationen durch Whitespace getrennt in Spalten ablegen:
    Code:
    eth0   00:11:22:33:44:55   Arbeitsrechner
    eth0   11:22:33:44:55:66   Laptop
    
    Damit ist das Drüberiterieren etwas einfacher:
    Code:
    cat /var/flash/wolmod.cfg |
    while read -r WOLMOD_INT WOLMOD_MAC WOLMOD_NAME
    do
            echo $WOLMOD_INT
            echo $WOLMOD_MAC
            echo $WOLMOD_NAME
            echo
    done
    
     
  12. MaZderMind

    MaZderMind Neuer User

    Registriert seit:
    30 Juli 2005
    Beiträge:
    169
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi
    du hast es erkannt - ich kenne mich mit Unix nicht sonderlich aus.
    Es sollen aber in dieser Datei noch mehr Einstellungen gespeichert werden, z.B. ob das Wol-Interface auf das Internet umgebogen werden soll, ob eine Mailbenachrichtigung versendet werden soll, die Accountdaten des Mailaccounts etc.
    Dann könnte ich inaus der debug.cfg einfach
    Code:
    . /var/flash/wolmod.cfg
    if [ "$WOLMOD_PUBLIC" == "1" ]; then
     ...
    fi
    schreiben.
    Wenn du dazu noch ne Idee hast dann würd ich mich darüber freuen, sonst benutze ich deinen obigen Code.

    Danke & Gruß, Peter
     
  13. buehmann

    buehmann Aktives Mitglied

    Registriert seit:
    11 Juni 2005
    Beiträge:
    1,810
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    In dem Fall bist du mit deiner ursprünglichen Lösung flexibler, nimm die.

    Was mir selbst an der Spaltenlösung übrigens auch nicht gefällt, ist, dass man immer überlegen muss, was welche Spalte bedeutet; und wenn doch mal Whitespace in Werten auftreten soll, bekommt man auch Probleme.
    Noch schöner als die _1-2_-3_-Lösung fände ich irgendwas mit Schachtelungen oder expliziten Listen (so wie in ar7.cfg zum Beispiel), aber um das zu lesen, braucht man mächtigere Werkzeuge als ein Shellskript.
     
  14. MaZderMind

    MaZderMind Neuer User

    Registriert seit:
    30 Juli 2005
    Beiträge:
    169
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Aaargh jetz weiß ich auch warum das net geht:
    Code:
    # A='aa=bb&cc=dd'
    #
    # echo $A
    aa=bb&cc=dd
    #
    # echo $A | sed -e 's/&/\n/g'
    aa=bbncc=dd
    Da kann die Parameterzerlegung ja nich gehen.. *grml*
    Ne idee?
    Gruß, Peter
     
  15. buehmann

    buehmann Aktives Mitglied

    Registriert seit:
    11 Juni 2005
    Beiträge:
    1,810
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hallo Peter, ich bin mir ziemlich sicher, dass ich den Code auf der Box getestet habe. Ich komme gerade nicht an meine Box heran, aber auf meinem Desktopsystem läuft's mit dem Busybox-sed:
    Code:
    ~> echo 'foo&bar' | busybox sed -e 's/&/\n/g'
    foo
    bar
    
    Seltsam ...
     
  16. MaZderMind

    MaZderMind Neuer User

    Registriert seit:
    30 Juli 2005
    Beiträge:
    169
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi
    Bei mir gibts nur foonbaar. Benutze die unmodifizierte Firmware 14.03.71.

    Gruß, Peter
     
  17. MaZderMind

    MaZderMind Neuer User

    Registriert seit:
    30 Juli 2005
    Beiträge:
    169
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hi
    Christoph von Wittich hat mir folgenden Tip gegeben:
    echo -e `echo 'foo&bar&quu' | sed -e "s/&/\\\\\n/g";`

    Könnt ihr (vllt. auch die, bei denen echo 'foo&bar&quu' | sed -e "s/&/\n/g"; ging) vllt. mal testen ob das korrekterweise
    Code:
    foo
    bar
    quu
    und zwar in drei Zeieln untereinander ausgibt?

    Vielen Dank, Gruß, Peter