#!/bin/bash PERSISTENT_DIR="/var/persistent/" ERASE_PERSISTENT="${PERSISTENT_DIR}/mts_do_erase_persistent" dofile=/var/volatile/do_flash_upgrade dofactoryreset=0 id=$(id -u) function usage { echo "Usage: $0 -f upgrade.bin" echo " \"-f\" factory reset" echo " \"-h\" help" exit 1 } if (($(id -u) != 0)) ; then echo "You must be root to do a flash upgrade" exit 1 fi while getopts "hf" arg; do case $arg in h) usage exit 1 ;; f) mtd=$(cat /proc/mtd) if ! [[ $mtd =~ at91bootstrap ]] ; then echo Factory reset option is only supported on Atmel devices exit 1 fi dofactoryreset=1 ;; *) usage ;; esac done shift $((OPTIND-1)) if [ $# != 1 ]; then usage fi set -e upgrade=$1 mkdir -p /var/volatile cd /var/volatile # make sure firmware is for this device hw_version=$(cat /sys/devices/platform/mts-io/hw-version) firmware_model=$(tar -xO -f $upgrade model) shopt -s nocasematch if [[ ! "$hw_version" =~ ^$firmware_model- ]]; then logger -s -t firmware_upgrade "Wrong firmware for this hardware" logger -s -t firmware_upgrade "hw version: $hw_version" logger -s -t firmware_upgrade "firmware model: $firmware_model" exit 1 fi files=(bstrap.bin uboot.bin uImage.bin config.jffs2 oem.jffs2 rootfs.jffs2 install.sh) tobeflashed=0 # verify all MD5 sums for (( i = 0; i < ${#files[@]}; i++ )); do file=${files[i]} # if the file is in the tar, md5sum it if tar -t -f $upgrade | grep -F -q "$file"; then logger -s -t firmware_upgrade "Checking MD5 for $file..." if ! tar -x -f $upgrade $file.md5; then logger -s -t firmware_upgrade "MD5 is not found for the $file, upgrade aborted" exit 1 fi if ((dofactoryreset == 0)) ; then if ! tar -xO -f $upgrade $file | md5sum -c $file.md5; then logger -s -t firmware_upgrade "MD5 check failed, upgrade aborted" exit 1 fi fi tobeflashed=1 fi done if (( $tobeflashed )); then if ((dofactoryreset == 1)) ; then for name in "u-Boot Config" "u-Boot Redundant Config" ; do part=$(echo "$mtd" | grep "$name" | sed 's/:.*//') if [[ $part =~ ^mtd[0-9] ]] ; then flash_erase /dev/${part} 0 0 fi done fuser -mk /var/config || true for name in "User data" "Config" ; do part=$(echo "$mtd" | grep "\"$name\"" | sed 's/:.*//') num=$(echo "$part" | sed 's/mtd//') if [[ $part =~ ^mtd[0-9] ]] ; then umount -l /dev/mtdblock${num} || true flash_erase -j /dev/${part} 0 0 fi done fi mkdir -p /var/volatile/flash-upgrade newbinfile=/var/volatile/flash-upgrade/upgrade.bin mv -f $upgrade $newbinfile if ((dofactoryreset == 1)) ; then tar -xO -f "${newbinfile}" do_flash_upgrade >"$dofile" else touch "$dofile" fi chown "root:root" "${dofile}" || true uid=$(stat -c %u "${dofile}") || true result=$? if ((result != 0)) ; then logger -s -t firmware_upgrade "Cannot create ${dofile}" exit 1 fi if ((uid != 0)) ; then logger -s -t firmware_upgrade "Cannot set ownership of ${dofile} to root" exit 1 fi if ((dofactoryreset == 1)) ; then logger -s -t firmware_upgrade "Power Off" sleep 1 poweroff else ((KEEP_PERSISTENT)) || touch "$ERASE_PERSISTENT" logger -s -t firmware_upgrade "Rebooting" sleep 1 reboot fi # NOTREACHED exit 0 else logger -s -t firmware_upgrade "Nothing to be flashed!" exit 1 fi