upgrade.html: Rename uploaded firmware before sysupgrade

Submitted by Adrian Schmutzler on May 7, 2019, 1:46 p.m.

Details

Message ID 20190507134655.55608-1-freifunk@adrianschmutzler.de
State Superseded
Headers show

Commit Message

Adrian Schmutzler May 7, 2019, 1:46 p.m.
At the moment sysupgrade via WebUI is broken on many devices.
This is reproducible: While the (few) status messages seem
normal, the device boots again with the old firmware.
Sysupgrade via SSH always works.

The sysupgrade call in upgrade.html directly uses the path of
the uploaded firmware file as argument. From several tests and
based on caught stdout/stderr from this line, it looks like haserl
deletes the uploaded firmware file due to a hidden trigger before
or even while it is processed by sysupgrade.

The easiest way to work around that is to just rename the file
before using it as argument to sysupgrade. This will preserve the
file in case of a failed sysupgrade, but it will be overwritten
with the next try.

Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
---
 src/packages/fff/fff-web/Makefile                           | 2 +-
 src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html | 5 +++--
 2 files changed, 4 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/packages/fff/fff-web/Makefile b/src/packages/fff/fff-web/Makefile
index 9bb10f71..819644a5 100644
--- a/src/packages/fff/fff-web/Makefile
+++ b/src/packages/fff/fff-web/Makefile
@@ -1,7 +1,7 @@ 
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=fff-web
-PKG_RELEASE:=7
+PKG_RELEASE:=8
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
 
diff --git a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html
index 96199c22..5fe1526c 100755
--- a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html
+++ b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html
@@ -72,8 +72,9 @@  elif [ "$do_sysupgrade" = "1" ] ; then
 	echo "<pre>"
 	echo "# Freeing caches ..."
 	echo 3 > /proc/sys/vm/drop_caches
-	echo "# sysupgrade $args $HASERL_firmware_path"
-	sysupgrade $args $HASERL_firmware_path
+	echo "# sysupgrade $args /tmp/uploadedfw.bin"
+	mv -f "$HASERL_firmware_path" /tmp/uploadedfw.bin
+	sysupgrade $args /tmp/uploadedfw.bin
 	echo "</pre>"
 fi
 %>

Comments

Fabian Blaese May 9, 2019, 9:44 a.m.
Hm..

Möglicherweise ist hier das Problem, dass das Upgrade Skript seit OpenWRT 18.06 aktiv die Konsole schließt.
Mir erscheint das nach einem ziemlich ekligen Workaround. Kann man dem haserl nicht mitteilen, die Datei nicht zu löschen?

Gruß
Fabian

On 07.05.19 15:46, Adrian Schmutzler wrote:
> At the moment sysupgrade via WebUI is broken on many devices.
> This is reproducible: While the (few) status messages seem
> normal, the device boots again with the old firmware.
> Sysupgrade via SSH always works.
> 
> The sysupgrade call in upgrade.html directly uses the path of
> the uploaded firmware file as argument. From several tests and
> based on caught stdout/stderr from this line, it looks like haserl
> deletes the uploaded firmware file due to a hidden trigger before
> or even while it is processed by sysupgrade.
> 
> The easiest way to work around that is to just rename the file
> before using it as argument to sysupgrade. This will preserve the
> file in case of a failed sysupgrade, but it will be overwritten
> with the next try.
> 
> Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> ---
>  src/packages/fff/fff-web/Makefile                           | 2 +-
>  src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html | 5 +++--
>  2 files changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/src/packages/fff/fff-web/Makefile b/src/packages/fff/fff-web/Makefile
> index 9bb10f71..819644a5 100644
> --- a/src/packages/fff/fff-web/Makefile
> +++ b/src/packages/fff/fff-web/Makefile
> @@ -1,7 +1,7 @@
>  include $(TOPDIR)/rules.mk
>  
>  PKG_NAME:=fff-web
> -PKG_RELEASE:=7
> +PKG_RELEASE:=8
>  
>  PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
>  
> diff --git a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html
> index 96199c22..5fe1526c 100755
> --- a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html
> +++ b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html
> @@ -72,8 +72,9 @@ elif [ "$do_sysupgrade" = "1" ] ; then
>  	echo "<pre>"
>  	echo "# Freeing caches ..."
>  	echo 3 > /proc/sys/vm/drop_caches
> -	echo "# sysupgrade $args $HASERL_firmware_path"
> -	sysupgrade $args $HASERL_firmware_path
> +	echo "# sysupgrade $args /tmp/uploadedfw.bin"
> +	mv -f "$HASERL_firmware_path" /tmp/uploadedfw.bin
> +	sysupgrade $args /tmp/uploadedfw.bin
>  	echo "</pre>"
>  fi
>  %>
>
Adrian Schmutzler May 9, 2019, 10:25 a.m.
Hallo,

 

