#!/bin/sh
-[ "$1" = "nand" ] && exec /lib/upgrade/stage2 "$2" "$3"
-
. /lib/functions.sh
. /lib/functions/system.sh
# initialize defaults
-RAMFS_COPY_BIN="" # extra programs for temporary ramfs root
-RAMFS_COPY_DATA="" # extra data files
export MTD_CONFIG_ARGS=""
export INTERACTIVE=0
export VERBOSE=1
$0 [-q] [-i] <backup-command> <file>
upgrade-option:
- -d <delay> add a delay before rebooting
-f <config> restore configuration from .tar.gz (file or url)
-i interactive mode
-c attempt to preserve all changed files in /etc/
# prevent messages from clobbering the tarball when using stdout
[ "$CONF_BACKUP" = "-" ] && export VERBOSE=0
+
+list_conffiles() {
+ awk '
+ BEGIN { conffiles = 0 }
+ /^Conffiles:/ { conffiles = 1; next }
+ !/^ / { conffiles = 0; next }
+ conffiles == 1 { print }
+ ' /usr/lib/opkg/status
+}
+
+list_changed_conffiles() {
+ # Cannot handle spaces in filenames - but opkg cannot either...
+ list_conffiles | while read file csum; do
+ [ -r "$file" ] || continue
+
+ echo "${csum} ${file}" | sha256sum -sc - || echo "$file"
+ done
+}
+
add_uci_conffiles() {
local file="$1"
( find $(sed -ne '/^[[:space:]]*$/d; /^#/d; p' \
/etc/sysupgrade.conf /lib/upgrade/keep.d/* 2>/dev/null) \
-type f -o -type l 2>/dev/null;
- opkg list-changed-conffiles ) | sort -u > "$file"
+ list_changed_conffiles ) | sort -u > "$file"
return 0
}
add_overlayfiles() {
local file="$1"
- if [ -d /overlay/upper ]; then
- local overlaydir="/overlay/upper"
- else
- local overlaydir="/overlay"
- fi
- find $overlaydir/etc/ -type f -o -type l | sed \
+ find /overlay/upper/etc/ -type f -o -type l | sed \
-e 's,^/overlay\/upper/,/,' \
- -e 's,^/overlay/,/,' \
-e '\,/META_[a-zA-Z0-9]*$,d' \
-e '\,/functions.sh$,d' \
-e '\,/[^/]*-opkg$,d' \
# hooks
sysupgrade_image_check="fwtool_check_image platform_check_image"
sysupgrade_pre_upgrade="fwtool_pre_upgrade"
-[ $SAVE_OVERLAY = 0 -o ! -d /overlay/etc ] && \
- sysupgrade_init_conffiles="add_uci_conffiles" || \
+
+if [ $SAVE_OVERLAY = 1 ]; then
+ [ ! -d /overlay/upper/etc ] && {
+ echo "Cannot find '/overlay/upper/etc', required for '-c'"
+ exit 1
+ }
sysupgrade_init_conffiles="add_overlayfiles"
+else
+ sysupgrade_init_conffiles="add_uci_conffiles"
+fi
include /lib/upgrade
}
if [ $CONF_BACKUP_LIST -eq 1 ]; then
- add_uci_conffiles "$CONFFILES"
+ run_hooks "$CONFFILES" $sysupgrade_init_conffiles
cat "$CONFFILES"
rm -f "$CONFFILES"
exit 0
run_hooks "" $sysupgrade_pre_upgrade
install_bin /sbin/upgraded
-v "Commencing upgrade. All shell sessions will be closed now."
-ubus call system sysupgrade "{
- \"prefix\": \"$RAM_ROOT\",
- \"path\": $(json_string "$IMAGE"),
- \"command\": \". /lib/functions.sh; include /lib/upgrade; do_upgrade_stage2\"
-}"
+v "Commencing upgrade. Closing all shell sessions."
+
+COMMAND='. /lib/functions.sh; include /lib/upgrade; do_upgrade_stage2'
+
+if [ -n "$FAILSAFE" ]; then
+ printf '%s\x00%s\x00%s' "$RAM_ROOT" "$IMAGE" "$COMMAND" >/tmp/sysupgrade
+ lock -u /tmp/.failsafe
+else
+ ubus call system sysupgrade "{
+ \"prefix\": $(json_string "$RAM_ROOT"),
+ \"path\": $(json_string "$IMAGE"),
+ \"command\": $(json_string "$COMMAND")
+ }"
+fi