OK, ich habe nur die Hälfte verstanden, aber die entscheidende Frage bleibt doch: Steht nun in der /var/tmp/delayed_reboot.pid eine PID drin? Ist es die von einer "firmwarecfg"-Instanz? Wird diese Instanz ordentlich beendet (ps vorher/hinterher)? Ändert es etwas, wenn Du das "-TERM" (Signal 15) beim "kill" wegläßt? Sollte es eigentlich nicht, aber man weiß ja nie ... wenn das über einen Watchdog realisiert ist mit dem Neustart, kommt der beim "TERM" vielleicht nicht mehr dazu, diesen Watchdog abzuräumen. Denkbar, daß ich da etwas übertrieben habe mit dem "Holzhammer".
Wenn ich das ohne Unterfunktion irgendwo geschrieben habe, ist meine ursprüngliche Vermutung, der Name "cleanup" wäre von mir, ja hinfällig, dann bin ich auch nicht für diesen (in meinen Augen eben unglücklich gewählten, s. #35) Namen verantwortlich, was mich in gewisser Weise wieder erleichtert.
Das "killall"-Problem besteht trotzdem ... wenn Du das als "workaround" ansiehst und das Problem in Deinem "cleanup" nicht findest/nicht suchst, kann ich ja auch nichts machen. Es bleibt aber ein nicht ganz sauberer Weg, erst recht dann, wenn Du damit quasi bewußt auch das "install"-Skript abbrichst.
Ich habe mir das ja auch nicht aus den Fingern gesogen ... genau so habe ich das selbst benutzt (allerding mit -KILL bzw. nichts anstelle des -TERM) und es hat (bis zur 06.23 der 7390) auch immer funktioniert - wenn es jetzt aus irgendwelchen Gründen nicht funktionieren will, muß man halt mal an der Stelle debuggen.
Dazu startet man einen "nc" mit einem FIFO als Eingabedatei und schreibt alles, was dort ankommt, auf eine IP-Adresse und einen Port ins LAN, wo man dann wieder eine nc-Instanz laufen läßt, die das anzeigt. In den FIFO läßt man dann die Ausgabe des install-Skripts schreiben, das kann man ja auch später mit "exec" erst auf diesen FIFO umlenken, dann kann man den nc-Start und das mkfifo auch noch im install-Skript machen. Dann hat man auch für die Zukunft einen Protokoll-Mechanismus (wenn man ihn nicht braucht, kommentiert man ihn eben aus), der weder auf USB baut (was u.U. nicht läuft) noch in das tmpfs schreibt, wo die Daten beim Reboot dann auch weg sind. Wenn die eigene Box dann auch keinen NAND-Flash hat (der auch sehr spät dismountet wird und dafür verwendet werden könnte), ist das einer der wenigen Wege, wie man doch noch zu einem Protokoll kommt. Die Alternative wäre "logger" (wenn das vorhanden ist), wobei das ohne einen laufenden "syslogd" auch nicht ins Netz protokollieren kann. Anstelle von "nc" kann man natürlich auch "socat" nehmen oder was sonst noch so rumliegt.
BTW: Wenn Du in der Zeit bis zum Neustart des ctlmgr den Benutzer nicht im Regen stehen lassen willst, könnte das in etwa so aussehen (von meinen alten Tests übrig geblieben):
Code:
<? include tools/static_html_head.html ?>
<? include tools/static_page_head.html ?>
<div class="blue_bar_back">
<h2>FRITZ!Box Pseudoimage-Upload</h2>
</div>
<div id="page_content" class="page_content">
<div class="formular">
Im Hintergrund werden jetzt die gestoppten Dienste der FRITZ!Box wieder gestartet.<br /><br />
<p class="ErrorMsg">
In <span id="waittime">30</span> Sekunden erfolgt die Weiterleitung auf die Übersichtsseite der FRITZ!Box.
</p>
<p>
Die im Pseudo-Image enthaltenen Kommandos werden nach dem Start der FRITZ!Box-Dienste ausgeführt.
<script type="text/javascript">
var displaytime = document.getElementById("waittime");
var intvl;
function init() {
intvl = window.setInterval("countdown()", 1000);
}
function countdown() {
var count = displaytime.innerHTML;
count--;
if (count > 0) {
displaytime.innerHTML = count;
}
else {
clearInterval(intvl);
window.location.assign("/home/home.lua?sid=<? SID ?>");
}
}
window.onload = init;
</script>
<? include tools/static_foot.html ?>
Das rechtzeitig per bind-Mount über die Datei /usr/www/$OEM/tools/update_result.html gemountet und da läuft ein sauberer Countdown bis zum Redirect.
Ich habe das "abgekoppelte" Ausführen der Skript-Anweisungen bei mir so realisiert:
Code:
#! /bin/sh
export INSTALL_SUCCESS_NO_REBOOT=0
cat >/var/pseudo/install <<'EOT'
#! /bin/sh
#
# let firmwarecfg settle a little bit
#
sleep 5
#
# stop delayed reboot from firmwarecfg
#
rpid_name=/var/run/delayed_reboot.pid
if test -e $rpid_name; then
rpid=$(cat $rpid_name)
rm $rpid_name 2>/dev/null
[ ${#rpid} -gt 0 ] && kill $rpid
fi
#
# remove the replaced update_result.html file
#
umount /var/pseudo/updres.html
#
# restart the stopped services to return to "normal" state
#
# restarts avmipcd, l2tpv3d, ctlmgr, upnpd, multid, ddnsd, upnpdevd, lltdd (if present), wlan and dsld
#
/etc/init.d/rc.net reload
#
# restarts the VoIP telephonie
#
/etc/init.d/rc.voip restart
#
# restart the USB subsystem, it has been stopped, if the update was done via GUI upload
#
/etc/init.d/rc.usbhost start
/sbin/udevadm trigger
#
# and start our customized command script now (needs multid for delay)
#
if pidof multid >/dev/null 2>&1; then
delay -d 1 RUNME "/bin/sh /var/pseudo/run_me.sh >/var/pseudo/run_me.log 2>&1"
else
nohup (sleep 1;/bin/sh /var/pseudo/run_me.sh >/var/pseudo/run_me.log 2>&1) &
fi
EOT
mount -o bind /var/pseudo/updres.html /usr/www/$OEM/tools/update_result.html
nohup /bin/sh /var/pseudo/install > /var/pseudo/install.log 2>&1 &
exit $INSTALL_SUCCESS_NO_REBOOT
Mal abgesehen von der bei mir nicht ganz vollständigen Reanimation von Diensten (Was ist bei TSB und Dir eigentlich mit "capiotcp_server"? Wird der mitgestartet?) befindet sich bei mir eben das "worker script" in einem gesonderten Unterverzeichnis im Image. Damit ändert sich das install-Skript selbst nicht und ich kann ziemlich einfach (durch neue Kommandos in "run_me.sh") ein komplett anderes Image erzeugen, ohne irgendwie mit einem Editor in den sensiblen Eingeweiden der /var/install herumfummeln zu müssen. Wenn ich selbst den ctlmgr neu starten will, gibt es ein weiteres Skript in /var/pseudo, was genau diese Funktion übernimmt (die wird ja auch an anderen Stellen benötigt, z.B. nach dem Editieren von ar7.cfg per vi) und dieses muß dann eben von "run_me.sh" aus aufgerufen werden. In diesem /var/pseudo-Verzeichnis liegen dann auch noch weitere Skripte (z.B. das irgendwo bei der 7490-Laborversion gezeigte Umschalten zwischen den Partitionen) ... dadurch, daß ich nur die run_me.sh anpassen muß vor dem Einpacken, ist die leichte Auswahl einer Funktion für das Pseudo-Image machbar.
Wenn Du das von x verschiedenen Versionen Deines Skripts (hier haben wir ja auch wieder zwei verschiedene, einmal mit und einmal ohne expliziten Telnet-Start) auf eine universelle zurechtstutzen willst, dann bietet es sich ja an, anstelle der "Countdown"-Seite in HTML eine Auswahlliste verschiedener Möglichkeiten anzubieten und nur den "submit"-Button solange zu sperren, bis das GUI der Box im Hintergrund wieder auf eine Ajax-Abfrage der Login-Seite reagiert (dann ist der ctlmgr wieder da). Dann den richtigen Radiobutton ausgewählt und den "submit"-Button gedrückt ... und schon hat man die gewünschte Funktion ausgeführt (das ist auch nur eine weitere Lua-Seite, die ein "OS-Kommando" ausführt, wie die Modifikation der "reboot"-Seite in modfs) und kann das alles mit einem einzigen Image realisieren und braucht dafür nicht mehrere spezialisierte für jeden Anwendungsfall.
PS: Das zusätzliche Leerzeichen zwischen Funktionsnamen und den runden Klammern bei der Definition einer Funktion bei Dir weiter oben stört aber tatsächlich nicht ... macht absolut keinen Unterschied, eben noch einmal getestet.