ich vermute ähnliches.

 

Ob jetzt haserl die Datei nicht löscht oder ich sie vorher wegkopiere ist für mich aber vom Ergebnis gleichwertig. (Man muss sie irgendwann manuell löschen, wenn das sysupgrade nicht klappt.)

 

Es gibt aber sicher diverse mögliche Varianten, das Problem zu lösen.

 

Ich wollte mit diesem Patch primär auf das Problem und die vermutete Ursache hinweisen, da es schon ein Show-Stopper ist, wenn das Upgrade per WebUI nicht mehr geht. Ich vermute, dass dieses Problem auch schon mit 20181202 auftritt (seit OpenWrt 18.06), es aber noch keiner gemerkt hat, weil ja seitdem kein Upgrade mehr. (Getestet habe ich das aber nicht)

 

Grüße

 

Adrian

 

 

From: Fabian Bläse [mailto:fabian@blaese.de] 
Sent: Donnerstag, 9. Mai 2019 11:44
To: Adrian Schmutzler <freifunk@adrianschmutzler.de>; franken-dev@freifunk.net
Subject: Re: [PATCH] upgrade.html: Rename uploaded firmware before sysupgrade

 

Hm.. 

Möglicherweise ist hier das Problem, dass das Upgrade Skript seit OpenWRT 18.06 aktiv die Konsole schließt. 
Mir erscheint das nach einem ziemlich ekligen Workaround. Kann man dem haserl nicht mitteilen, die Datei nicht zu löschen?

Gruß 
Fabian 

On 07.05.19 15:46, Adrian Schmutzler wrote: 
> At the moment sysupgrade via WebUI is broken on many devices. 
> This is reproducible: While the (few) status messages seem 
> normal, the device boots again with the old firmware. 
> Sysupgrade via SSH always works. 
> 
> The sysupgrade call in upgrade.html directly uses the path of 
> the uploaded firmware file as argument. From several tests and 
> based on caught stdout/stderr from this line, it looks like haserl 
> deletes the uploaded firmware file due to a hidden trigger before 
> or even while it is processed by sysupgrade. 
> 
> The easiest way to work around that is to just rename the file 
> before using it as argument to sysupgrade. This will preserve the 
> file in case of a failed sysupgrade, but it will be overwritten 
> with the next try. 
> 
> Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de <mailto:freifunk@adrianschmutzler.de> > 
> --- 
>  src/packages/fff/fff-web/Makefile                           | 2 +- 
>  src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html | 5 +++-- 
>  2 files changed, 4 insertions(+), 3 deletions(-) 
> 
> diff --git a/src/packages/fff/fff-web/Makefile b/src/packages/fff/fff-web/Makefile 
> index 9bb10f71..819644a5 100644 
> --- a/src/packages/fff/fff-web/Makefile 
> +++ b/src/packages/fff/fff-web/Makefile 
> @@ -1,7 +1,7 @@ 
>  include $(TOPDIR)/rules.mk 
>  
>  PKG_NAME:=fff-web 
> -PKG_RELEASE:=7 
> +PKG_RELEASE:=8 
>  
>  PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) 
>  
> diff --git a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html

