Signed-off-by: André Valentin <[email protected]>
---
 package/base-files/files/lib/upgrade/common.sh |   32 +++++++++++++++---------
 package/base-files/files/sbin/sysupgrade       |   13 ++++++++++
 2 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/package/base-files/files/lib/upgrade/common.sh 
b/package/base-files/files/lib/upgrade/common.sh
index ecf1a98..03a647e 100644
--- a/package/base-files/files/lib/upgrade/common.sh
+++ b/package/base-files/files/lib/upgrade/common.sh
@@ -108,18 +108,26 @@ kill_remaining() { # [ <signal> ]
                # Skip kernel threads
                [ -n "$cmdline" ] || continue
 
-               case "$name" in
-                       # Skip essential services
-                       
*procd*|*ash*|*init*|*watchdog*|*ssh*|*dropbear*|*telnet*|*login*|*hostapd*|*wpa_supplicant*|*nas*)
 : ;;
-
-                       # Killable process
-                       *)
-                               if [ $pid -ne $$ ] && [ $ppid -ne $$ ]; then
-                                       echo -n "$name "
-                                       kill -$sig $pid 2>/dev/null
-                               fi
-                       ;;
-               esac
+               if [ $$ -eq 1 ]; then
+                       # Running as init process, kill everything except me
+                       if [ $pid -ne $$ ]; then
+                               echo -n "$name "
+                               kill -$sig $pid 2>/dev/null
+                       fi
+               else 
+                       case "$name" in
+                               # Skip essential services
+                               
*procd*|*ash*|*init*|*watchdog*|*ssh*|*dropbear*|*telnet*|*login*|*hostapd*|*wpa_supplicant*|*nas*)
 : ;;
+
+                               # Killable process
+                               *)
+                                       if [ $pid -ne $$ ] && [ $ppid -ne $$ ]; 
then
+                                               echo -n "$name "
+                                               kill -$sig $pid 2>/dev/null
+                                       fi
+                               ;;
+                       esac
+               fi
        done
        echo ""
 }
diff --git a/package/base-files/files/sbin/sysupgrade 
b/package/base-files/files/sbin/sysupgrade
index 479cbad..5159367 100755
--- a/package/base-files/files/sbin/sysupgrade
+++ b/package/base-files/files/sbin/sysupgrade
@@ -19,6 +19,8 @@ export NEED_IMAGE=
 export HELP=0
 export FORCE=0
 export TEST=0
+export RUN_AS_INIT=0
+export ALL_ARGS="$*"
 
 # parse options
 while [ -n "$1" ]; do
@@ -33,6 +35,7 @@ while [ -n "$1" ]; do
                -r|--restore-backup) export CONF_RESTORE="$2" NEED_IMAGE=1; 
shift;;
                -l|--list-backup) export CONF_BACKUP_LIST=1; break;;
                -f) export CONF_IMAGE="$2"; shift;;
+               -s) export RUN_AS_INIT=1;;
                -F|--force) export FORCE=1;;
                -T|--test) export TEST=1;;
                -h|--help) export HELP=1; break;;
@@ -62,6 +65,9 @@ upgrade-option:
        -i           interactive mode
        -c           attempt to preserve all changed files in /etc/
        -n           do not save configuration over reflash
+        -s           run the upgrade process as init (PID 0)
+                     this allows ubifs upgrades i.e.
+                     important: use full image path like /tmp/xx.bin
        -T | --test
                     Verify image and config .tar.gz but do not actually flash.
        -F | --force
@@ -220,6 +226,13 @@ if [ $TEST -eq 1 ]; then
        exit 0
 fi
 
+# should we inform procd to run this script
+if [ $RUN_AS_INIT -eq 1 ] && [ $$ -ne 1 ]; then
+        ubus call system upgrade_as_init \
+                '{ "command": "/sbin/sysupgrade", "arguments": "'$ARGV'" }'
+        exit 0
+fi
+
 run_hooks "" $sysupgrade_pre_upgrade
 
 ubus call system upgrade
-- 
1.7.10.4
_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to