OpenWrt – Diff between revs 2 and 3
?pathlinks?
Rev 2 | Rev 3 | |||
---|---|---|---|---|
Line 2... | Line 2... | |||
2 | |
2 | |
|
3 | . /lib/functions.sh |
3 | . /lib/functions.sh |
|
Line 4... | Line 4... | |||
4 | . /lib/functions/system.sh |
4 | . /lib/functions/system.sh |
|
5 | |
- | ||
6 | # initialize defaults |
5 | |
|
7 | export MTD_ARGS="" |
6 | # initialize defaults |
|
8 | export MTD_CONFIG_ARGS="" |
7 | export MTD_CONFIG_ARGS="" |
|
9 | export INTERACTIVE=0 |
8 | export INTERACTIVE=0 |
|
10 | export VERBOSE=1 |
9 | export VERBOSE=1 |
|
11 | export SAVE_CONFIG=1 |
- | ||
12 | export SAVE_OVERLAY=0 |
10 | export SAVE_CONFIG=1 |
|
13 | export SAVE_OVERLAY_PATH= |
- | ||
14 | export SAVE_PARTITIONS=1 |
- | ||
15 | export SAVE_INSTALLED_PKGS=0 |
11 | export SAVE_OVERLAY=0 |
|
16 | export SKIP_UNCHANGED=0 |
12 | export SAVE_PARTITIONS=1 |
|
17 | export CONF_IMAGE= |
13 | export CONF_IMAGE= |
|
18 | export CONF_BACKUP_LIST=0 |
14 | export CONF_BACKUP_LIST=0 |
|
19 | export CONF_BACKUP= |
15 | export CONF_BACKUP= |
|
20 | export CONF_RESTORE= |
16 | export CONF_RESTORE= |
|
21 | export NEED_IMAGE= |
17 | export NEED_IMAGE= |
|
22 | export HELP=0 |
18 | export HELP=0 |
|
23 | export FORCE=0 |
- | ||
Line 24... | Line 19... | |||
24 | export TEST=0 |
19 | export FORCE=0 |
|
25 | export UMOUNT_ETCBACKUP_DIR=0 |
20 | export TEST=0 |
|
26 | |
21 | |
|
27 | # parse options |
22 | # parse options |
|
28 | while [ -n "$1" ]; do |
23 | while [ -n "$1" ]; do |
|
29 | case "$1" in |
24 | case "$1" in |
|
30 | -i) export INTERACTIVE=1;; |
25 | -i) export INTERACTIVE=1;; |
|
31 | -v) export VERBOSE="$(($VERBOSE + 1))";; |
- | ||
32 | -q) export VERBOSE="$(($VERBOSE - 1))";; |
26 | -v) export VERBOSE="$(($VERBOSE + 1))";; |
|
33 | -n) export SAVE_CONFIG=0;; |
27 | -q) export VERBOSE="$(($VERBOSE - 1))";; |
|
34 | -c) export SAVE_OVERLAY=1 SAVE_OVERLAY_PATH=/etc;; |
- | ||
35 | -o) export SAVE_OVERLAY=1 SAVE_OVERLAY_PATH=/;; |
- | ||
36 | -p) export SAVE_PARTITIONS=0;; |
28 | -n) export SAVE_CONFIG=0;; |
|
37 | -k) export SAVE_INSTALLED_PKGS=1;; |
29 | -c) export SAVE_OVERLAY=1;; |
|
38 | -u) export SKIP_UNCHANGED=1;; |
30 | -p) export SAVE_PARTITIONS=0;; |
|
39 | -b|--create-backup) export CONF_BACKUP="$2" NEED_IMAGE=1; shift;; |
31 | -b|--create-backup) export CONF_BACKUP="$2" NEED_IMAGE=1; shift;; |
|
40 | -r|--restore-backup) export CONF_RESTORE="$2" NEED_IMAGE=1; shift;; |
32 | -r|--restore-backup) export CONF_RESTORE="$2" NEED_IMAGE=1; shift;; |
|
41 | -l|--list-backup) export CONF_BACKUP_LIST=1;; |
33 | -l|--list-backup) export CONF_BACKUP_LIST=1; break;; |
|
42 | -f) export CONF_IMAGE="$2"; shift;; |
34 | -f) export CONF_IMAGE="$2"; shift;; |
|
43 | -F|--force) export FORCE=1;; |
35 | -F|--force) export FORCE=1;; |
|
44 | -T|--test) export TEST=1;; |
36 | -T|--test) export TEST=1;; |
|
45 | -h|--help) export HELP=1; break;; |
37 | -h|--help) export HELP=1; break;; |
|
46 | -*) |
38 | -*) |
|
47 | echo "Invalid option: $1" >&2 |
39 | echo "Invalid option: $1" |
|
48 | exit 1 |
40 | exit 1 |
|
49 | ;; |
41 | ;; |
|
50 | *) break;; |
42 | *) break;; |
|
Line 51... | Line 43... | |||
51 | esac |
43 | esac |
|
52 | shift; |
44 | shift; |
|
53 | done |
- | ||
54 | |
- | ||
Line 55... | Line 45... | |||
55 | export CONFFILES=/tmp/sysupgrade.conffiles |
45 | done |
|
Line 56... | Line 46... | |||
56 | export CONF_TAR=/tmp/sysupgrade.tgz |
46 | |
|
57 | export ETCBACKUP_DIR=/etc/backup |
47 | export CONFFILES=/tmp/sysupgrade.conffiles |
|
58 | export INSTALLED_PACKAGES=${ETCBACKUP_DIR}/installed_packages.txt |
48 | export CONF_TAR=/tmp/sysupgrade.tgz |
|
59 | |
49 | |
|
Line 60... | Line 50... | |||
60 | IMAGE="$1" |
50 | IMAGE="$1" |
|
61 | |
51 | |
|
62 | [ -z "$IMAGE" -a -z "$NEED_IMAGE" -a $CONF_BACKUP_LIST -eq 0 -o $HELP -gt 0 ] && { |
52 | [ -z "$IMAGE" -a -z "$NEED_IMAGE" -o $HELP -gt 0 ] && { |
|
63 | cat <<EOF |
53 | cat <<EOF |
|
64 | Usage: $0 [<upgrade-option>...] <image file or URL> |
- | ||
65 | $0 [-q] [-i] [-c] [-u] [-o] [-k] <backup-command> <file> |
- | ||
66 | |
- | ||
67 | upgrade-option: |
54 | Usage: $0 [<upgrade-option>...] <image file or URL> |
|
68 | -f <config> restore configuration from .tar.gz (file or url) |
55 | $0 [-q] [-i] <backup-command> <file> |
|
69 | -i interactive mode |
- | ||
70 | -c attempt to preserve all changed files in /etc/ |
- | ||
71 | -o attempt to preserve all changed files in /, except those |
56 | |
|
72 | from packages but including changed confs. |
57 | upgrade-option: |
|
73 | -u skip from backup files that are equal to those in /rom |
58 | -f <config> restore configuration from .tar.gz (file or url) |
|
74 | -n do not save configuration over reflash |
59 | -i interactive mode |
|
75 | -p do not attempt to restore the partition table after flash. |
60 | -c attempt to preserve all changed files in /etc/ |
|
Line 128... | Line 113... | |||
128 | |
113 | |
|
129 | echo "${csum} ${file}" | sha256sum -sc - || echo "$file" |
114 | echo "${csum} ${file}" | sha256sum -sc - || echo "$file" |
|
130 | done |
115 | done |
|
Line 131... | Line 116... | |||
131 | } |
116 | } |
|
132 | |
117 | |
|
133 | add_conffiles() { |
118 | add_uci_conffiles() { |
|
134 | local file="$1" |
119 | local file="$1" |
|
135 | ( find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \ |
120 | ( find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \ |
|
136 | /etc/sysupgrade.conf /lib/upgrade/keep.d/* 2>/dev/null) \ |
121 | /etc/sysupgrade.conf /lib/upgrade/keep.d/* 2>/dev/null) \ |
|
137 | \( -type f -o -type l \) $find_filter 2>/dev/null; |
122 | -type f -o -type l 2>/dev/null; |
|
138 | list_changed_conffiles ) | sort -u > "$file" |
123 | list_changed_conffiles ) | sort -u > "$file" |
|
Line 139... | Line 124... | |||
139 | return 0 |
124 | return 0 |
|
140 | } |
125 | } |
|
141 | |
- | ||
142 | add_overlayfiles() { |
- | ||
143 | local file="$1" |
- | ||
144 | |
- | ||
145 | local packagesfiles=$1.packagesfiles |
- | ||
146 | touch "$packagesfiles" |
- | ||
147 | |
- | ||
148 | if [ "$SAVE_OVERLAY_PATH" = / ]; then |
- | ||
149 | local conffiles=$1.conffiles |
- | ||
150 | local keepfiles=$1.keepfiles |
- | ||
151 | |
- | ||
152 | list_conffiles | cut -f2 -d ' ' | sort -u > "$conffiles" |
- | ||
153 | |
- | ||
154 | # backup files from /etc/sysupgrade.conf and /lib/upgrade/keep.d, but |
- | ||
155 | # ignore those aready controlled by opkg conffiles |
- | ||
156 | find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \ |
- | ||
157 | /etc/sysupgrade.conf /lib/upgrade/keep.d/* 2>/dev/null) \ |
- | ||
158 | \( -type f -o -type l \) 2>/dev/null | sort -u | |
- | ||
159 | grep -h -v -x -F -f $conffiles > "$keepfiles" |
- | ||
160 | |
- | ||
161 | # backup conffiles, but only those changed if '-u' |
- | ||
162 | [ $SKIP_UNCHANGED = 1 ] && |
- | ||
163 | list_changed_conffiles | sort -u > "$conffiles" |
- | ||
164 | |
- | ||
165 | # do not backup files from packages, except those listed |
- | ||
166 | # in conffiles and keep.d |
126 | |
|
167 | { |
- | ||
168 | find /usr/lib/opkg/info -type f -name "*.list" -exec cat {} \; |
- | ||
169 | find /usr/lib/opkg/info -type f -name "*.control" -exec sed \ |
- | ||
170 | -ne '/^Alternatives/{s/^Alternatives: //;s/, /\n/g;p}' {} \; | |
- | ||
171 | cut -f2 -d: |
127 | add_overlayfiles() { |
|
172 | } | grep -v -x -F -f $conffiles | |
- | ||
173 | grep -v -x -F -f $keepfiles | sort -u > "$packagesfiles" |
- | ||
174 | rm -f "$keepfiles" "$conffiles" |
- | ||
175 | fi |
- | ||
176 | |
- | ||
177 | # busybox grep bug when file is empty |
- | ||
178 | [ -s "$packagesfiles" ] || echo > $packagesfiles |
128 | local file="$1" |
|
179 | |
129 | find /overlay/upper/etc/ -type f -o -type l | sed \ |
|
180 | ( cd /overlay/upper/; find .$SAVE_OVERLAY_PATH \( -type f -o -type l \) $find_filter | sed \ |
130 | -e 's,^/overlay\/upper/,/,' \ |
|
181 | -e 's,^\.,,' \ |
- | ||
182 | -e '\,^/etc/board.json$,d' \ |
- | ||
183 | -e '\,/[^/]*-opkg$,d' \ |
- | ||
184 | -e '\,^/etc/urandom.seed$,d' \ |
- | ||
185 | -e "\,^$INSTALLED_PACKAGES$,d" \ |
- | ||
186 | -e '\,^/usr/lib/opkg/.*,d' \ |
131 | -e '\,/META_[a-zA-Z0-9]*$,d' \ |
|
187 | ) | grep -v -x -F -f $packagesfiles > "$file" |
- | ||
188 | |
132 | -e '\,/functions.sh$,d' \ |
|
189 | rm -f "$packagesfiles" |
133 | -e '\,/[^/]*-opkg$,d' \ |
|
Line 190... | Line 134... | |||
190 | |
134 | > "$file" |
|
191 | return 0 |
135 | return 0 |
|
Line 192... | Line 136... | |||
192 | } |
136 | } |
|
193 | |
137 | |
|
194 | # hooks |
138 | # hooks |
|
195 | sysupgrade_image_check="fwtool_check_signature fwtool_check_image platform_check_image" |
139 | sysupgrade_image_check="fwtool_check_image platform_check_image" |
|
196 | |
140 | |
|
197 | if [ $SAVE_OVERLAY = 1 ]; then |
141 | if [ $SAVE_OVERLAY = 1 ]; then |
|
198 | [ ! -d /overlay/upper/etc ] && { |
142 | [ ! -d /overlay/upper/etc ] && { |
|
199 | echo "Cannot find '/overlay/upper/etc', required for '-c'" >&2 |
143 | echo "Cannot find '/overlay/upper/etc', required for '-c'" |
|
200 | exit 1 |
- | ||
201 | } |
- | ||
202 | sysupgrade_init_conffiles="add_overlayfiles" |
- | ||
203 | else |
- | ||
204 | sysupgrade_init_conffiles="add_conffiles" |
- | ||
205 | fi |
- | ||
206 | |
- | ||
207 | find_filter="" |
- | ||
208 | if [ $SKIP_UNCHANGED = 1 ]; then |
- | ||
209 | [ ! -d /rom/ ] && { |
144 | exit 1 |
|
Line 210... | Line 145... | |||
210 | echo "'/rom/' is required by '-u'" |
145 | } |
|
Line 211... | Line 146... | |||
211 | exit 1 |
146 | sysupgrade_init_conffiles="add_overlayfiles" |
|
212 | } |
147 | else |
|
Line 213... | Line 148... | |||
213 | find_filter='( ( -exec test -e /rom/{} ; -exec cmp -s /{} /rom/{} ; ) -o -print )' |
148 | sysupgrade_init_conffiles="add_uci_conffiles" |
|
214 | fi |
149 | fi |
|
215 | |
150 | |
|
216 | include /lib/upgrade |
151 | include /lib/upgrade |
|
217 | |
152 | |
|
218 | do_save_conffiles() { |
153 | do_save_conffiles() { |
|
219 | local conf_tar="$1" |
154 | local conf_tar="${1:-$CONF_TAR}" |
|
220 | |
155 | |
|
Line 221... | Line -... | |||
221 | [ -z "$(rootfs_type)" ] && { |
- | ||
222 | echo "Cannot save config while running from ramdisk." >&2 |
- | ||
223 | ask_bool 0 "Abort" && exit |
- | ||
224 | rm -f "$conf_tar" |
- | ||
225 | return 0 |
- | ||
226 | } |
- | ||
227 | run_hooks "$CONFFILES" $sysupgrade_init_conffiles |
- | ||
228 | ask_bool 0 "Edit config file list" && vi "$CONFFILES" |
- | ||
229 | |
- | ||
230 | if [ "$SAVE_INSTALLED_PKGS" -eq 1 ]; then |
- | ||
231 | echo "${INSTALLED_PACKAGES}" >> "$CONFFILES" |
- | ||
232 | mkdir -p "$ETCBACKUP_DIR" |
- | ||
233 | # Avoid touching filesystem on each backup |
- | ||
234 | RAMFS="$(mktemp -d -t sysupgrade.XXXXXX)" |
- | ||
235 | mkdir -p "$RAMFS/upper" "$RAMFS/work" |
- | ||
236 | mount -t overlay overlay -o lowerdir=$ETCBACKUP_DIR,upperdir=$RAMFS/upper,workdir=$RAMFS/work $ETCBACKUP_DIR && |
- | ||
237 | UMOUNT_ETCBACKUP_DIR=1 || { |
- | ||
238 | echo "Cannot mount '$ETCBACKUP_DIR' as tmpfs to avoid touching disk while saving the list of installed packages." >&2 |
- | ||
239 | ask_bool 0 "Abort" && exit |
- | ||
240 | } |
- | ||
241 | |
- | ||
242 | # Format: pkg-name<TAB>{rom,overlay,unkown} |
156 | [ -z "$(rootfs_type)" ] && { |
|
243 | # rom is used for pkgs in /rom, even if updated later |
157 | echo "Cannot save config while running from ramdisk." |
|
244 | find /usr/lib/opkg/info -name "*.control" \( \ |
158 | ask_bool 0 "Abort" && exit |
|
245 | \( -exec test -f /rom/{} \; -exec echo {} rom \; \) -o \ |
- | ||
246 | \( -exec test -f /overlay/upper/{} \; -exec echo {} overlay \; \) -o \ |
- | ||
247 | \( -exec echo {} unknown \; \) \ |
- | ||
248 | \) | sed -e 's,.*/,,;s/\.control /\t/' > ${INSTALLED_PACKAGES} |
- | ||
249 | fi |
- | ||
Line 250... | Line -... | |||
250 | |
- | ||
251 | v "Saving config files..." |
- | ||
252 | [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V="" |
- | ||
253 | tar c${TAR_V}zf "$conf_tar" -T "$CONFFILES" 2>/dev/null |
- | ||
254 | if [ "$?" -ne 0 ]; then |
159 | rm -f "$conf_tar" |
|
255 | echo "Failed to create the configuration backup." |
160 | return 0 |
|
Line 256... | Line 161... | |||
256 | rm -f "$conf_tar" |
161 | } |
|
257 | exit 1 |
162 | run_hooks "$CONFFILES" $sysupgrade_init_conffiles |
|
258 | fi |
- | ||
259 | |
163 | ask_bool 0 "Edit config file list" && vi "$CONFFILES" |
|
260 | [ "$UMOUNT_ETCBACKUP_DIR" -eq 1 ] && { |
164 | |
|
261 | umount "$ETCBACKUP_DIR" |
165 | v "Saving config files..." |
|
262 | rm -rf "$RAMFS" |
166 | [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V="" |
|
Line 277... | Line 181... | |||
277 | exit $? |
181 | exit $? |
|
278 | fi |
182 | fi |
|
Line 279... | Line 183... | |||
279 | |
183 | |
|
280 | if [ -n "$CONF_RESTORE" ]; then |
184 | if [ -n "$CONF_RESTORE" ]; then |
|
281 | if [ "$CONF_RESTORE" != "-" ] && [ ! -f "$CONF_RESTORE" ]; then |
185 | if [ "$CONF_RESTORE" != "-" ] && [ ! -f "$CONF_RESTORE" ]; then |
|
282 | echo "Backup archive '$CONF_RESTORE' not found." >&2 |
186 | echo "Backup archive '$CONF_RESTORE' not found." |
|
283 | exit 1 |
187 | exit 1 |
|
Line 284... | Line 188... | |||
284 | fi |
188 | fi |
|
285 | |
189 | |
|
286 | [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V="" |
190 | [ "$VERBOSE" -gt 1 ] && TAR_V="v" || TAR_V="" |
|
287 | tar -C / -x${TAR_V}zf "$CONF_RESTORE" |
191 | tar -C / -x${TAR_V}zf "$CONF_RESTORE" |
|
Line 288... | Line 192... | |||
288 | exit $? |
192 | exit $? |
|
289 | fi |
193 | fi |
|
290 | |
194 | |
|
291 | type platform_check_image >/dev/null 2>/dev/null || { |
195 | type platform_check_image >/dev/null 2>/dev/null || { |
|
Line 292... | Line 196... | |||
292 | echo "Firmware upgrade is not implemented for this platform." >&2 |
196 | echo "Firmware upgrade is not implemented for this platform." |
|
293 | exit 1 |
- | ||
294 | } |
197 | exit 1 |
|
295 | |
198 | } |
|
296 | case "$IMAGE" in |
199 | |
|
297 | http://*|\ |
200 | case "$IMAGE" in |
|
298 | https://*) |
201 | http://*) |
|
Line 299... | Line 202... | |||
299 | wget -O/tmp/sysupgrade.img "$IMAGE" |
202 | wget -O/tmp/sysupgrade.img "$IMAGE" |
|
Line 300... | Line 203... | |||
300 | IMAGE=/tmp/sysupgrade.img |
203 | IMAGE=/tmp/sysupgrade.img |
|
301 | ;; |
204 | ;; |
|
302 | esac |
205 | esac |
|
303 | |
206 | |
|
304 | IMAGE="$(readlink -f "$IMAGE")" |
207 | IMAGE="$(readlink -f "$IMAGE")" |
|
305 | |
208 | |
|
306 | case "$IMAGE" in |
209 | case "$IMAGE" in |
|
307 | '') |
210 | '') |
|
Line 320... | Line 223... | |||
320 | export ARGC=1 |
223 | export ARGC=1 |
|
Line 321... | Line 224... | |||
321 | |
224 | |
|
322 | for check in $sysupgrade_image_check; do |
225 | for check in $sysupgrade_image_check; do |
|
323 | ( $check "$IMAGE" ) || { |
226 | ( $check "$IMAGE" ) || { |
|
324 | if [ $FORCE -eq 1 ]; then |
227 | if [ $FORCE -eq 1 ]; then |
|
325 | echo "Image check '$check' failed but --force given - will update anyway!" >&2 |
228 | echo "Image check '$check' failed but --force given - will update anyway!" |
|
326 | break |
229 | break |
|
327 | else |
230 | else |
|
328 | echo "Image check '$check' failed." >&2 |
231 | echo "Image check '$check' failed." |
|
329 | exit 1 |
232 | exit 1 |
|
330 | fi |
233 | fi |
|
331 | } |
234 | } |
|
Line 332... | Line 235... | |||
332 | done |
235 | done |
|
333 | |
236 | |
|
334 | if [ -n "$CONF_IMAGE" ]; then |
237 | if [ -n "$CONF_IMAGE" ]; then |
|
335 | case "$(get_magic_word $CONF_IMAGE cat)" in |
238 | case "$(get_magic_word $CONF_IMAGE cat)" in |
|
336 | # .gz files |
239 | # .gz files |
|
337 | 1f8b) ;; |
240 | 1f8b) ;; |
|
338 | *) |
241 | *) |
|
339 | echo "Invalid config file. Please use only .tar.gz files" >&2 |
242 | echo "Invalid config file. Please use only .tar.gz files" |
|
340 | exit 1 |
243 | exit 1 |
|
341 | ;; |
244 | ;; |
|
342 | esac |
245 | esac |
|
343 | get_image "$CONF_IMAGE" "cat" > "$CONF_TAR" |
246 | get_image "$CONF_IMAGE" "cat" > "$CONF_TAR" |
|
344 | export SAVE_CONFIG=1 |
247 | export SAVE_CONFIG=1 |
|
345 | elif ask_bool $SAVE_CONFIG "Keep config files over reflash"; then |
248 | elif ask_bool $SAVE_CONFIG "Keep config files over reflash"; then |
|
346 | [ $TEST -eq 1 ] || do_save_conffiles "$CONF_TAR" |
249 | [ $TEST -eq 1 ] || do_save_conffiles |
|
347 | export SAVE_CONFIG=1 |
250 | export SAVE_CONFIG=1 |
|
348 | else |
251 | else |
|
349 | [ $TEST -eq 1 ] || rm -f "$CONF_TAR" |
252 | [ $TEST -eq 1 ] || rm -f "$CONF_TAR" |