> index 96199c22..5fe1526c 100755 
> --- a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html 
> +++ b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html 
> @@ -72,8 +72,9 @@ elif [ "$do_sysupgrade" = "1" ] ; then 
>       echo "<pre>" 
>       echo "# Freeing caches ..." 
>       echo 3 > /proc/sys/vm/drop_caches 
> -     echo "# sysupgrade $args $HASERL_firmware_path" 
> -     sysupgrade $args $HASERL_firmware_path 
> +     echo "# sysupgrade $args /tmp/uploadedfw.bin" 
> +     mv -f "$HASERL_firmware_path" /tmp/uploadedfw.bin 
> +     sysupgrade $args /tmp/uploadedfw.bin 
>       echo "</pre>" 
>  fi 
>  %> 
>
Fabian Blaese May 10, 2019, 3:12 p.m.
Hab mir dieses Haserl grade mal kurz angeguckt. Die Dokumentation [1] sagt:
"Haserl automatically deletes the temporary file when the script is finished. To keep the file, move it or rename it somewhere in the script."

Da das sysupgrade seit OpenWRT 18.06 den Upgradeprozess im Hintergrund startet [ubus Magie], ist Haserl an dieser Stelle natürlich dann auch beendet und entfernt die Datei.
In so fern bleibt uns wohl nichts anderes übrig, als die Datei zu verschieben.
(Tatsächlich ist es vermutlich gut, dass uns das hier mal auf die Füße fällt. Ich möchte nicht wissen, was da alles schief gehen könnte, wenn die Verbindung zum Webbrowser abreißt.)

Reviewed-by: Fabian Bläse <fabian@blaese.de>

Ist es möglich die verschobene Datei zu löschen, wenn eine neue Datei hochgeladen wird?
Ansonsten ist es bei einem fehlgeschlagenem Updateversuch möglich, noch mehr RAM zu verbraten (weil zwei Dateien hochgeladen werden können) und das gibt dann bestimmt ganz viele gebrickte Geräte.

On 09.05.19 12:25, Adrian Schmutzler wrote:
> Ich wollte mit diesem Patch primär auf das Problem und die vermutete Ursache hinweisen, da es schon ein Show-Stopper ist, wenn das Upgrade per WebUI nicht mehr geht. Ich vermute, dass dieses Problem auch schon mit 20181202 auftritt (seit OpenWrt 18.06), es aber noch keiner gemerkt hat, weil ja seitdem kein Upgrade mehr. (Getestet habe ich das aber nicht)
Danke. :-)
Es tritt ziemlich sicher auch mit 20181202 schon auf, ich hab das Problem schon häufiger gesehen und das ist ja auch schon OpenWRT 18.06 gewesen.

Fabian

[1] http://haserl.sourceforge.net/manpage.html
Adrian Schmutzler May 10, 2019, 3:32 p.m.
Hallo Fabian,

> Ist es möglich die verschobene Datei zu löschen, wenn eine neue Datei hochgeladen wird? 
> Ansonsten ist es bei einem fehlgeschlagenem Updateversuch möglich, noch mehr RAM zu verbraten (weil zwei Dateien hochgeladen werden können) und das gibt dann bestimmt ganz viele gebrickte Geräte.

Der Zieldateiname nach dem Verschieben ist ja gleich. Im schlimmsten Fall haben wir also tatsächlich kurzzeitig zwei Dateien (/tmp/uploadedfw.bin und die vom Upload). Da dieselbe Seite ja wieder geladen wird, und der Upload ja direkt vom Form gestartet wird, sehe ich im aktuellen Modus keine Möglichkeit das zu vermeiden, außer man leitet nach dem Upload nicht auf upgrade.html um, sondern woanders hin.

Wenn man das wirklich komplett ausschließen will, dann müsste man wohl tatsächlich das Löschen in haserl wegpatchen und die upload-pfad immer gleich lassen.

