base-files: sysupgrade cleanup
[openwrt/openwrt.git] / package / base-files / files / lib / upgrade / stage2
index 4e2aa3a..cc8047d 100755 (executable)
@@ -24,6 +24,104 @@ export CONF_TAR=/tmp/sysupgrade.tgz
 include /lib/upgrade
 
 
+supivot() { # <new_root> <old_root>
+       /bin/mount | grep "on $1 type" 2>&- 1>&- || /bin/mount -o bind $1 $1
+       mkdir -p $1$2 $1/proc $1/sys $1/dev $1/tmp $1/overlay && \
+       /bin/mount -o noatime,move /proc $1/proc && \
+       pivot_root $1 $1$2 || {
+               /bin/umount -l $1 $1
+               return 1
+       }
+
+       /bin/mount -o noatime,move $2/sys /sys
+       /bin/mount -o noatime,move $2/dev /dev
+       /bin/mount -o noatime,move $2/tmp /tmp
+       /bin/mount -o noatime,move $2/overlay /overlay 2>&-
+       return 0
+}
+
+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
+
+       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//:/ }
+       done
+       install_file /etc/resolv.conf /lib/*.sh /lib/functions/*.sh /lib/upgrade/*.sh $RAMFS_COPY_DATA
+
+       [ -L "/lib64" ] && ln -s /lib $RAM_ROOT/lib64
+
+       supivot $RAM_ROOT /mnt || {
+               echo "Failed to switch over to ramfs. Please reboot."
+               exit 1
+       }
+
+       /bin/mount -o remount,ro /mnt
+       /bin/umount -l /mnt
+
+       grep /overlay /proc/mounts > /dev/null && {
+               /bin/mount -o noatime,remount,ro /overlay
+               /bin/umount -l /overlay
+       }
+}
+
+kill_remaining() { # [ <signal> [ <loop> ] ]
+       local sig="${1:-TERM}"
+       local loop="${2:-0}"
+       local run=true
+       local stat
+
+       echo -n "Sending $sig to remaining processes ... "
+
+       while $run; do
+               run=false
+               for stat in /proc/[0-9]*/stat; do
+                       [ -f "$stat" ] || continue
+
+                       local pid name state ppid rest
+                       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
+
+                       local cmdline
+                       read cmdline < /proc/$pid/cmdline
+
+                       # Skip kernel threads
+                       [ -n "$cmdline" ] || continue
+
+                       echo -n "$name "
+                       kill -$sig $pid 2>/dev/null
+
+                       [ $loop -eq 1 ] && run=true
+               done
+       done
+       echo ""
+}
+
+
 killall -9 telnetd
 killall -9 dropbear
 killall -9 ash
@@ -44,7 +142,8 @@ fi
 
 if [ -n "$(rootfs_type)" ]; then
        echo "Switching to ramdisk..."
-       run_ramfs "$COMMAND"
-else
-       exec /bin/busybox ash -c "$COMMAND"
+       switch_to_ramfs
 fi
+
+# Exec new shell from ramfs
+exec /bin/busybox ash -c "$COMMAND"