| #!/bin/sh |
| |
| echo shutdown: "$@" |
| |
| export PS1="shutdown-sh# " |
| # exec bin/sh |
| |
| cd / |
| if [ ! -e /proc/mounts ] |
| then |
| mkdir -p /proc |
| mount proc /proc -tproc |
| umount_proc=1 |
| else |
| umount_proc= |
| fi |
| |
| # Remove an empty oldroot, that means we are not invoked from systemd-shutdown |
| rmdir /oldroot 2>/dev/null |
| |
| # Move /oldroot/run to /mnt in case it has the underlying rofs loop mounted. |
| # Reverse sort order will ensure the overlay is unmounted before the loop mount |
| mkdir -p /mnt |
| mount --move /oldroot/run /mnt |
| |
| # Unmount paths with /oldroot /mnt under / and those ending with ro or rw |
| # Use . to match any single character because busybox awk doesn't handle [/] |
| awk '$2 ~ /^.oldroot|^.mnt|.r[ow]$/ { print $2 }' < /proc/mounts | sort -r | while IFS= read -r f |
| do |
| echo "Unmounting $f" |
| umount "$f" |
| done |
| |
| update=/run/initramfs/update |
| image=/run/initramfs/image- |
| |
| wdt="-t 1 -T 5" |
| wdrst="-T 15" |
| |
| if ls $image* > /dev/null 2>&1 |
| then |
| if test -x $update |
| then |
| if test -c /dev/watchdog |
| then |
| echo Pinging watchdog ${wdt+with args $wdt} |
| # shellcheck disable=SC2086 |
| watchdog $wdt -F /dev/watchdog & |
| wd=$! |
| else |
| wd= |
| fi |
| $update --clean-saved-files |
| remaining=$(ls $image*) |
| if test -n "$remaining" |
| then |
| echo 1>&2 "Flash update failed to flash these images:" |
| echo 1>&2 "$remaining" |
| else |
| echo "Flash update completed." |
| fi |
| |
| if test -n "$wd" |
| then |
| kill -9 $wd |
| if test -n "$wdrst" |
| then |
| echo "Resetting watchdog timeouts to $wdrst" |
| # shellcheck disable=SC2086 |
| watchdog $wdrst -F /dev/watchdog & |
| sleep 1 |
| # Kill the watchdog daemon, setting a timeout |
| # for the remaining shutdown work |
| kill -9 $! |
| fi |
| fi |
| else |
| echo 1>&2 "Flash update requested but $update program missing!" |
| fi |
| fi |
| |
| echo Remaining mounts: |
| cat /proc/mounts |
| |
| test "$umount_proc" && umount /proc && rmdir /proc |
| |
| # tcsattr(tty, TIOCDRAIN, mode) to drain tty messages to console |
| test -t 1 && stty cooked 0<&1 |
| |
| # Execute the command systemd told us to ... |
| if test -d /oldroot && test "$1" |
| then |
| if test "$1" = kexec |
| then |
| $1 -f -e |
| else |
| $1 -f |
| fi |
| fi |
| |
| |
| echo "Execute ${1-reboot} -f if all unmounted ok, or exec /init" |
| |
| export PS1="shutdown-sh# " |
| exec /bin/sh |