Ich denke aber, dass es vll. einfacher geht:
In den meisten vorhersehbaren Fällen, wo etwas nicht passt (z.B. falsches Devices im .bin), gibt sysupgrade brav exit code 1 zurück. Man könnte also für die ganzen normalen Fälle einfach
sysupgrade $args /tmp/uploadedfw.bin || rm /tmp/uploadedfw.bin
machen. Das erschlägt wohl > 95 % der Fälle. Wenn dann wirklich später im sysupgrade was kaputt geht, was davon nicht erwischt wird, startet er eh neu (wie er es ja auch ohne den Patch macht).

Nachdem ich jetzt so darüber nachgedacht habe, würde ich tatsächlich auch letzteres ganz gerne als V2 schicken, wenn du das ähnlich siehst.

Grüße

Adrian
Fabian Blaese May 25, 2019, 5:43 p.m.
Gibt es hierzu noch Meinungen?
Ansonsten würde ich das auch mit einem Review aufnehmen.

Gruß
Fabian

On 07.05.19 15:46, Adrian Schmutzler wrote:
> At the moment sysupgrade via WebUI is broken on many devices.
> This is reproducible: While the (few) status messages seem
> normal, the device boots again with the old firmware.
> Sysupgrade via SSH always works.
> 
> The sysupgrade call in upgrade.html directly uses the path of
> the uploaded firmware file as argument. From several tests and
> based on caught stdout/stderr from this line, it looks like haserl
> deletes the uploaded firmware file due to a hidden trigger before
> or even while it is processed by sysupgrade.
> 
> The easiest way to work around that is to just rename the file
> before using it as argument to sysupgrade. This will preserve the
> file in case of a failed sysupgrade, but it will be overwritten
> with the next try.
> 
> Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
> ---
>  src/packages/fff/fff-web/Makefile                           | 2 +-
>  src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html | 5 +++--
>  2 files changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/src/packages/fff/fff-web/Makefile b/src/packages/fff/fff-web/Makefile
> index 9bb10f71..819644a5 100644
> --- a/src/packages/fff/fff-web/Makefile
> +++ b/src/packages/fff/fff-web/Makefile
> @@ -1,7 +1,7 @@
>  include $(TOPDIR)/rules.mk
>  
>  PKG_NAME:=fff-web
> -PKG_RELEASE:=7
> +PKG_RELEASE:=8
>  
>  PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
>  
> diff --git a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html
> index 96199c22..5fe1526c 100755
> --- a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html
> +++ b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html
> @@ -72,8 +72,9 @@ elif [ "$do_sysupgrade" = "1" ] ; then
>  	echo "<pre>"
>  	echo "# Freeing caches ..."
>  	echo 3 > /proc/sys/vm/drop_caches
> -	echo "# sysupgrade $args $HASERL_firmware_path"
> -	sysupgrade $args $HASERL_firmware_path
> +	echo "# sysupgrade $args /tmp/uploadedfw.bin"
> +	mv -f "$HASERL_firmware_path" /tmp/uploadedfw.bin
> +	sysupgrade $args /tmp/uploadedfw.bin
>  	echo "</pre>"
>  fi
>  %>
>
Adrian Schmutzler May 25, 2019, 5:49 p.m.
Nimm doch bitte die Variante mit

 

sysupgrade $args /tmp/uploadedfw.bin || rm /tmp/uploadedfw.bin

 

ganz am Ende.

 

Grüße

 

Adrian

 

From: franken-dev [mailto:franken-dev-bounces@freifunk.net] On Behalf Of Fabian Bläse
Sent: Samstag, 25. Mai 2019 19:44
To: franken-dev@freifunk.net
Subject: Re: [PATCH] upgrade.html: Rename uploaded firmware before sysupgrade

 

Gibt es hierzu noch Meinungen? 
Ansonsten würde ich das auch mit einem Review aufnehmen. 

