diff --git a/packages/sysutils/busybox/scripts/init b/packages/sysutils/busybox/scripts/init index aa61489f05..04cb9e2d91 100755 --- a/packages/sysutils/busybox/scripts/init +++ b/packages/sysutils/busybox/scripts/init @@ -15,6 +15,9 @@ /usr/bin/busybox mkdir -p /sysroot /usr/bin/busybox mkdir -p /storage +# temp mountpoint for updates +/usr/bin/busybox mkdir -p /update + # mount all needed special filesystems /usr/bin/busybox mount -t devtmpfs devtmpfs /dev /usr/bin/busybox mount -t proc proc /proc @@ -243,35 +246,40 @@ mount_part() { $MOUNT_CMD "$MOUNT_TARGET" "$2" "$3" "$4" } -# mount the specified SYSTEM file and output arch from /etc/os-release -get_project_arch() { - mount_part "$1" "/sysroot" "ro,loop" || return - - if [ -f /sysroot/etc/os-release ]; then - . /sysroot/etc/os-release - echo "${LIBREELEC_ARCH:-${OPENELEC_ARCH}}" +mount_sysroot() { + if [ "$SYSTEM_TORAM" = "yes" ]; then + cp /flash/$IMAGE_SYSTEM /dev/$IMAGE_SYSTEM + mount_part "/dev/$IMAGE_SYSTEM" "/sysroot" "ro,loop" + else + mount_part "/flash/$IMAGE_SYSTEM" "/sysroot" "ro,loop" fi - umount /sysroot + if [ -f /flash/post-sysroot.sh ]; then + . /flash/post-sysroot.sh + fi } -# If the project/arch of current matches the upgrade, then it is considered compatible. -# Otherwise, mount the upgrade SYSTEM partition and, if canupdate.sh is available, -# call the script to determine if the current upgrade file can be applied on to the +# mount the specified SYSTEM file and output arch from /etc/os-release +get_project_arch() { + if [ -f ${1}/etc/os-release ]; then + . ${1}/etc/os-release + echo "${LIBREELEC_ARCH:-${OPENELEC_ARCH}}" + fi +} + +# If the project/arch of current matches the update, then it is considered compatible. +# Otherwise, mount the update SYSTEM partition and, if canupdate.sh is available, +# call the script to determine if the current update file can be applied on to the # current system - 0 means it is compatible, non-zero that it is not compatible. is_compatible() { local result=1 - if [ "${2}" = "${3}" ]; then + if [ "${1}" = "${2}" ]; then result=0 else - mount_part "$1" "/sysroot" "ro,loop" - - if [ -f /sysroot/usr/share/bootloader/canupdate.sh ]; then - sh /sysroot/usr/share/bootloader/canupdate.sh "${2}" "${3}" && result=0 + if [ -f /update/usr/share/bootloader/canupdate.sh ]; then + sh /update/usr/share/bootloader/canupdate.sh "${1}" "${2}" && result=0 fi - - umount /sysroot fi return ${result} @@ -280,17 +288,15 @@ is_compatible() { # determine if the new SYSTEM file is compatible with the current SYSTEM file check_is_compatible() { local update_filename="${1}" - local old_system="${2}" - local new_system="${3}" local old_project_arch new_project_arch - old_project_arch="$(get_project_arch "${old_system}")" || return - new_project_arch="$(get_project_arch "${new_system}")" || return + old_project_arch="$(get_project_arch "/sysroot")" || return + new_project_arch="$(get_project_arch "/update")" || return # If old or new project/arch isn't available then could be very old (pre-/etc/os-release) build - have to trust it if [ -n "${old_project_arch}" -a -n "${new_project_arch}" ]; then # If the old project/arch is not compatible with the new project/arch then abort... - if ! is_compatible "${new_system}" "${old_project_arch}" "${new_project_arch}"; then + if ! is_compatible "${old_project_arch}" "${new_project_arch}"; then echo "" echo "ERROR: $(basename "${update_filename}") is not compatible with ${old_project_arch} hardware - update cancelled." echo "" @@ -341,9 +347,7 @@ update_bootloader() { local result export BOOT_ROOT="/flash" - export SYSTEM_ROOT="/sysroot" - - mount_part "/flash/$IMAGE_SYSTEM" "/sysroot" "ro,loop" + export SYSTEM_ROOT="/update" if [ -f $SYSTEM_ROOT/usr/share/bootloader/update.sh ]; then StartProgress spinner "Updating Boot Files... " @@ -352,8 +356,6 @@ update_bootloader() { StopProgress "done" [ -n "${result}" ] && echo "${result}" fi - - umount /sysroot } load_modules() { @@ -640,7 +642,7 @@ check_out_of_space() { if [ "$(df /storage | awk '/[0-9]%/{print $4}')" -eq "0" ]; then echo "" echo "The $1 is corrupt, or there is not enough" - echo "free space on /storage to complete the upgrade!" + echo "free space on /storage to complete the update!" echo "" echo "Please free up space on your /storage partition" echo "by deleting unecessary files, then try again." @@ -708,7 +710,7 @@ check_update() { mkdir -p $UPDATE_DIR/.tmp &>/dev/null sync - echo "UPGRADE IN PROGRESS" + echo "UPDATE IN PROGRESS" echo "" echo "Please do not reboot or turn off your @DISTRONAME@ device!" echo "" @@ -859,10 +861,12 @@ check_update() { fi fi - # Verify that the new upgrade is compatible with the current system - this should avoid creating + mount_part "$UPDATE_DIR/$UPDATE_SYSTEM" "/update" "ro,loop" + + # Verify that the new update is compatible with the current system - this should avoid creating # non-booting systems after (for example) an RPi tar is incorrectly applied to an RPi2 system. if [ ! -f "$UPDATE_ROOT/.nocompat" ]; then - if ! check_is_compatible "$UPDATE_FILENAME" "/flash/$IMAGE_SYSTEM" "$UPDATE_DIR/$UPDATE_SYSTEM"; then + if ! check_is_compatible "$UPDATE_FILENAME"; then do_cleanup StartProgress countdown "Normal startup in 60s... " 60 "NOW" return 0 @@ -913,8 +917,10 @@ check_update() { else update_file "Kernel" "$UPDATE_KERNEL" "/flash/$IMAGE_KERNEL" fi + umount /sysroot update_file "System" "$UPDATE_SYSTEM" "/flash/$IMAGE_SYSTEM" update_bootloader + umount /update do_cleanup do_reboot } @@ -922,13 +928,6 @@ check_update() { prepare_sysroot() { progress "Preparing system" - if [ "$SYSTEM_TORAM" = "yes" ]; then - cp /flash/$IMAGE_SYSTEM /dev/$IMAGE_SYSTEM - mount_part "/dev/$IMAGE_SYSTEM" "/sysroot" "ro,loop" - else - mount_part "/flash/$IMAGE_SYSTEM" "/sysroot" "ro,loop" - fi - mount --move /flash /sysroot/flash mount --move /storage /sysroot/storage @@ -1086,6 +1085,7 @@ for BOOT_STEP in \ cleanup_flash \ update_bootmenu \ load_splash \ + mount_sysroot \ mount_storage \ check_update \ prepare_sysroot; do