[Fli4l_opt] opt_usercmd - eigenes Shell-Skript macht WAN kaputt?

Christoph Schulz fli4l at kristov.de
So Sep 20 09:54:12 CEST 2015


Hallo!

K.  Dreier schrieb:

> Via
> [...]
> USERCMD_BOOT_1='/usr/bin/initiate_proxy.sh'
> lasse ich das Skript während des Bootvorgangs (wann eigentlich genau?]
> vermeintlich aufrufen.

Die Skripte werden in /etc/rc.d/rc990.usercmd ausgeführt, also am Ende des 
Bootvorgangs.

> Kann ich das irgendwo sehen, ob das erfolgt ist
> bzw. eventuelle Fehler? Denn der Inhalt des Skripts setzt voraus, daß
> die WAN-Schnittstelle bereits online ist.

Auf der Konsole erscheint die Meldung "executing user-defined boot-commands 
...".

> Dieses Setup hat zur Folge, daß offensichtlich meine WAN-Schnittstelle
> sich nicht mehr verbindet bzw. keine IP bekommt.
> 
> Der Inhalt der obigen Shell-Datei ist (ohne die "----"):
> ----
> #!/bin/sh
> sleep 50
> echo y | plink -i /etc/ssh/mein_key.ppk username at remoteserver
> sleep 10
> plink -ssh -D 7070 -i /etc/ssh/mein_key.ppk username at remoteserver -N
> exit
> ----

Was du tust, ist den Bootvorgang für mindestens 60 Sekunden anzuhalten. Die 
Skripte werden synchron ausgeführt, d.h. der fli4l wartet darauf, dass sie 
sich beenden. Hinzu kommt, dass sowohl dein erstes als auch dein zweites 
plink-Kommando "ewig" läuft, so dass hier definitiv Schluss mit Booten ist.

> Beide Befehle in sich auf der Shell händisch ausgeführt
> funktionieren.
> Wenn ich das ganze Skript via Shell händisch aufrufe, bekomme ich eine
> Fehlermeldung, daß sleep eine invalid number hat.

Das ergibt keinen Sinn, außer du hast nicht auf die korrekten Zeilenenden 
geachtet. Sind diese Skripte wirklich mit den Unix-typischen LF-Zeilenenden 
ausgestattet? Windows-typische CR/LF wird nicht funktionieren.

> Insofern scheint es einen Fehler mit dem Shell-Skript zu geben, jedoch
> ist mir überhaupt nicht klar, wieso das meine WAN-Schnittstelle
> abschiesst?

Weil die Befehle alle in eine Datei geschrieben werden, die dann per "." 
(also "include") eingebunden wird. Wenn diese Datei dann Syntaxfehler hat, 
wird der komplette Bootvorgang abgebrochen.

> Sinn des Ganzen ist, daß die obigen Befehle wie gesagt voraussetzen,
> daß mein WAN online ist.

Dann ist das natürlich falsch, denn du wartest einfach x Sekunden. Woher 
weißt du, dass nach x Sekunden dein WAN online ist? Und woher weißt du, dass 
dein WAN nach x+1000 Sekunden immer noch online ist?

Ich würde das bei fli4l 3.10 durch ein Skript lösen, das alle x Sekunden 
prüft, ob ein gespeicherter WAN-Online-Zustand mit dem aktuellen WAN-Online-
Zustand übereinstimmt. Wenn nein, und der Router ist nun online, dann werden 
deine plink-Prozesse gestartet. Wenn der Router nun offline ist, werden 
diese wieder via kill beendet.

Beispiel:

==== %< =====

#!/bin/sh
old_state=offline
plink_pid=

while true
do
  sleep 60
  new_state=$(fli4lctrl status)
  case $old_state:$new_state in
  offline:online)
    echo y | plink -ssh -D 7070 -i /etc/ssh/mein_key.ppk 
username at remoteserver -N &
    plink_pid=$!
    ;;
  online:offline)
    kill $plink_pid
    ;;
  esac
  old_state=$new_state
done >/var/log/plink.log 2>&1 &

==== %< =====

Durch das "&" am Ende der letzten Zeile wird die Schleife im Hintergrund 
gestartet, so dass das Skript nicht den Bootvorgang aufhält.


Viele Grüße,
-- 
Christoph Schulz
[fli4l-Team]



Mehr Informationen über die Mailingliste Fli4l_opt