4 .
/lib
/functions
/system.sh
7 export MTD_CONFIG_ARGS
=""
12 export SAVE_PARTITIONS
=1
13 export SKIP_UNCHANGED
=0
15 export CONF_BACKUP_LIST
=0
26 -i) export INTERACTIVE
=1;;
27 -v) export VERBOSE
="$(($VERBOSE + 1))";;
28 -q) export VERBOSE
="$(($VERBOSE - 1))";;
29 -n) export SAVE_CONFIG
=0;;
30 -c) export SAVE_OVERLAY
=1;;
31 -p) export SAVE_PARTITIONS
=0;;
32 -u) export SKIP_UNCHANGED
=1;;
33 -b|
--create-backup) export CONF_BACKUP
="$2" NEED_IMAGE
=1; shift;;
34 -r|
--restore-backup) export CONF_RESTORE
="$2" NEED_IMAGE
=1; shift;;
35 -l|
--list-backup) export CONF_BACKUP_LIST
=1;;
36 -f) export CONF_IMAGE
="$2"; shift;;
37 -F|
--force) export FORCE
=1;;
38 -T|
--test) export TEST
=1;;
39 -h|
--help) export HELP
=1; break;;
41 echo "Invalid option: $1" >&2
49 export CONFFILES
=/tmp
/sysupgrade.conffiles
50 export CONF_TAR
=/tmp
/sysupgrade.tgz
54 [ -z "$IMAGE" -a -z "$NEED_IMAGE" -a $CONF_BACKUP_LIST -eq 0 -o $HELP -gt 0 ] && {
56 Usage: $0 [<upgrade-option>...] <image file or URL>
57 $0 [-q] [-i] [-c] [-u] <backup-command> <file>
60 -f <config> restore configuration from .tar.gz (file or url)
62 -c attempt to preserve all changed files in /etc/
63 -u skip from backup files that are equal to those in /rom
64 -n do not save configuration over reflash
65 -p do not attempt to restore the partition table after flash.
67 Verify image and config .tar.gz but do not actually flash.
69 Flash image even if image checks fail, this is dangerous!
72 -h | --help display this help
75 -b | --create-backup <file>
76 create .tar.gz of files specified in sysupgrade.conf
77 then exit. Does not flash an image. If file is '-',
78 i.e. stdout, verbosity is set to 0 (i.e. quiet).
79 -r | --restore-backup <file>
80 restore a .tar.gz created with sysupgrade -b
81 then exit. Does not flash an image. If file is '-',
82 the archive is read from stdin.
84 list the files that would be backed up when calling
85 sysupgrade -b. Does not create a backup file.
91 [ -n "$IMAGE" -a -n "$NEED_IMAGE" ] && {
93 -b|--create-backup and -r|--restore-backup do not perform a firmware upgrade.
94 Do not specify both -b|-r and a firmware image.
99 # prevent messages from clobbering the tarball when using stdout
100 [ "$CONF_BACKUP" = "-" ] && export VERBOSE
=0
105 BEGIN { conffiles = 0 }
106 /^Conffiles:/ { conffiles = 1; next }
107 !/^ / { conffiles = 0; next }
108 conffiles == 1 { print }
109 ' /usr
/lib
/opkg
/status
112 list_changed_conffiles
() {
113 # Cannot handle spaces in filenames - but opkg cannot either...
114 list_conffiles |
while read file csum
; do
115 [ -r "$file" ] ||
continue
117 echo "${csum} ${file}" | sha256sum
-sc - ||
echo "$file"
123 ( find $
(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \
124 /etc
/sysupgrade.conf
/lib
/upgrade
/keep.d
/* 2>/dev
/null
) \
125 \
( -type f
-o -type l \
) $find_filter 2>/dev
/null
;
126 list_changed_conffiles
) |
sort -u > "$file"
132 ( cd /overlay
/upper
/; find .
/etc \
( -type f
-o -type l \
) $find_filter |
sed \
134 -e '\,^/etc/board.json$,d' \
135 -e '\,/[^/]*-opkg$,d' \
136 -e '\,^/etc/urandom.seed$,d' \
142 sysupgrade_image_check
="fwtool_check_signature fwtool_check_image platform_check_image"
144 if [ $SAVE_OVERLAY = 1 ]; then
145 [ ! -d /overlay
/upper
/etc
] && {
146 echo "Cannot find '/overlay/upper/etc', required for '-c'" >&2
149 sysupgrade_init_conffiles
="add_overlayfiles"
151 sysupgrade_init_conffiles
="add_conffiles"
155 if [ $SKIP_UNCHANGED = 1 ]; then
157 echo "'/rom/' is required by '-u'"
160 find_filter
='( ( -exec test -e /rom/{} ; -exec cmp -s /{} /rom/{} ; ) -o -print )'
165 do_save_conffiles
() {
168 [ -z "$(rootfs_type)" ] && {
169 echo "Cannot save config while running from ramdisk." >&2
170 ask_bool
0 "Abort" && exit
174 run_hooks
"$CONFFILES" $sysupgrade_init_conffiles
175 ask_bool
0 "Edit config file list" && vi
"$CONFFILES"
177 v
"Saving config files..."
178 [ "$VERBOSE" -gt 1 ] && TAR_V
="v" || TAR_V
=""
179 tar c
${TAR_V}zf
"$conf_tar" -T "$CONFFILES" 2>/dev
/null
180 if [ "$?" -ne 0 ]; then
181 echo "Failed to create the configuration backup."
189 if [ $CONF_BACKUP_LIST -eq 1 ]; then
190 run_hooks
"$CONFFILES" $sysupgrade_init_conffiles
196 if [ -n "$CONF_BACKUP" ]; then
197 do_save_conffiles
"$CONF_BACKUP"
201 if [ -n "$CONF_RESTORE" ]; then
202 if [ "$CONF_RESTORE" != "-" ] && [ ! -f "$CONF_RESTORE" ]; then
203 echo "Backup archive '$CONF_RESTORE' not found." >&2
207 [ "$VERBOSE" -gt 1 ] && TAR_V
="v" || TAR_V
=""
208 tar -C / -x${TAR_V}zf
"$CONF_RESTORE"
212 type platform_check_image
>/dev
/null
2>/dev
/null ||
{
213 echo "Firmware upgrade is not implemented for this platform." >&2
220 wget
-O/tmp
/sysupgrade.img
"$IMAGE"
221 IMAGE
=/tmp
/sysupgrade.img
225 IMAGE
="$(readlink -f "$IMAGE")"
229 echo "Image file not found." >&2
234 v
"Image not in /tmp, copying..."
235 cp -f "$IMAGE" /tmp
/sysupgrade.img
236 IMAGE
=/tmp
/sysupgrade.img
243 for check
in $sysupgrade_image_check; do
244 ( $check "$IMAGE" ) ||
{
245 if [ $FORCE -eq 1 ]; then
246 echo "Image check '$check' failed but --force given - will update anyway!" >&2
249 echo "Image check '$check' failed." >&2
255 if [ -n "$CONF_IMAGE" ]; then
256 case "$(get_magic_word $CONF_IMAGE cat)" in
260 echo "Invalid config file. Please use only .tar.gz files" >&2
264 get_image
"$CONF_IMAGE" "cat" > "$CONF_TAR"
266 elif ask_bool
$SAVE_CONFIG "Keep config files over reflash"; then
267 [ $TEST -eq 1 ] || do_save_conffiles
"$CONF_TAR"
270 [ $TEST -eq 1 ] ||
rm -f "$CONF_TAR"
274 if [ $TEST -eq 1 ]; then
278 if [ $SAVE_PARTITIONS -eq 0 ]; then
279 touch /tmp
/sysupgrade.always.overwrite.bootdisk.partmap
281 rm -f /tmp
/sysupgrade.always.overwrite.bootdisk.partmap
284 install_bin
/sbin
/upgraded
285 v
"Commencing upgrade. Closing all shell sessions."
287 COMMAND
='. /lib/functions.sh; include /lib/upgrade; do_upgrade_stage2'
289 if [ -n "$FAILSAFE" ]; then
290 printf '%s\x00%s\x00%s' "$RAM_ROOT" "$IMAGE" "$COMMAND" >/tmp
/sysupgrade
291 lock
-u /tmp
/.failsafe
293 ubus call system sysupgrade
"{
294 \"prefix\": $(json_string "$RAM_ROOT"),
295 \"path\": $(json_string "$IMAGE"),
296 \"command\": $(json_string "$COMMAND")