Gruß 
Fabian 

On 07.05.19 15:46, Adrian Schmutzler wrote: 
> At the moment sysupgrade via WebUI is broken on many devices. 
> This is reproducible: While the (few) status messages seem 
> normal, the device boots again with the old firmware. 
> Sysupgrade via SSH always works. 
> 
> The sysupgrade call in upgrade.html directly uses the path of 
> the uploaded firmware file as argument. From several tests and 
> based on caught stdout/stderr from this line, it looks like haserl 
> deletes the uploaded firmware file due to a hidden trigger before 
> or even while it is processed by sysupgrade. 
> 
> The easiest way to work around that is to just rename the file 
> before using it as argument to sysupgrade. This will preserve the 
> file in case of a failed sysupgrade, but it will be overwritten 
> with the next try. 
> 
> Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de <mailto:freifunk@adrianschmutzler.de> > 
> --- 
>  src/packages/fff/fff-web/Makefile                           | 2 +- 
>  src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html | 5 +++-- 
>  2 files changed, 4 insertions(+), 3 deletions(-) 
> 
> diff --git a/src/packages/fff/fff-web/Makefile b/src/packages/fff/fff-web/Makefile 
> index 9bb10f71..819644a5 100644 
> --- a/src/packages/fff/fff-web/Makefile 
> +++ b/src/packages/fff/fff-web/Makefile 
> @@ -1,7 +1,7 @@ 
>  include $(TOPDIR)/rules.mk 
>  
>  PKG_NAME:=fff-web 
> -PKG_RELEASE:=7 
> +PKG_RELEASE:=8 
>  
>  PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) 
>  
> diff --git a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html

> index 96199c22..5fe1526c 100755 
> --- a/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html 
> +++ b/src/packages/fff/fff-web/files/www/ssl/cgi-bin/upgrade.html 
> @@ -72,8 +72,9 @@ elif [ "$do_sysupgrade" = "1" ] ; then 
>       echo "<pre>" 
>       echo "# Freeing caches ..." 
>       echo 3 > /proc/sys/vm/drop_caches 
> -     echo "# sysupgrade $args $HASERL_firmware_path" 
> -     sysupgrade $args $HASERL_firmware_path 
> +     echo "# sysupgrade $args /tmp/uploadedfw.bin" 
> +     mv -f "$HASERL_firmware_path" /tmp/uploadedfw.bin 
> +     sysupgrade $args /tmp/uploadedfw.bin 
>       echo "</pre>" 
>  fi 
>  %> 
>
Fabian Blaese May 25, 2019, 5:56 p.m.
Ah. Kannst du das grade noch als v2 schicken?
Da erst ein Review drauf ist, würde ich gerne noch kurz abwarten.

Gruß
Fabian

On 25.05.19 19:49, mail@adrianschmutzler.de wrote:
> Nimm doch bitte die Variante mit
> sysupgrade $args /tmp/uploadedfw.bin || rm /tmp/uploadedfw.bin
> ganz am Ende.
Adrian Schmutzler May 25, 2019, 6:03 p.m.
Habs geschickt. Den Review hab ich vergessen anzuhängen.

 

From: Fabian Bläse [mailto:fabian@blaese.de] 
Sent: Samstag, 25. Mai 2019 19:57
To: mail@adrianschmutzler.de; franken-dev@freifunk.net
Subject: Re: [PATCH] upgrade.html: Rename uploaded firmware before sysupgrade

 

Ah. Kannst du das grade noch als v2 schicken? 
Da erst ein Review drauf ist, würde ich gerne noch kurz abwarten. 

Gruß 
Fabian 

On 25.05.19 19:49, mail@adrianschmutzler.de <mailto:mail@adrianschmutzler.de>  wrote: 
> Nimm doch bitte die Variante mit 
> sysupgrade $args /tmp/uploadedfw.bin || rm /tmp/uploadedfw.bin 
> ganz am Ende.