OpenWrt – Blame information for rev 3
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | #!/bin/sh |
2 | |||
3 | RAM_ROOT=/tmp/root |
||
4 | |||
5 | [ -x /usr/bin/ldd ] || ldd() { LD_TRACE_LOADED_OBJECTS=1 $*; } |
||
6 | libs() { ldd $* 2>/dev/null | sed -r 's/(.* => )?(.*) .*/\2/'; } |
||
7 | |||
8 | install_file() { # <file> [ <file> ... ] |
||
9 | local target dest dir |
||
10 | for file in "$@"; do |
||
11 | if [ -L "$file" ]; then |
||
12 | target="$(readlink -f "$file")" |
||
13 | dest="$RAM_ROOT/$file" |
||
14 | [ ! -f "$dest" ] && { |
||
15 | dir="$(dirname "$dest")" |
||
16 | mkdir -p "$dir" |
||
17 | ln -s "$target" "$dest" |
||
18 | } |
||
19 | file="$target" |
||
20 | fi |
||
21 | dest="$RAM_ROOT/$file" |
||
22 | [ -f "$file" -a ! -f "$dest" ] && { |
||
23 | dir="$(dirname "$dest")" |
||
24 | mkdir -p "$dir" |
||
25 | cp "$file" "$dest" |
||
26 | } |
||
27 | done |
||
28 | } |
||
29 | |||
30 | install_bin() { |
||
31 | local src files |
||
32 | src=$1 |
||
33 | files=$1 |
||
34 | [ -x "$src" ] && files="$src $(libs $src)" |
||
35 | install_file $files |
||
36 | } |
||
37 | |||
38 | run_hooks() { |
||
39 | local arg="$1"; shift |
||
40 | for func in "$@"; do |
||
41 | eval "$func $arg" |
||
42 | done |
||
43 | } |
||
44 | |||
45 | ask_bool() { |
||
46 | local default="$1"; shift; |
||
47 | local answer="$default" |
||
48 | |||
49 | [ "$INTERACTIVE" -eq 1 ] && { |
||
50 | case "$default" in |
||
51 | 0) echo -n "$* (y/N): ";; |
||
52 | *) echo -n "$* (Y/n): ";; |
||
53 | esac |
||
54 | read answer |
||
55 | case "$answer" in |
||
56 | y*) answer=1;; |
||
57 | n*) answer=0;; |
||
58 | *) answer="$default";; |
||
59 | esac |
||
60 | } |
||
61 | [ "$answer" -gt 0 ] |
||
62 | } |
||
63 | |||
64 | v() { |
||
65 | [ "$VERBOSE" -ge 1 ] && echo "$@" |
||
66 | } |
||
67 | |||
68 | json_string() { |
||
69 | local v="$1" |
||
70 | v="${v//\\/\\\\}" |
||
71 | v="${v//\"/\\\"}" |
||
72 | echo "\"$v\"" |
||
73 | } |
||
74 | |||
75 | rootfs_type() { |
||
76 | /bin/mount | awk '($3 ~ /^\/$/) && ($5 !~ /rootfs/) { print $5 }' |
||
77 | } |
||
78 | |||
79 | get_image() { # <source> [ <command> ] |
||
80 | local from="$1" |
||
81 | local cmd="$2" |
||
82 | |||
83 | if [ -z "$cmd" ]; then |
||
84 | local magic="$(dd if="$from" bs=2 count=1 2>/dev/null | hexdump -n 2 -e '1/1 "%02x"')" |
||
85 | case "$magic" in |
||
86 | 1f8b) cmd="zcat";; |
||
87 | 425a) cmd="bzcat";; |
||
88 | *) cmd="cat";; |
||
89 | esac |
||
90 | fi |
||
91 | |||
92 | cat "$from" 2>/dev/null | $cmd |
||
93 | } |
||
94 | |||
95 | get_magic_word() { |
||
96 | (get_image "$@" | dd bs=2 count=1 | hexdump -v -n 2 -e '1/1 "%02x"') 2>/dev/null |
||
97 | } |
||
98 | |||
99 | get_magic_long() { |
||
100 | (get_image "$@" | dd bs=4 count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2>/dev/null |
||
101 | } |
||
102 | |||
103 | export_bootdevice() { |
||
104 | local cmdline uuid disk uevent line |
||
105 | local MAJOR MINOR DEVNAME DEVTYPE |
||
106 | |||
107 | if read cmdline < /proc/cmdline; then |
||
108 | case "$cmdline" in |
||
109 | *block2mtd=*) |
||
110 | disk="${cmdline##*block2mtd=}" |
||
111 | disk="${disk%%,*}" |
||
112 | ;; |
||
113 | *root=*) |
||
114 | disk="${cmdline##*root=}" |
||
115 | disk="${disk%% *}" |
||
116 | ;; |
||
117 | esac |
||
118 | |||
119 | case "$disk" in |
||
120 | PARTUUID=[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]-02) |
||
121 | uuid="${disk#PARTUUID=}" |
||
122 | uuid="${uuid%-02}" |
||
123 | for disk in $(find /dev -type b); do |
||
124 | set -- $(dd if=$disk bs=1 skip=440 count=4 2>/dev/null | hexdump -v -e '4/1 "%02x "') |
||
125 | if [ "$4$3$2$1" = "$uuid" ]; then |
||
126 | uevent="/sys/class/block/${disk##*/}/uevent" |
||
127 | break |
||
128 | fi |
||
129 | done |
||
130 | ;; |
||
131 | /dev/*) |
||
132 | uevent="/sys/class/block/${disk##*/}/uevent" |
||
133 | ;; |
||
134 | esac |
||
135 | |||
136 | if [ -e "$uevent" ]; then |
||
137 | while read line; do |
||
138 | export -n "$line" |
||
139 | done < "$uevent" |
||
140 | export BOOTDEV_MAJOR=$MAJOR |
||
141 | export BOOTDEV_MINOR=$MINOR |
||
142 | return 0 |
||
143 | fi |
||
144 | fi |
||
145 | |||
146 | return 1 |
||
147 | } |
||
148 | |||
149 | export_partdevice() { |
||
150 | local var="$1" offset="$2" |
||
151 | local uevent line MAJOR MINOR DEVNAME DEVTYPE |
||
152 | |||
153 | for uevent in /sys/class/block/*/uevent; do |
||
154 | while read line; do |
||
155 | export -n "$line" |
||
156 | done < "$uevent" |
||
157 | if [ $BOOTDEV_MAJOR = $MAJOR -a $(($BOOTDEV_MINOR + $offset)) = $MINOR -a -b "/dev/$DEVNAME" ]; then |
||
158 | export "$var=$DEVNAME" |
||
159 | return 0 |
||
160 | fi |
||
161 | done |
||
162 | |||
163 | return 1 |
||
164 | } |
||
165 | |||
166 | hex_le32_to_cpu() { |
||
3 | office | 167 | [ "$(echo 01 | hexdump -v -n 2 -e '/2 "%x"')" == "3031" ] && { |
1 | office | 168 | echo "${1:0:2}${1:8:2}${1:6:2}${1:4:2}${1:2:2}" |
169 | return |
||
170 | } |
||
171 | echo "$@" |
||
172 | } |
||
173 | |||
174 | get_partitions() { # <device> <filename> |
||
175 | local disk="$1" |
||
176 | local filename="$2" |
||
177 | |||
178 | if [ -b "$disk" -o -f "$disk" ]; then |
||
179 | v "Reading partition table from $filename..." |
||
180 | |||
181 | local magic=$(dd if="$disk" bs=2 count=1 skip=255 2>/dev/null) |
||
182 | if [ "$magic" != $'\x55\xAA' ]; then |
||
183 | v "Invalid partition table on $disk" |
||
184 | exit |
||
185 | fi |
||
186 | |||
187 | rm -f "/tmp/partmap.$filename" |
||
188 | |||
189 | local part |
||
190 | for part in 1 2 3 4; do |
||
191 | set -- $(hexdump -v -n 12 -s "$((0x1B2 + $part * 16))" -e '3/4 "0x%08X "' "$disk") |
||
192 | |||
193 | local type="$(( $(hex_le32_to_cpu $1) % 256))" |
||
194 | local lba="$(( $(hex_le32_to_cpu $2) ))" |
||
195 | local num="$(( $(hex_le32_to_cpu $3) ))" |
||
196 | |||
197 | [ $type -gt 0 ] || continue |
||
198 | |||
199 | printf "%2d %5d %7d\n" $part $lba $num >> "/tmp/partmap.$filename" |
||
200 | done |
||
201 | fi |
||
202 | } |
||
203 | |||
204 | jffs2_copy_config() { |
||
205 | if grep rootfs_data /proc/mtd >/dev/null; then |
||
206 | # squashfs+jffs2 |
||
207 | mtd -e rootfs_data jffs2write "$CONF_TAR" rootfs_data |
||
208 | else |
||
209 | # jffs2 |
||
210 | mtd jffs2write "$CONF_TAR" rootfs |
||
211 | fi |
||
212 | } |
||
213 | |||
214 | # Flash firmware to MTD partition |
||
215 | # |
||
216 | # $(1): path to image |
||
217 | # $(2): (optional) pipe command to extract firmware, e.g. dd bs=n skip=m |
||
218 | default_do_upgrade() { |
||
219 | sync |
||
220 | if [ "$SAVE_CONFIG" -eq 1 ]; then |
||
3 | office | 221 | get_image "$1" "$2" | mtd $MTD_CONFIG_ARGS -j "$CONF_TAR" write - "${PART_NAME:-image}" |
1 | office | 222 | else |
3 | office | 223 | get_image "$1" "$2" | mtd write - "${PART_NAME:-image}" |
1 | office | 224 | fi |
225 | } |
||
226 | |||
227 | do_upgrade_stage2() { |
||
228 | v "Performing system upgrade..." |
||
229 | if [ -n "$do_upgrade" ]; then |
||
230 | eval "$do_upgrade" |
||
231 | elif type 'platform_do_upgrade' >/dev/null 2>/dev/null; then |
||
232 | platform_do_upgrade "$IMAGE" |
||
233 | else |
||
234 | default_do_upgrade "$IMAGE" |
||
235 | fi |
||
236 | |||
237 | if [ "$SAVE_CONFIG" -eq 1 ] && type 'platform_copy_config' >/dev/null 2>/dev/null; then |
||
238 | platform_copy_config |
||
239 | fi |
||
240 | |||
241 | v "Upgrade completed" |
||
242 | sleep 1 |
||
243 | |||
244 | v "Rebooting system..." |
||
245 | umount -a |
||
246 | reboot -f |
||
247 | sleep 5 |
||
248 | echo b 2>/dev/null >/proc/sysrq-trigger |
||
249 | } |