4 .
/lib
/functions
/system.sh
7 export MTD_CONFIG_ARGS
=""
12 export SAVE_OVERLAY_PATH
=
13 export SAVE_PARTITIONS
=1
14 export SKIP_UNCHANGED
=0
16 export CONF_BACKUP_LIST
=0
27 -i) export INTERACTIVE
=1;;
28 -v) export VERBOSE
="$(($VERBOSE + 1))";;
29 -q) export VERBOSE
="$(($VERBOSE - 1))";;
30 -n) export SAVE_CONFIG
=0;;
31 -c) export SAVE_OVERLAY
=1 SAVE_OVERLAY_PATH
=/etc
;;
32 -o) export SAVE_OVERLAY
=1 SAVE_OVERLAY_PATH
=/;;
33 -p) export SAVE_PARTITIONS
=0;;
34 -u) export SKIP_UNCHANGED
=1;;
35 -b|
--create-backup) export CONF_BACKUP
="$2" NEED_IMAGE
=1; shift;;
36 -r|
--restore-backup) export CONF_RESTORE
="$2" NEED_IMAGE
=1; shift;;
37 -l|
--list-backup) export CONF_BACKUP_LIST
=1;;
38 -f) export CONF_IMAGE
="$2"; shift;;
39 -F|
--force) export FORCE
=1;;
40 -T|
--test) export TEST
=1;;
41 -h|
--help) export HELP
=1; break;;
43 echo "Invalid option: $1" >&2
51 export CONFFILES
=/tmp
/sysupgrade.conffiles
52 export CONF_TAR
=/tmp
/sysupgrade.tgz
56 [ -z "$IMAGE" -a -z "$NEED_IMAGE" -a $CONF_BACKUP_LIST -eq 0 -o $HELP -gt 0 ] && {
58 Usage: $0 [<upgrade-option>...] <image file or URL>
59 $0 [-q] [-i] [-c] [-u] [-o] <backup-command> <file>
62 -f <config> restore configuration from .tar.gz (file or url)
64 -c attempt to preserve all changed files in /etc/
65 -o attempt to preserve all changed files in /, except those
66 from packages but including changed confs.
67 -u skip from backup files that are equal to those in /rom
68 -n do not save configuration over reflash
69 -p do not attempt to restore the partition table after flash.
71 Verify image and config .tar.gz but do not actually flash.
73 Flash image even if image checks fail, this is dangerous!
76 -h | --help display this help
79 -b | --create-backup <file>
80 create .tar.gz of files specified in sysupgrade.conf
81 then exit. Does not flash an image. If file is '-',
82 i.e. stdout, verbosity is set to 0 (i.e. quiet).
83 -r | --restore-backup <file>
84 restore a .tar.gz created with sysupgrade -b
85 then exit. Does not flash an image. If file is '-',
86 the archive is read from stdin.
88 list the files that would be backed up when calling
89 sysupgrade -b. Does not create a backup file.
95 [ -n "$IMAGE" -a -n "$NEED_IMAGE" ] && {
97 -b|--create-backup and -r|--restore-backup do not perform a firmware upgrade.
98 Do not specify both -b|-r and a firmware image.
103 # prevent messages from clobbering the tarball when using stdout
104 [ "$CONF_BACKUP" = "-" ] && export VERBOSE
=0
109 BEGIN { conffiles = 0 }
110 /^Conffiles:/ { conffiles = 1; next }
111 !/^ / { conffiles = 0; next }
112 conffiles == 1 { print }
113 ' /usr
/lib
/opkg
/status
116 list_changed_conffiles
() {
117 # Cannot handle spaces in filenames - but opkg cannot either...
118 list_conffiles |
while read file csum
; do
119 [ -r "$file" ] ||
continue
121 echo "${csum} ${file}" | sha256sum
-sc - ||
echo "$file"
127 ( find $
(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \
128 /etc
/sysupgrade.conf
/lib
/upgrade
/keep.d
/* 2>/dev
/null
) \
129 \
( -type f
-o -type l \
) $find_filter 2>/dev
/null
;
130 list_changed_conffiles
) |
sort -u > "$file"
137 local packagesfiles
=$1.packagesfiles
138 touch "$packagesfiles"
140 if [ "$SAVE_OVERLAY_PATH" = / ]; then
141 local conffiles
=$1.conffiles
142 local keepfiles
=$1.keepfiles
144 list_conffiles | cut
-f2 -d ' ' |
sort -u > "$conffiles"
146 # backup files from /etc/sysupgrade.conf and /lib/upgrade/keep.d, but
147 # ignore those aready controlled by opkg conffiles
148 find $
(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \
149 /etc
/sysupgrade.conf
/lib
/upgrade
/keep.d
/* 2>/dev
/null
) \
150 \
( -type f
-o -type l \
) 2>/dev
/null |
sort -u |
151 grep -h -v -x -F -f $conffiles > "$keepfiles"
153 # backup conffiles, but only those changed if '-u'
154 [ $SKIP_UNCHANGED = 1 ] &&
155 list_changed_conffiles |
sort -u > "$conffiles"
157 # do not backup files from packages, except those listed
158 # in conffiles and keep.d
160 find /usr
/lib
/opkg
/info
-type f
-name "*.list" -exec cat {} \
;
161 find /usr
/lib
/opkg
/info
-type f
-name "*.control" -exec sed \
162 -ne '/^Alternatives/{s/^Alternatives: //;s/, /\n/g;p}' {} \
; |
164 } |
grep -v -x -F -f $conffiles |
165 grep -v -x -F -f $keepfiles |
sort -u > "$packagesfiles"
166 rm -f "$keepfiles" "$conffiles"
169 # busybox grep bug when file is empty
170 [ -s "$packagesfiles" ] ||
echo > $packagesfiles
172 ( cd /overlay
/upper
/; find .
$SAVE_OVERLAY_PATH \
( -type f
-o -type l \
) $find_filter |
sed \
174 -e '\,^/etc/board.json$,d' \
175 -e '\,/[^/]*-opkg$,d' \
176 -e '\,^/etc/urandom.seed$,d' \
177 -e '\,^/usr/lib/opkg/.*,d' \
178 ) |
grep -v -x -F -f $packagesfiles > "$file"
180 rm -f "$packagesfiles"
186 sysupgrade_image_check
="fwtool_check_signature fwtool_check_image platform_check_image"
188 if [ $SAVE_OVERLAY = 1 ]; then
189 [ ! -d /overlay
/upper
/etc
] && {
190 echo "Cannot find '/overlay/upper/etc', required for '-c'" >&2
193 sysupgrade_init_conffiles
="add_overlayfiles"
195 sysupgrade_init_conffiles
="add_conffiles"
199 if [ $SKIP_UNCHANGED = 1 ]; then
201 echo "'/rom/' is required by '-u'"
204 find_filter
='( ( -exec test -e /rom/{} ; -exec cmp -s /{} /rom/{} ; ) -o -print )'
209 do_save_conffiles
() {
212 [ -z "$(rootfs_type)" ] && {
213 echo "Cannot save config while running from ramdisk." >&2
214 ask_bool
0 "Abort" && exit
218 run_hooks
"$CONFFILES" $sysupgrade_init_conffiles
219 ask_bool
0 "Edit config file list" && vi
"$CONFFILES"
221 v
"Saving config files..."
222 [ "$VERBOSE" -gt 1 ] && TAR_V
="v" || TAR_V
=""
223 tar c
${TAR_V}zf
"$conf_tar" -T "$CONFFILES" 2>/dev
/null
224 if [ "$?" -ne 0 ]; then
225 echo "Failed to create the configuration backup."
233 if [ $CONF_BACKUP_LIST -eq 1 ]; then
234 run_hooks
"$CONFFILES" $sysupgrade_init_conffiles
240 if [ -n "$CONF_BACKUP" ]; then
241 do_save_conffiles
"$CONF_BACKUP"
245 if [ -n "$CONF_RESTORE" ]; then
246 if [ "$CONF_RESTORE" != "-" ] && [ ! -f "$CONF_RESTORE" ]; then
247 echo "Backup archive '$CONF_RESTORE' not found." >&2
251 [ "$VERBOSE" -gt 1 ] && TAR_V
="v" || TAR_V
=""
252 tar -C / -x${TAR_V}zf
"$CONF_RESTORE"
256 type platform_check_image
>/dev
/null
2>/dev
/null ||
{
257 echo "Firmware upgrade is not implemented for this platform." >&2
264 wget
-O/tmp
/sysupgrade.img
"$IMAGE"
265 IMAGE
=/tmp
/sysupgrade.img
269 IMAGE
="$(readlink -f "$IMAGE")"
273 echo "Image file not found." >&2
278 v
"Image not in /tmp, copying..."
279 cp -f "$IMAGE" /tmp
/sysupgrade.img
280 IMAGE
=/tmp
/sysupgrade.img
287 for check
in $sysupgrade_image_check; do
288 ( $check "$IMAGE" ) ||
{
289 if [ $FORCE -eq 1 ]; then
290 echo "Image check '$check' failed but --force given - will update anyway!" >&2
293 echo "Image check '$check' failed." >&2
299 if [ -n "$CONF_IMAGE" ]; then
300 case "$(get_magic_word $CONF_IMAGE cat)" in
304 echo "Invalid config file. Please use only .tar.gz files" >&2
308 get_image
"$CONF_IMAGE" "cat" > "$CONF_TAR"
310 elif ask_bool
$SAVE_CONFIG "Keep config files over reflash"; then
311 [ $TEST -eq 1 ] || do_save_conffiles
"$CONF_TAR"
314 [ $TEST -eq 1 ] ||
rm -f "$CONF_TAR"
318 if [ $TEST -eq 1 ]; then
322 if [ $SAVE_PARTITIONS -eq 0 ]; then
323 touch /tmp
/sysupgrade.always.overwrite.bootdisk.partmap
325 rm -f /tmp
/sysupgrade.always.overwrite.bootdisk.partmap
328 install_bin
/sbin
/upgraded
329 v
"Commencing upgrade. Closing all shell sessions."
331 COMMAND
='. /lib/functions.sh; include /lib/upgrade; do_upgrade_stage2'
333 if [ -n "$FAILSAFE" ]; then
334 printf '%s\x00%s\x00%s' "$RAM_ROOT" "$IMAGE" "$COMMAND" >/tmp
/sysupgrade
335 lock
-u /tmp
/.failsafe
337 ubus call system sysupgrade
"{
338 \"prefix\": $(json_string "$RAM_ROOT"),
339 \"path\": $(json_string "$IMAGE"),
340 \"command\": $(json_string "$COMMAND")