diff options
Diffstat (limited to 'recipes-core/initscripts/initscripts-1.0')
-rw-r--r-- | recipes-core/initscripts/initscripts-1.0/umountfs | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/recipes-core/initscripts/initscripts-1.0/umountfs b/recipes-core/initscripts/initscripts-1.0/umountfs new file mode 100644 index 0000000..1c9a9ce --- /dev/null +++ b/recipes-core/initscripts/initscripts-1.0/umountfs @@ -0,0 +1,158 @@ +#!/bin/bash +### BEGIN INIT INFO +# Provides: umountfs +# Required-Start: +# Required-Stop: +# Default-Start: +# Default-Stop: 0 6 +# Short-Description: Turn off swap and unmount all local file systems. +# Description: +### END INIT INFO + +PATH=/sbin:/bin:/usr/sbin:/usr/bin + +umount_all() { + echo "Deactivating swap..." + swapoff -a + + # We leave /proc mounted. + echo "Unmounting local filesystems..." + grep -q /mnt/ram /proc/mounts && mount -o remount,ro /mnt/ram + umount -f -a -r > /dev/null 2>&1 + + mount -o remount,ro / +} + +blink_leds() { + leds=/sys/class/leds/* + nleds=$(echo $leds | wc -w) + + # turn LEDs off + for led in $leds; do + echo "timer" > $led/trigger + echo 0 > $led/delay_off + done + + int=200 + total=$(( int * (nleds+1) )) + on=$(( total - int )) + off=$(( total - on )) + + # make a pattern + for led in $leds; do + echo "$on" > $led/delay_on + echo "$off" > $led/delay_off + on=$(( on - int )) + off=$(( total - on )) + done +} + +flash_upgrade() { + if [ $# -ne 1 ]; then + echo "need to specify flash-root" + return + fi + # flash_root must be a mountpoint that is not the rootfs and be mounted rw + local flash_root=${1} + + local flash_dir=${flash_root}/flash-upgrade + local uImage_file=${flash_dir}/uImage.bin + local rootfs_file=${flash_dir}/rootfs.jffs2 + + local reboot_cmd=/usr/sbin/upgrade-reboot + local nandwrite_cmd=/usr/bin/nandwrite.static + local mode= + local uImage_mtd= + local rootfs_mtd= + + if [ ! -d "${flash_dir}" ]; then + echo "${flash_dir} not present, skipping" + return + fi + + if ! mountpoint -q "${flash_root}"; then + echo "${flash_root} is not a mountpoint" + return + fi + + mode=$(grep "${flash_root}" /proc/mounts | cut -d ' ' -f 4 | cut -d ',' -f 1) + if [ "${mode}" != "rw" ]; then + echo "${flash_root} is not mounted rw" + return + fi + + if [ ! -x "${reboot_cmd}" ]; then + echo "${reboot_cmd} is not installed" + return + fi + + if [ ! -x "${nandwrite_cmd}" ]; then + echo "${nandwrite_cmd} is not installed" + return + fi + + uImage_mtd="/dev/$(cat /proc/mtd | grep uImage | cut -d : -f 1)" + if [ ! -c "${uImage_mtd}" ]; then + echo "No valid MTD partition is labeled uImage" + return + fi + + rootfs_mtd="/dev/$(cat /proc/mtd | grep Rootfs | cut -d : -f 1)" + if [ ! -c "${rootfs_mtd}" ]; then + echo "No valid MTD partition is labeled Rootfs" + return + fi + + echo "" + echo "Starting flash upgrade from ${flash_dir}..." + + blink_leds + + if [ -f ${uImage_file} ]; then + echo "Flashing ${uImage_mtd} (uImage) with ${uImage_file}..." + + flash_erase ${uImage_mtd} 0 0 + nandwrite -p ${uImage_mtd} ${uImage_file} + else + echo "uImage file ${uImage_file} not found" + fi + + if [ -f ${rootfs_file} ]; then + echo "Flashing ${rootfs_mtd} (rootfs) with ${rootfs_file}..." + + cp ${reboot_cmd} ${flash_dir}/upgrade-reboot + cp ${nandwrite_cmd} ${flash_dir}/nandwrite.static + + sync + sleep 2 + mount -o remount,ro ${flash_root} + + # flash_root is not going to be umounted + sed -i -e "\\|${flash_root}| d" /etc/mtab + + umount_all + + flash_erase -j ${rootfs_mtd} 0 0 + ${flash_dir}/nandwrite.static -p ${rootfs_mtd} ${rootfs_file} + + echo "Rebooting..." + + ${flash_dir}/upgrade-reboot + + # Should not get here normally + echo "upgrade-reboot failed" + exit 1 + else + echo "rootfs file ${rootfs_file} not found" + fi +} + +# do flash on reboot if do_flash_upgrade exists +if [ -f /var/volatile/do_flash_upgrade ]; then + flash_upgrade /var/volatile + flash_upgrade /media/card +fi + +umount_all + +: exit 0 |