4 .
/lib
/functions
/system.sh
7 export MTD_CONFIG_ARGS
=""
12 export SAVE_PARTITIONS
=1
14 export CONF_BACKUP_LIST
=0
25 -i) export INTERACTIVE
=1;;
26 -v) export VERBOSE
="$(($VERBOSE + 1))";;
27 -q) export VERBOSE
="$(($VERBOSE - 1))";;
28 -n) export SAVE_CONFIG
=0;;
29 -c) export SAVE_OVERLAY
=1;;
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;;
33 -l|
--list-backup) export CONF_BACKUP_LIST
=1;;
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;;
39 echo "Invalid option: $1" >&2
47 export CONFFILES
=/tmp
/sysupgrade.conffiles
48 export CONF_TAR
=/tmp
/sysupgrade.tgz
52 [ -z "$IMAGE" -a -z "$NEED_IMAGE" -a $CONF_BACKUP_LIST -eq 0 -o $HELP -gt 0 ] && {
54 Usage: $0 [<upgrade-option>...] <image file or URL>
55 $0 [-q] [-i] [-c] <backup-command> <file>
58 -f <config> restore configuration from .tar.gz (file or url)
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.
64 Verify image and config .tar.gz but do not actually flash.
66 Flash image even if image checks fail, this is dangerous!
69 -h | --help display this help
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.
81 list the files that would be backed up when calling
82 sysupgrade -b. Does not create a backup file.
88 [ -n "$IMAGE" -a -n "$NEED_IMAGE" ] && {
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.
96 # prevent messages from clobbering the tarball when using stdout
97 [ "$CONF_BACKUP" = "-" ] && export VERBOSE
=0
102 BEGIN { conffiles = 0 }
103 /^Conffiles:/ { conffiles = 1; next }
104 !/^ / { conffiles = 0; next }
105 conffiles == 1 { print }
106 ' /usr
/lib
/opkg
/status
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
114 echo "${csum} ${file}" | sha256sum
-sc - ||
echo "$file"
120 ( find $
(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \
121 /etc
/sysupgrade.conf
/lib
/upgrade
/keep.d
/* 2>/dev
/null
) \
122 -type f
-o -type l
2>/dev
/null
;
123 list_changed_conffiles
) |
sort -u > "$file"
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' \
133 -e '\,/[^/]*-opkg$,d' \
134 -e '\,/etc/urandom.seed$,d' \
140 sysupgrade_image_check
="fwtool_check_signature fwtool_check_image platform_check_image"
142 if [ $SAVE_OVERLAY = 1 ]; then
143 [ ! -d /overlay
/upper
/etc
] && {
144 echo "Cannot find '/overlay/upper/etc', required for '-c'" >&2
147 sysupgrade_init_conffiles
="add_overlayfiles"
149 sysupgrade_init_conffiles
="add_conffiles"
154 do_save_conffiles
() {
157 [ -z "$(rootfs_type)" ] && {
158 echo "Cannot save config while running from ramdisk." >&2
159 ask_bool
0 "Abort" && exit
163 run_hooks
"$CONFFILES" $sysupgrade_init_conffiles
164 ask_bool
0 "Edit config file list" && vi
"$CONFFILES"
166 v
"Saving config files..."
167 [ "$VERBOSE" -gt 1 ] && TAR_V
="v" || TAR_V
=""
168 tar c
${TAR_V}zf
"$conf_tar" -T "$CONFFILES" 2>/dev
/null
169 if [ "$?" -ne 0 ]; then
170 echo "Failed to create the configuration backup."
178 if [ $CONF_BACKUP_LIST -eq 1 ]; then
179 run_hooks
"$CONFFILES" $sysupgrade_init_conffiles
185 if [ -n "$CONF_BACKUP" ]; then
186 do_save_conffiles
"$CONF_BACKUP"
190 if [ -n "$CONF_RESTORE" ]; then
191 if [ "$CONF_RESTORE" != "-" ] && [ ! -f "$CONF_RESTORE" ]; then
192 echo "Backup archive '$CONF_RESTORE' not found." >&2
196 [ "$VERBOSE" -gt 1 ] && TAR_V
="v" || TAR_V
=""
197 tar -C / -x${TAR_V}zf
"$CONF_RESTORE"
201 type platform_check_image
>/dev
/null
2>/dev
/null ||
{
202 echo "Firmware upgrade is not implemented for this platform." >&2
209 wget
-O/tmp
/sysupgrade.img
"$IMAGE"
210 IMAGE
=/tmp
/sysupgrade.img
214 IMAGE
="$(readlink -f "$IMAGE")"
218 echo "Image file not found." >&2
223 v
"Image not in /tmp, copying..."
224 cp -f "$IMAGE" /tmp
/sysupgrade.img
225 IMAGE
=/tmp
/sysupgrade.img
232 for check
in $sysupgrade_image_check; do
233 ( $check "$IMAGE" ) ||
{
234 if [ $FORCE -eq 1 ]; then
235 echo "Image check '$check' failed but --force given - will update anyway!" >&2
238 echo "Image check '$check' failed." >&2
244 if [ -n "$CONF_IMAGE" ]; then
245 case "$(get_magic_word $CONF_IMAGE cat)" in
249 echo "Invalid config file. Please use only .tar.gz files" >&2
253 get_image
"$CONF_IMAGE" "cat" > "$CONF_TAR"
255 elif ask_bool
$SAVE_CONFIG "Keep config files over reflash"; then
256 [ $TEST -eq 1 ] || do_save_conffiles
"$CONF_TAR"
259 [ $TEST -eq 1 ] ||
rm -f "$CONF_TAR"
263 if [ $TEST -eq 1 ]; then
267 if [ $SAVE_PARTITIONS -eq 0 ]; then
268 touch /tmp
/sysupgrade.always.overwrite.bootdisk.partmap
270 rm -f /tmp
/sysupgrade.always.overwrite.bootdisk.partmap
273 install_bin
/sbin
/upgraded
274 v
"Commencing upgrade. Closing all shell sessions."
276 COMMAND
='. /lib/functions.sh; include /lib/upgrade; do_upgrade_stage2'
278 if [ -n "$FAILSAFE" ]; then
279 printf '%s\x00%s\x00%s' "$RAM_ROOT" "$IMAGE" "$COMMAND" >/tmp
/sysupgrade
280 lock
-u /tmp
/.failsafe
282 ubus call system sysupgrade
"{
283 \"prefix\": $(json_string "$RAM_ROOT"),
284 \"path\": $(json_string "$IMAGE"),
285 \"command\": $(json_string "$COMMAND")