base-files: pass "save_config" option to the "sysupgrade" method
[openwrt/staging/chunkeey.git] / package / base-files / files / lib / upgrade / stage2
index 9d12cc801cf97b8adb2a28b0dc43a198ede2f315..4e5837af833dd7217ca8d9946584a02751eb0138 100755 (executable)
@@ -6,10 +6,6 @@
 export IMAGE="$1"
 COMMAND="$2"
 
-export ARGV="$IMAGE"
-export ARGC=1
-
-export SAVE_CONFIG=1
 export SAVE_PARTITIONS=1
 
 export INTERACTIVE=0
@@ -17,8 +13,10 @@ export VERBOSE=1
 export CONFFILES=/tmp/sysupgrade.conffiles
 export CONF_TAR=/tmp/sysupgrade.tgz
 
+RAMFS_COPY_BIN=                # extra programs for temporary ramfs root
+RAMFS_COPY_DATA=       # extra data files
+
 
-[ -f "$CONF_TAR" ] || export SAVE_CONFIG=0
 [ -f /tmp/sysupgrade.always.overwrite.bootdisk.partmap ] && export SAVE_PARTITIONS=0
 
 include /lib/upgrade
@@ -41,34 +39,22 @@ supivot() { # <new_root> <old_root>
 }
 
 switch_to_ramfs() {
-       install_bin /bin/busybox /bin/ash /bin/sh /bin/mount /bin/umount        \
-               /sbin/pivot_root /sbin/reboot /bin/sync /bin/dd /bin/grep       \
-               /bin/cp /bin/mv /bin/tar /usr/bin/md5sum "/usr/bin/[" /bin/dd   \
-               /bin/vi /bin/ls /bin/cat /usr/bin/awk /usr/bin/hexdump          \
-               /bin/sleep /bin/zcat /usr/bin/bzcat /usr/bin/printf /usr/bin/wc \
-               /bin/cut /usr/bin/printf /bin/sync /bin/mkdir /bin/rmdir        \
-               /bin/rm /usr/bin/basename /bin/kill /bin/chmod /usr/bin/find \
-               /bin/mknod /bin/touch /bin/sed
-
-       install_bin /sbin/mtd
-       install_bin /sbin/mount_root
-       install_bin /sbin/snapshot
-       install_bin /sbin/snapshot_tool
-       install_bin /usr/sbin/ubiupdatevol
-       install_bin /usr/sbin/ubiattach
-       install_bin /usr/sbin/ubiblock
-       install_bin /usr/sbin/ubiformat
-       install_bin /usr/sbin/ubidetach
-       install_bin /usr/sbin/ubirsvol
-       install_bin /usr/sbin/ubirmvol
-       install_bin /usr/sbin/ubimkvol
-       install_bin /usr/sbin/partx
-       install_bin /usr/sbin/losetup
-       install_bin /usr/sbin/mkfs.ext4
-       for file in $RAMFS_COPY_BIN; do
-               install_bin ${file//:/ }
+       for binary in \
+               /bin/busybox /bin/ash /bin/sh /bin/mount /bin/umount    \
+               pivot_root mount_root reboot sync kill sleep            \
+               md5sum hexdump cat zcat bzcat dd tar                    \
+               ls basename find cp mv rm mkdir rmdir mknod touch chmod \
+               '[' printf wc grep awk sed cut                          \
+               mtd partx losetup mkfs.ext4                             \
+               ubiupdatevol ubiattach ubiblock ubiformat               \
+               ubidetach ubirsvol ubirmvol ubimkvol                    \
+               snapshot snapshot_tool                                  \
+               $RAMFS_COPY_BIN
+       do
+               local file="$(which "$binary" 2>/dev/null)"
+               [ -n "$file" ] && install_bin "$file"
        done
-       install_file /etc/resolv.conf /lib/*.sh /lib/functions/*.sh /lib/upgrade/*.sh $RAMFS_COPY_DATA
+       install_file /etc/resolv.conf /lib/*.sh /lib/functions/*.sh /lib/upgrade/*.sh /lib/upgrade/do_stage2 $RAMFS_COPY_DATA
 
        [ -L "/lib64" ] && ln -s /lib $RAM_ROOT/lib64
 
@@ -87,10 +73,13 @@ switch_to_ramfs() {
 }
 
 kill_remaining() { # [ <signal> [ <loop> ] ]
+       local loop_limit=10
+
        local sig="${1:-TERM}"
        local loop="${2:-0}"
        local run=true
        local stat
+       local proc_ppid=$(cut -d' ' -f4  /proc/$$/stat)
 
        echo -n "Sending $sig to remaining processes ... "
 
@@ -103,8 +92,8 @@ kill_remaining() { # [ <signal> [ <loop> ] ]
                        read pid name state ppid rest < $stat
                        name="${name#(}"; name="${name%)}"
 
-                       # Skip PID1, ourself and our children
-                       [ $pid -ne 1 -a $pid -ne $$ -a $ppid -ne $$ ] || continue
+                       # Skip PID1, our parent, ourself and our children
+                       [ $pid -ne 1 -a $pid -ne $proc_ppid -a $pid -ne $$ -a $ppid -ne $$ ] || continue
 
                        local cmdline
                        read cmdline < /proc/$pid/cmdline
@@ -117,10 +106,18 @@ kill_remaining() { # [ <signal> [ <loop> ] ]
 
                        [ $loop -eq 1 ] && run=true
                done
+
+               let loop_limit--
+               [ $loop_limit -eq 0 ] && {
+                       echo
+                       echo "Failed to kill all processes."
+                       exit 1
+               }
        done
-       echo ""
+       echo
 }
 
+indicate_upgrade
 
 killall -9 telnetd
 killall -9 dropbear
@@ -134,10 +131,7 @@ sleep 1
 
 
 if [ -n "$IMAGE" ] && type 'platform_pre_upgrade' >/dev/null 2>/dev/null; then
-       IS_PRE_UPGRADE=1 platform_pre_upgrade "$IMAGE"
-
-       # Needs to be unset again because of busybox weirdness ...
-       IS_PRE_UPGRADE=
+       platform_pre_upgrade "$IMAGE"
 fi
 
 if [ -n "$(rootfs_type)" ]; then