blob: 55683579449e3eafed58c87220b62c184bf290d9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
#!/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
|