OpenWrt – Blame information for rev 3
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 1 | #!/bin/sh |
2 | |||
3 | . /lib/functions.sh |
||
4 | . /lib/functions/system.sh |
||
5 | |||
6 | # initialize defaults |
||
7 | export MTD_CONFIG_ARGS="" |
||
8 | export INTERACTIVE=0 |
||
9 | export VERBOSE=1 |
||
10 | export SAVE_CONFIG=1 |
||
11 | export SAVE_OVERLAY=0 |
||
12 | export SAVE_PARTITIONS=1 |
||
13 | export CONF_IMAGE= |
||
14 | export CONF_BACKUP_LIST=0 |
||
15 | export CONF_BACKUP= |
||
16 | export CONF_RESTORE= |
||
17 | export NEED_IMAGE= |
||
18 | export HELP=0 |
||
19 | export FORCE=0 |
||
20 | export TEST=0 |
||
21 | |||
22 | # parse options |
||
23 | while [ -n "$1" ]; do |
||
24 | case "$1" in |
||
25 | -i) export INTERACTIVE=1;; |
||
26 | -v) export VERBOSE="$(($VERBOSE + 1))";; |
||
27 | -q) export VERBOSE="$(($VERBOSE - 1))";; |
||
28 | -n) export SAVE_CONFIG=0;; |
||
3 | office | 29 | -c) export SAVE_OVERLAY=1;; |
1 | office | 30 | -p) export SAVE_PARTITIONS=0;; |
31 | -b|--create-backup) export CONF_BACKUP="$2" NEED_IMAGE=1; shift;; |
||
32 | -r|--restore-backup) export CONF_RESTORE="$2" NEED_IMAGE=1; shift;; |
||
3 | office | 33 | -l|--list-backup) export CONF_BACKUP_LIST=1; break;; |
1 | office | 34 | -f) export CONF_IMAGE="$2"; shift;; |
35 | -F|--force) export FORCE=1;; |
||
36 | -T|--test) export TEST=1;; |
||
37 | -h|--help) export HELP=1; break;; |
||
38 | -*) |
||
3 | office | 39 | echo "Invalid option: $1" |
1 | office | 40 | exit 1 |
41 | ;; |
||
42 | *) break;; |
||
43 | esac |
||
44 | shift; |
||
45 | done |
||
46 | |||
47 | export CONFFILES=/tmp/sysupgrade.conffiles |
||
48 | export CONF_TAR=/tmp/sysupgrade.tgz |
||
49 | |||
50 | IMAGE="$1" |
||
51 | |||
3 | office | 52 | [ -z "$IMAGE" -a -z "$NEED_IMAGE" -o $HELP -gt 0 ] && { |
1 | office | 53 | cat <<EOF |
54 | Usage: $0 [<upgrade-option>...] <image file or URL> |
||
3 | office | 55 | $0 [-q] [-i] <backup-command> <file> |
1 | office | 56 | |
57 | upgrade-option: |
||
58 | -f <config> restore configuration from .tar.gz (file or url) |
||
59 | -i interactive mode |
||
60 | -c attempt to preserve all changed files in /etc/ |
||
61 | -n do not save configuration over reflash |
||
62 | -p do not attempt to restore the partition table after flash. |
||
63 | -T | --test |
||
64 | Verify image and config .tar.gz but do not actually flash. |
||
65 | -F | --force |
||
66 | Flash image even if image checks fail, this is dangerous! |
||
67 | -q less verbose |
||
68 | -v more verbose |
||
69 | -h | --help display this help |
||
70 | |||
71 | backup-command: |
||
72 | -b | --create-backup <file> |
||
73 | create .tar.gz of files specified in sysupgrade.conf |
||
74 | then exit. Does not flash an image. If file is '-', |
||
75 | i.e. stdout, verbosity is set to 0 (i.e. quiet). |
||
76 | -r | --restore-backup <file> |
||
77 | restore a .tar.gz created with sysupgrade -b |
||
78 | then exit. Does not flash an image. If file is '-', |
||
79 | the archive is read from stdin. |
||
80 | -l | --list-backup |
||
81 | list the files that would be backed up when calling |
||
82 | sysupgrade -b. Does not create a backup file. |
||
83 | |||
84 | EOF |
||
85 | exit 1 |
||
86 | } |
||
87 | |||
88 | [ -n "$IMAGE" -a -n "$NEED_IMAGE" ] && { |
||
89 | cat <<-EOF |
||
90 | -b|--create-backup and -r|--restore-backup do not perform a firmware upgrade. |
||
91 | Do not specify both -b|-r and a firmware image. |
||
92 | EOF |
||
93 | exit 1 |
||
94 | } |
||
95 | |||
96 | # prevent messages from clobbering the tarball when using stdout |
||
97 | [ "$CONF_BACKUP" = "-" ] && export VERBOSE=0 |
||
98 | |||
99 | |||
100 | list_conffiles() { |
||
101 | awk ' |
||
102 | BEGIN { conffiles = 0 } |
||
103 | /^Conffiles:/ { conffiles = 1; next } |
||
104 | !/^ / { conffiles = 0; next } |
||
105 | conffiles == 1 { print } |
||
106 | ' /usr/lib/opkg/status |
||
107 | } |
||
108 | |||
109 | list_changed_conffiles() { |
||
110 | # Cannot handle spaces in filenames - but opkg cannot either... |
||
111 | list_conffiles | while read file csum; do |
||
112 | [ -r "$file" ] || continue |
||
113 | |||
114 | echo "${csum} ${file}" | sha256sum -sc - || echo "$file" |
||
115 | done |
||
116 | } |
||
117 | |||
3 | office | 118 | add_uci_conffiles() { |
1 | office | 119 | local file="$1" |
120 | ( find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \ |
||
121 | /etc/sysupgrade.conf /lib/upgrade/keep.d/* 2>/dev/null) \ |
||
3 | office | 122 | -type f -o -type l 2>/dev/null; |
1 | office | 123 | list_changed_conffiles ) | sort -u > "$file" |
124 | return 0 |
||
125 | } |
||
126 | |||
127 | add_overlayfiles() { |
||
128 | local file="$1" |
||
3 | office | 129 | find /overlay/upper/etc/ -type f -o -type l | sed \ |
130 | -e 's,^/overlay\/upper/,/,' \ |
||
131 | -e '\,/META_[a-zA-Z0-9]*$,d' \ |
||
132 | -e '\,/functions.sh$,d' \ |
||
1 | office | 133 | -e '\,/[^/]*-opkg$,d' \ |
3 | office | 134 | > "$file" |
1 | office | 135 | return 0 |
136 | } |
||
137 | |||
138 | # hooks |
||
3 | office | 139 | sysupgrade_image_check="fwtool_check_image platform_check_image" |
1 | office | 140 | |
141 | if [ $SAVE_OVERLAY = 1 ]; then |
||
142 | [ ! -d /overlay/upper/etc ] && { |
||
3 | office | 143 | echo "Cannot find '/overlay/upper/etc', required for '-c'" |
1 | office | 144 | exit 1 |
145 | } |
||
146 | sysupgrade_init_conffiles="add_overlayfiles" |
||
147 | else |
||
3 | office | 148 | sysupgrade_init_conffiles="add_uci_conffiles" |
1 | office | 149 | fi |
150 | |||
151 | include /lib/upgrade |
||
152 | |||
153 | do_save_conffiles() { |
||
3 | office | 154 | local conf_tar="${1:-$CONF_TAR}" |
1 | office | 155 | |
156 | [ -z "$(rootfs_type)" ] && { |
||
3 | office | 157 | echo "Cannot save config while running from ramdisk." |
1 | office | 158 | ask_bool 0 "Abort" && exit |
159 | rm -f "$conf_tar" |
||
160 | return 0 |
||
161 | } |
||
162 | run_hooks "$CONFFILES" $sysupgrade_init_conffiles |
||
163 | ask_bool 0 "Edit config file list" && vi "$CONFFILES" |
||
164 | |||
165 | v "Saving config files..." |
||
166 | [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V="" |
||
167 | tar c${TAR_V}zf "$conf_tar" -T "$CONFFILES" 2>/dev/null |
||
168 | |||
169 | rm -f "$CONFFILES" |
||
170 | } |
||
171 | |||
172 | if [ $CONF_BACKUP_LIST -eq 1 ]; then |
||
173 | run_hooks "$CONFFILES" $sysupgrade_init_conffiles |
||
174 | cat "$CONFFILES" |
||
175 | rm -f "$CONFFILES" |
||
176 | exit 0 |
||
177 | fi |
||
178 | |||
179 | if [ -n "$CONF_BACKUP" ]; then |
||
180 | do_save_conffiles "$CONF_BACKUP" |
||
181 | exit $? |
||
182 | fi |
||
183 | |||
184 | if [ -n "$CONF_RESTORE" ]; then |
||
185 | if [ "$CONF_RESTORE" != "-" ] && [ ! -f "$CONF_RESTORE" ]; then |
||
3 | office | 186 | echo "Backup archive '$CONF_RESTORE' not found." |
1 | office | 187 | exit 1 |
188 | fi |
||
189 | |||
190 | [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V="" |
||
191 | tar -C / -x${TAR_V}zf "$CONF_RESTORE" |
||
192 | exit $? |
||
193 | fi |
||
194 | |||
195 | type platform_check_image >/dev/null 2>/dev/null || { |
||
3 | office | 196 | echo "Firmware upgrade is not implemented for this platform." |
1 | office | 197 | exit 1 |
198 | } |
||
199 | |||
200 | case "$IMAGE" in |
||
3 | office | 201 | http://*) |
1 | office | 202 | wget -O/tmp/sysupgrade.img "$IMAGE" |
203 | IMAGE=/tmp/sysupgrade.img |
||
204 | ;; |
||
205 | esac |
||
206 | |||
207 | IMAGE="$(readlink -f "$IMAGE")" |
||
208 | |||
209 | case "$IMAGE" in |
||
210 | '') |
||
3 | office | 211 | echo "Image file not found." |
1 | office | 212 | exit 1 |
213 | ;; |
||
214 | /tmp/*) ;; |
||
215 | *) |
||
216 | v "Image not in /tmp, copying..." |
||
217 | cp -f "$IMAGE" /tmp/sysupgrade.img |
||
218 | IMAGE=/tmp/sysupgrade.img |
||
219 | ;; |
||
220 | esac |
||
221 | |||
222 | export ARGV="$IMAGE" |
||
223 | export ARGC=1 |
||
224 | |||
225 | for check in $sysupgrade_image_check; do |
||
226 | ( $check "$IMAGE" ) || { |
||
227 | if [ $FORCE -eq 1 ]; then |
||
3 | office | 228 | echo "Image check '$check' failed but --force given - will update anyway!" |
1 | office | 229 | break |
230 | else |
||
3 | office | 231 | echo "Image check '$check' failed." |
1 | office | 232 | exit 1 |
233 | fi |
||
234 | } |
||
235 | done |
||
236 | |||
237 | if [ -n "$CONF_IMAGE" ]; then |
||
238 | case "$(get_magic_word $CONF_IMAGE cat)" in |
||
239 | # .gz files |
||
240 | 1f8b) ;; |
||
241 | *) |
||
3 | office | 242 | echo "Invalid config file. Please use only .tar.gz files" |
1 | office | 243 | exit 1 |
244 | ;; |
||
245 | esac |
||
246 | get_image "$CONF_IMAGE" "cat" > "$CONF_TAR" |
||
247 | export SAVE_CONFIG=1 |
||
248 | elif ask_bool $SAVE_CONFIG "Keep config files over reflash"; then |
||
3 | office | 249 | [ $TEST -eq 1 ] || do_save_conffiles |
1 | office | 250 | export SAVE_CONFIG=1 |
251 | else |
||
252 | [ $TEST -eq 1 ] || rm -f "$CONF_TAR" |
||
253 | export SAVE_CONFIG=0 |
||
254 | fi |
||
255 | |||
256 | if [ $TEST -eq 1 ]; then |
||
257 | exit 0 |
||
258 | fi |
||
259 | |||
260 | if [ $SAVE_PARTITIONS -eq 0 ]; then |
||
261 | touch /tmp/sysupgrade.always.overwrite.bootdisk.partmap |
||
262 | else |
||
263 | rm -f /tmp/sysupgrade.always.overwrite.bootdisk.partmap |
||
264 | fi |
||
265 | |||
266 | install_bin /sbin/upgraded |
||
267 | v "Commencing upgrade. Closing all shell sessions." |
||
268 | |||
269 | COMMAND='. /lib/functions.sh; include /lib/upgrade; do_upgrade_stage2' |
||
270 | |||
271 | if [ -n "$FAILSAFE" ]; then |
||
272 | printf '%s\x00%s\x00%s' "$RAM_ROOT" "$IMAGE" "$COMMAND" >/tmp/sysupgrade |
||
273 | lock -u /tmp/.failsafe |
||
274 | else |
||
275 | ubus call system sysupgrade "{ |
||
276 | \"prefix\": $(json_string "$RAM_ROOT"), |
||
277 | \"path\": $(json_string "$IMAGE"), |
||
278 | \"command\": $(json_string "$COMMAND") |
||
279 | }" |
||
280 | fi |