#!/bin/bash # This script works with a tar archvie # called upgrade.bin in either /var/volatile # or on the SD card. # # This is what the tar file upgrade file # should look like to create an ipk upgrade # file. IPK files should be in all, # arm926ejste, and mtcdt (for mtcdt) cat <<'!EOF' >/dev/null . |-- install_list.txt |-- install_list.txt.md5 |-- install.sh* |-- install.sh.md5 |-- local.conf |-- local.conf.md5 |-- model |-- repo/ | |-- arm926ejste/ | | |-- busybox_1.24.1-r0.mlinux2.mlinux2.1_arm926ejste.ipk | | |-- busybox-hwclock_1.24.1-r0.mlinux2.mlinux2.1_arm926ejste.ipk | | |-- busybox-ifplugd_1.24.1-r0.mlinux2.mlinux2.1_arm926ejste.ipk | | |-- busybox-syslog_1.24.1-r0.mlinux2.mlinux2.1_arm926ejste.ipk | | |-- busybox-udhcpc_1.24.1-r0.mlinux2.mlinux2.1_arm926ejste.ipk | | |-- initscripts_1.0-r155.3.40.0_arm926ejste.ipk | | |-- initscripts-functions_1.0-r155.3.40.0_arm926ejste.ipk | | |-- Packages | | |-- Packages.gz | | `-- Packages.stamps | `-- Packages !EOF # # The tarball must be called upgrade.bin. # # The file /var/volatile/do_flash_upgrade must exist and # be owned by root. # # The tar file, upgrade.bin must be either in # /var/volatile/flash-upgrade or # /media/card/flash-upgrade # # Note that when this script is started, the # tar file is already unpacked, since this script # is in the tarball. # This script assumes that the rootfs and maybe /var # are writable. For MTR, we may need to set # root and var to read/write NAME=install.sh echo "$NAME starting" umount_all() { if [[ $1 == "error" ]] ; then echo "Cannot continue" err_leds sleep 10 fi 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 / ${up_dir}/upgrade-reboot # Should not get here normally echo "upgrade-reboot failed" /sbin/reboot exit 1 } err_leds() { led_dir=/sys/class/leds # blink all programmable LEDs except status leds=$(ls $led_dir/ | grep -v status) nleds=$(echo "$leds" | wc -w) # turn LEDs off for led in $leds; do echo "timer" > $led_dir/$led/trigger echo 0 > $led_dir/$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_dir/$led/delay_on echo "$off" > $led_dir/$led/delay_off done sleep 5 } flash_dir="$1" up_dir="${flash_dir}/flash-upgrade" if ! [[ -d ${up_dir} ]] ; then echo "\"${up_dir}\" is not present" umount_all error fi echo "ls -l ${flash_dir}" ls -l ${flash_dir} echo "ls -l ${up_dir}" ls -l "${up_dir}" cd "${up_dir}" if ! md5sum -c local.conf.md5 >/dev/null ; then echo "md5sum of local.conf is bad" umount_all error fi # opkg needs /tmp, so recreate it. # On a Conduit, this is always /var/volatile mkdir -m 01777 /var/volatile/tmp localcnf="${up_dir}/local.conf" echo "Local configuration file: ${localcnf}" echo mounts ... cat /proc/mounts echo "Update package list ... /usr/bin/opkg -f ${localcnf} update" /usr/bin/opkg -f "${localcnf}" update echo "List upgradable packages ... /usr/bin/opkg -f ${localcnf} list-upgradable" /usr/bin/opkg -f "${localcnf}" list-upgradable echo "Do package upgrade /usr/bin/opkg -f ${localcnf} upgrade" /usr/bin/opkg -f "${localcnf}" upgrade pkglist_file="install_list.txt" if [[ -r ${pkglist_file} ]] ; then if ! md5sum -c ${pkglist_file}.md5 ; then echo "md5sum bad on ${pkglist_file}" umount_all error fi OIFS="${IFS}" IFS=$'\n' for p in $(cat ${pkglist_file}) ; do echo /usr/bin/opkg -f "${localcnf}" install $p /usr/bin/opkg -f "${localcnf}" install $p done IFS="${OIFS}" fi echo "Rebooting..." umount_all ok echo "upgrade-reboot failed" exit 1