Revert "init: Add progress indicators during long running updates"

This reverts commit e45ba7e2987557c032c0d35bdaa7a48c674223af.
This commit is contained in:
MilhouseVH 2016-03-20 21:36:53 +00:00
parent e45ba7e298
commit 93d814c471

View File

@ -24,7 +24,6 @@
/bin/busybox mkdir -p /dev /bin/busybox mkdir -p /dev
/bin/busybox mkdir -p /proc /bin/busybox mkdir -p /proc
/bin/busybox mkdir -p /sys /bin/busybox mkdir -p /sys
/bin/busybox mkdir -p /tmp
/bin/busybox mkdir -p /flash /bin/busybox mkdir -p /flash
/bin/busybox mkdir -p /sysroot /bin/busybox mkdir -p /sysroot
/bin/busybox mkdir -p /storage /bin/busybox mkdir -p /storage
@ -37,9 +36,7 @@
# set needed variables # set needed variables
MODULE_DIR=/lib/modules MODULE_DIR=/lib/modules
UPDATE_ROOT=/storage/.update UPDATE_DIR=/storage/.update
UPDATE_DIR="$UPDATE_ROOT"
UPDATE_KERNEL="KERNEL" UPDATE_KERNEL="KERNEL"
UPDATE_SYSTEM="SYSTEM" UPDATE_SYSTEM="SYSTEM"
IMAGE_KERNEL="KERNEL" IMAGE_KERNEL="KERNEL"
@ -47,6 +44,8 @@
BOOT_STEP="start" BOOT_STEP="start"
MD5_FAILED="0" MD5_FAILED="0"
MD5_NOCHECK="0"
SIZE_FAILED="0"
RUN_FSCK="yes" RUN_FSCK="yes"
RUN_FSCK_DISKS="" RUN_FSCK_DISKS=""
@ -58,24 +57,10 @@
LIVE="no" LIVE="no"
# Show frame-buffer cursor # load cpu firmware if possible
showcursor() { if [ -e /sys/devices/system/cpu/microcode/reload ]; then
echo -en "\033[?25h" echo 1 > /sys/devices/system/cpu/microcode/reload
fi
# show cursor
if [ -f /sys/devices/virtual/graphics/fbcon/cursor_blink ] ; then
echo 1 > /sys/devices/virtual/graphics/fbcon/cursor_blink
fi
}
# Hide frame-buffer cursor
hidecursor() {
echo -en "\033[?25l"
if [ -f /sys/devices/virtual/graphics/fbcon/cursor_blink ] ; then
echo 0 > /sys/devices/virtual/graphics/fbcon/cursor_blink
fi
}
# hide kernel log messages on console # hide kernel log messages on console
echo '1 4 1 7' > /proc/sys/kernel/printk echo '1 4 1 7' > /proc/sys/kernel/printk
@ -92,7 +77,9 @@
# clear screen and hide cursor # clear screen and hide cursor
clear clear
hidecursor if [ -f /sys/devices/virtual/graphics/fbcon/cursor_blink ] ; then
echo 0 > /sys/devices/virtual/graphics/fbcon/cursor_blink
fi
# parse command line arguments # parse command line arguments
for arg in $(cat /proc/cmdline); do for arg in $(cat /proc/cmdline); do
@ -182,7 +169,8 @@
debug_shell() { debug_shell() {
echo "### Starting debugging shell... type exit to quit ###" echo "### Starting debugging shell... type exit to quit ###"
showcursor # show cursor
echo 0 > /sys/devices/virtual/graphics/fbcon/cursor_blink
sh </dev/tty1 >/dev/tty1 2>&1 sh </dev/tty1 >/dev/tty1 2>&1
} }
@ -203,112 +191,6 @@
esac esac
} }
# Start a progress meter
# $1: spinner, percent, countdown
# $2: [all types] message to display
# [percent]
# $3: name of filename to be progress monitored
# $4: terminal size (in bytes) of $3 when progress is complete
# [countdown]
# $3: number of seconds to start counting down from
# $4: completion message, default is nothing
StartProgress() {
# Use files for inter-process communication.
# This file is used to indicate a metter is running/active
echo > /tmp/progress.run
if [ "$1" = "spinner" ]; then
ProgressTask_Spinner "$2" &
elif [ "$1" = "percent" ]; then
ProgressTask_Percent "$2" $3 $4 &
elif [ "$1" = "countdown" ]; then
ProgressTask_Countdown "$2" $3 "$4"
else
echo "Unknown spinner type: $1"
return 1
fi
return 0
}
# Stop a progress meter, displaying optional completion message
# $1: optional completion message (appropriate default used if not specified)
StopProgress() {
# Instruct running progress meter to end, showing specified completion message
echo "${1}" > /tmp/progress.stop
# Wait for progress meter to stop running
while [ -f /tmp/progress.run ]; do
usleep 250000
done
# Clean up
rm -f /tmp/progress.stop
return 0
}
# Use this task for processes of indeterminate duration
ProgressTask_Spinner() {
local msg="$1"
local spinner="|/-\\|/-\\"
local count=0 done
echo -n "${msg} "
while [ ! -f /tmp/progress.stop ]; do
echo -en "\b${spinner:$count:1}"
usleep 500000
count=$(((count + 1) % 8))
done
done="$(cat /tmp/progress.stop)"
echo -e "\b${done:-done}"
rm -f /tmp/progress.run
exit 0
}
# Use this task when transferring a file of known size
ProgressTask_Percent() {
local msg="$1" filename="$2" fsize=$3 csize done
echo -n "${msg} "
while [ ! -f /tmp/progress.stop ]; do
[ -f ${filename} ] && csize=$(stat -t "${filename}" | awk '{print $2}') || csize=0
echo $csize $fsize | awk '{ printf "\b\b\b\b%3d%%", ($1 * 100 / $2) }'
usleep 250000
done
done="$(cat /tmp/progress.stop)"
echo -e "\b\b\b\b${done:-100%}"
rm -f /tmp/progress.run
exit 0
}
# Use this task to countdown a number of seconds
# (needs more work for durations > 99 seconds)
ProgressTask_Countdown() {
local msg="$1" startfrom=$2 done="$3"
echo -n "${msg} "
while [ ${startfrom} -gt 0 ]; do
echo ${startfrom} | awk '{ printf "\b\b%2d", $1 }'
sleep 1
startfrom=$((startfrom - 1))
done
echo -e "\b\b${done}"
rm -f /tmp/progress.run
return 0
}
# Mount handlers # Mount handlers
# All handlers take the following parameters: # All handlers take the following parameters:
# $1:target, $2:mountpoint, $3:mount options, [$4:fs type] # $1:target, $2:mountpoint, $3:mount options, [$4:fs type]
@ -457,16 +339,9 @@
update_file() { update_file() {
if [ -f "$UPDATE_DIR/$2" -a -f "$3" ]; then if [ -f "$UPDATE_DIR/$2" -a -f "$3" ]; then
echo "updating $1..."
mount -o remount,rw /flash mount -o remount,rw /flash
mv $UPDATE_DIR/$2 $3 2>/dev/null
StartProgress percent "Updating $1... " "$3" $(stat -t "$UPDATE_DIR/$2" | awk '{print $2}')
# use dd here with conv=fsync so that all writes are non-buffered
# ensuring accurate progress - take the sync hit during the
# transfer, rather than when flushing file buffers after the progress
# meter declares the transfer already complete
dd if=$UPDATE_DIR/$2 of=$3 bs=1M conv=fsync 2>/dev/null
StopProgress
# loopback file needs writable /flash all the time # loopback file needs writable /flash all the time
if [ "${disk%%=*}" != "FILE" ]; then if [ "${disk%%=*}" != "FILE" ]; then
mount -o remount,ro /flash mount -o remount,ro /flash
@ -476,30 +351,22 @@
} }
update_partition() { update_partition() {
local result
if [ -f "$UPDATE_DIR/$2" -a -b "$3" ]; then if [ -f "$UPDATE_DIR/$2" -a -b "$3" ]; then
StartProgress spinner "Updating $1... " echo "updating $1..."
result="$(dd if="$UPDATE_DIR/$2" of="$3" conv=fsync 2>&1)" dd if="$UPDATE_DIR/$2" of="$3"
StopProgress "done" fi
echo "${result}"
fi
} }
update_bootloader() { update_bootloader() {
local result
export BOOT_ROOT="/flash" export BOOT_ROOT="/flash"
export SYSTEM_ROOT="/sysroot" export SYSTEM_ROOT="/sysroot"
mount_part "/flash/$IMAGE_SYSTEM" "/sysroot" "ro,loop" mount_part "/flash/$IMAGE_SYSTEM" "/sysroot" "ro,loop"
if [ -f $SYSTEM_ROOT/usr/share/bootloader/update.sh ]; then if [ -f $SYSTEM_ROOT/usr/share/bootloader/update.sh ]; then
StartProgress spinner "Updating Bootloader... " echo "updating Bootloader..."
result="$(sh $SYSTEM_ROOT/usr/share/bootloader/update.sh 2>&1)" sh $SYSTEM_ROOT/usr/share/bootloader/update.sh
sync sync
StopProgress "done"
[ -n "${result}" ] && echo "${result}"
fi fi
umount /sysroot umount /sysroot
@ -552,31 +419,31 @@
echo "System reboots now..." echo "System reboots now..."
# syncing filesystem # syncing filesystem
sync sync
# unmount filesystems # unmount filesystems
if /bin/busybox mountpoint -q /flash ; then if /bin/busybox mountpoint -q /flash ; then
/bin/busybox umount /flash /bin/busybox umount /flash
fi fi
if /bin/busybox mountpoint -q /storage ; then if /bin/busybox mountpoint -q /storage ; then
/bin/busybox umount /storage /bin/busybox umount /storage
fi fi
usleep 2000000 usleep 2000000
/bin/busybox reboot /bin/busybox reboot
} }
force_fsck() { force_fsck() {
echo "Filesystem corruption has been detected!" echo "Filesystem corruption has been detected"
echo "To prevent an automatic repair attempt continuing," echo "To prevent an automatic repair attempt continuing"
echo "press any key or power off your system within the next 120 seconds" echo "press any key or power off your system within the next 120 seconds"
echo "" echo ""
read -t120 -n1 read -t120 -n1
# The exit status is 0 if input is available # The exit status is 0 if input is available
# The exit status is greater than 128 if the timeout is exceeded # The exit status is greater than 128 if the timeout is exceeded
if [ "$?" -ne "0" -o "$?" -gt "128" ] ; then if [ "$?" -ne "0" -o "$?" -gt "128" ] ; then
echo "Repairing filesystem..." echo "repairing filesystem.."
echo "" echo ""
/sbin/fsck -T -M -y $RUN_FSCK_DISKS /sbin/fsck -T -M -y $RUN_FSCK_DISKS
FSCK_RET="$?" FSCK_RET="$?"
@ -592,7 +459,7 @@
fi fi
do_reboot do_reboot
else else
echo "Shutting down..." echo "shutting down..."
sleep 5 sleep 5
sync sync
poweroff poweroff
@ -602,24 +469,24 @@
check_disks() { check_disks() {
if [ "$RUN_FSCK" = "yes" -a -n "$RUN_FSCK_DISKS" ]; then if [ "$RUN_FSCK" = "yes" -a -n "$RUN_FSCK_DISKS" ]; then
progress "Checking disk(s): $RUN_FSCK_DISKS" progress "Checking disk(s): $RUN_FSCK_DISKS"
/sbin/fsck -T -M -p -a $RUN_FSCK_DISKS > /dev/null 2>&1 /sbin/fsck -T -M -p -a $RUN_FSCK_DISKS > /dev/null 2>&1
FSCK_RET="$?" FSCK_RET="$?"
# FSCK_RET is the bit-wise OR of the exit codes for each filesystem that is checked. # FSCK_RET is the bit-wise OR of the exit codes for each filesystem that is checked.
if [ "$(( $FSCK_RET & 4 ))" = 4 ] ; then if [ "$(( $FSCK_RET & 4 ))" = 4 ] ; then
# errors left # errors left
force_fsck force_fsck
elif [ "$(( $FSCK_RET & 2 ))" = 2 ] ; then elif [ "$(( $FSCK_RET & 2 ))" = 2 ] ; then
# reboot needed # reboot needed
echo "Filesystem repaired, reboot needed..." echo "filesystem repaired, reboot needed..."
do_reboot do_reboot
elif [ "$(( $FSCK_RET & 1 ))" = 1 ] ; then elif [ "$(( $FSCK_RET & 1 ))" = 1 ] ; then
# filesystem errors corrected # filesystem errors corrected
progress "Filesystem errors corrected , continuing..." progress "filesystem errors corrected , continuing..."
elif [ "$(( $FSCK_RET & 0 ))" = 0 ] ; then elif [ "$(( $FSCK_RET & 0 ))" = 0 ] ; then
# no errors found # no errors found
progress "No filesystem errors found, continuing..." progress "no filesystem errors found, continuing..."
fi fi
fi fi
} }
@ -639,7 +506,7 @@
if ! ping -q -c 2 "$wol_ip" &>/dev/null; then if ! ping -q -c 2 "$wol_ip" &>/dev/null; then
ether-wake "$wol_mac" ether-wake "$wol_mac"
StartProgress countdown "WOL magic packet sent to $wol_ip, waiting $wol_wait seconds... " $wol_wait "done" sleep "$wol_wait"
fi fi
fi fi
} }
@ -687,216 +554,115 @@
fi fi
} }
do_cleanup() {
StartProgress spinner "Cleaning up... "
if [ -d $UPDATE_ROOT/.tmp/mnt ]; then
if mountpoint -q $UPDATE_ROOT/.tmp/mnt ; then
# busybox umount deletes loop device automatically
umount $UPDATE_ROOT/.tmp/mnt
fi
[ -n $LOOP ] && losetup -d $LOOP &>/dev/null
fi
[ -f "$UPDATE_TAR" ] && rm -f "$UPDATE_TAR" &>/dev/null
[ -f "$UPDATE_IMG_GZ" ] && rm -f "$UPDATE_IMG_GZ" &>/dev/null
[ -f "$UPDATE_IMG" ] && rm -f "$UPDATE_IMG" &>/dev/null
rm -rf $UPDATE_ROOT/.tmp &>/dev/null
rm -rf $UPDATE_ROOT/[0-9a-zA-Z]* &>/dev/null
sync
StopProgress "done"
}
check_update() { check_update() {
progress "Checking for updates" progress "Checking for updates"
UPDATE_TAR=`ls -1 "$UPDATE_DIR"/*.tar 2>/dev/null | head -n 1` UPDATE_TAR=`ls -1 "$UPDATE_DIR"/*.tar 2>/dev/null | head -n 1`
UPDATE_IMG_GZ=`ls -1 "$UPDATE_DIR"/*.img.gz 2>/dev/null | head -n 1` if [ -f "$UPDATE_DIR/$UPDATE_KERNEL" -a -f "$UPDATE_DIR/$UPDATE_SYSTEM" -o -f "$UPDATE_TAR" ] ; then
UPDATE_IMG=`ls -1 "$UPDATE_DIR"/*.img 2>/dev/null | head -n 1` if [ "$UPDATE_DISABLED" = "yes" ] ; then
rm -rf $UPDATE_DIR/[0-9a-zA-Z]* &>/dev/null
echo "Updating not supported on netboot. normal startup in 10s..."
sync
usleep 10000000
return 0
fi
if ! [ -f "$UPDATE_DIR/$UPDATE_KERNEL" -a -f "$UPDATE_DIR/$UPDATE_SYSTEM" ] && # check for .tar
! [ -f "$UPDATE_TAR" -o -f "$UPDATE_IMG_GZ" -o -f "$UPDATE_IMG" ]; then if [ -f "$UPDATE_TAR" ] ; then
return 0 echo "Found new .tar archive. extracting..."
fi
if [ "$UPDATE_DISABLED" = "yes" ] ; then
echo "Updating is not supported on netboot"
do_cleanup
StartProgress countdown "Normal startup in 10s... " 10 "NOW"
return 0
fi
# remove temporary folder if exist from previous run
rm -fr "$UPDATE_DIR/.tmp" &>/dev/null
if [ -f "$UPDATE_TAR" ] ; then
echo "Found new .tar archive"
StartProgress spinner "Extracting tar... "
mkdir -p $UPDATE_DIR/.tmp &>/dev/null mkdir -p $UPDATE_DIR/.tmp &>/dev/null
tar -xf "$UPDATE_TAR" -C $UPDATE_DIR/.tmp &>/dev/null tar -xf "$UPDATE_TAR" -C $UPDATE_DIR/.tmp &>/dev/null
mv $UPDATE_DIR/.tmp/*/target/* $UPDATE_DIR &>/dev/null mv $UPDATE_DIR/.tmp/*/target/* $UPDATE_DIR &>/dev/null
rm -f "$UPDATE_TAR" &>/dev/null
rm -rf $UPDATE_DIR/.tmp &>/dev/null
sync sync
StopProgress "done" if [ ! -f "$UPDATE_DIR/$UPDATE_KERNEL" -o ! -f "$UPDATE_DIR/$UPDATE_SYSTEM" ] ; then
elif [ -f "$UPDATE_IMG_GZ" -o -f "$UPDATE_IMG" ] ; then echo "missing ${UPDATE_KERNEL} or ${UPDATE_SYSTEM}... normal startup in 10s"
mkdir -p $UPDATE_DIR/.tmp/mnt &>/dev/null
IMG_FILE="$UPDATE_DIR/.tmp/update.img"
GZRESULT="0"
if [ -f "$UPDATE_IMG_GZ" ]; then
echo "Found new compressed image file"
StartProgress spinner "Decompressing image file... "
gunzip -d -c "$UPDATE_IMG_GZ" 1>$IMG_FILE 2>/tmp/gzresult.txt || GZRESULT="1"
sync sync
[ "${GZRESULT}" -eq "0" ] && StopProgress "OK" || StopProgress "FAILED" usleep 10000000
if [ "${GZRESULT}" -eq "1" ]; then
echo "Failed to decompress image file!"
echo "gunzip result: '$(cat /tmp/gzresult.txt)'"
do_cleanup
StartProgress countdown "Normal startup in 30s... " 30 "NOW"
return 0
fi
else
echo "Found new image file"
mv "$UPDATE_IMG" $IMG_FILE
fi
LOOP=$(losetup -f)
LOOP_NUM=$(echo $LOOP | sed 's|/dev/loop||')
mknod $LOOP b 7 $LOOP_NUM
losetup $LOOP $IMG_FILE
# check for MBR partititon
OFFSET=$(fdisk -u -l $LOOP 2>/dev/null | awk '/^[ ]*Device/{part=1; next}; part{if ($2 == "*") {print $3} else {print $2} ; exit}')
if [ -z "$OFFSET" ]; then
# check for GPT partititon
OFFSET=$(fdisk -u -l $LOOP 2>/dev/null | awk '/^Number/{part=1; next}; part{print $2; exit}')
if [ -z "$OFFSET" ]; then
echo "Could not find a valid system partition in image file!"
do_cleanup
StartProgress countdown "Normal startup in 10s... " 10 "NOW"
return 0 return 0
fi fi
fi fi
SECTOR_SIZE=$(cat /sys/devices/virtual/block/loop${LOOP_NUM}/queue/hw_sector_size) if [ -f "$UPDATE_DIR/.nocheck" ] ; then
losetup -d $LOOP MD5_NOCHECK="1"
sync fi
OFFSET=$(($OFFSET * $SECTOR_SIZE)) # check md5 sums if .nocheck doesn't exist
if [ "$MD5_NOCHECK" -eq "0" ] ; then
if [ -f "$UPDATE_DIR/${UPDATE_KERNEL}.md5" -a -f "$UPDATE_DIR/${UPDATE_SYSTEM}.md5" ] ; then
# *.md5 size-check
if [ ! -s "$UPDATE_DIR/${UPDATE_KERNEL}.md5" -o ! -s "$UPDATE_DIR/${UPDATE_SYSTEM}.md5" ] ; then
echo "zero-sized .md5 file..."
MD5_FAILED="1"
else
sed -i 's#target#/storage/.update#g' "$UPDATE_DIR/${UPDATE_KERNEL}.md5"
sed -i 's#target#/storage/.update#g' "$UPDATE_DIR/${UPDATE_SYSTEM}.md5"
# use losetup because busybox mount does not support the -o offset option echo "Checking ${UPDATE_KERNEL}.md5..."
echo "Mounting system partition..." md5sum -c "$UPDATE_DIR/${UPDATE_KERNEL}.md5" || MD5_FAILED="1"
losetup -o $OFFSET $LOOP $IMG_FILE
mount -o ro,loop $LOOP $UPDATE_DIR/.tmp/mnt
# don't make temporary files but instead copy echo "Checking ${UPDATE_SYSTEM}.md5..."
# directly from mountpoint to /flash md5sum -c "$UPDATE_DIR/${UPDATE_SYSTEM}.md5" || MD5_FAILED="1"
UPDATE_DIR=$UPDATE_ROOT/.tmp/mnt fi
UPDATE_KERNEL=$(basename $IMAGE_KERNEL)
fi
sync
if [ ! -f "$UPDATE_DIR/$UPDATE_KERNEL" -o ! -f "$UPDATE_DIR/$UPDATE_SYSTEM" ] ; then
echo "Missing ${UPDATE_KERNEL} or ${UPDATE_SYSTEM}!"
do_cleanup
StartProgress countdown "Normal startup in 10s... " 10 "NOW"
return 0
fi
# check md5 sums if .nocheck doesn't exist
if [ ! -f "$UPDATE_DIR/.nocheck" ]; then
if [ -f "$UPDATE_DIR/${UPDATE_KERNEL}.md5" -a -f "$UPDATE_DIR/${UPDATE_SYSTEM}.md5" ] ; then
# *.md5 size-check
if [ ! -s "$UPDATE_DIR/${UPDATE_KERNEL}.md5" -o ! -s "$UPDATE_DIR/${UPDATE_SYSTEM}.md5" ] ; then
echo "Zero-sized .md5 file!"
MD5_FAILED="1"
else else
sed "s#target/KERNEL#$UPDATE_DIR/$UPDATE_KERNEL#g" "$UPDATE_DIR/${UPDATE_KERNEL}.md5" >"$UPDATE_ROOT/${UPDATE_KERNEL}.check.md5" echo "missing ${UPDATE_KERNEL}.md5 or ${UPDATE_SYSTEM}.md5..."
sed "s#target#$UPDATE_DIR#g" "$UPDATE_DIR/${UPDATE_SYSTEM}.md5" >"$UPDATE_ROOT/${UPDATE_SYSTEM}.check.md5" MD5_FAILED="1"
fi
fi
StartProgress spinner "Checking ${UPDATE_KERNEL}.md5... " # get sizes
if md5sum -sc "$UPDATE_ROOT/${UPDATE_KERNEL}.check.md5"; then FLASH_FREE=$(df /flash/ | awk '/[0-9]%/{print $4}')
StopProgress "OK" FLASH_FREE=$(( $FLASH_FREE * 1024 ))
else
StopProgress "FAILED"
MD5_FAILED="1"
fi
StartProgress spinner "Checking ${UPDATE_SYSTEM}.md5... " OLD_KERNEL="0"
if md5sum -sc "$UPDATE_ROOT/${UPDATE_SYSTEM}.check.md5"; then if [ ! -b $IMAGE_KERNEL ]; then
StopProgress "OK" OLD_KERNEL=$(stat -t "/flash/$IMAGE_KERNEL" | awk '{print $2}')
else fi
StopProgress "FAILED"
MD5_FAILED="1" OLD_SYSTEM=$(stat -t "/flash/$IMAGE_SYSTEM" | awk '{print $2}')
fi NEW_KERNEL=$(stat -t "$UPDATE_DIR/$UPDATE_KERNEL" | awk '{print $2}')
NEW_SYSTEM=$(stat -t "$UPDATE_DIR/$UPDATE_SYSTEM" | awk '{print $2}')
# old KERNEL+SYSTEM+free space - new KERNEL+SYSTEM must be higher then 5MB
# at least 5MB free after update
TMP_SIZE=$(($OLD_KERNEL+$OLD_SYSTEM+$FLASH_FREE-$NEW_KERNEL-$NEW_SYSTEM))
FLASH_FREE_MIN=$(($FLASH_FREE_MIN*1024*1024))
if [ $TMP_SIZE -ge $FLASH_FREE_MIN ]; then
echo "Checking size: OK"
else
echo "Checking size: FAILED"
SIZE_FAILED="1"
fi
# update if size check is ok
if [ "$SIZE_FAILED" -eq "0" ] ; then
# update if md5 check is ok or .nocheck exists
if [ "$MD5_FAILED" -eq "0" -o "$MD5_NOCHECK" -eq "1" ] ; then
if [ -b $IMAGE_KERNEL ]; then
update_partition "Kernel" "$UPDATE_KERNEL" "$IMAGE_KERNEL"
else
update_file "Kernel" "$UPDATE_KERNEL" "/flash/$IMAGE_KERNEL"
fi
update_file "System" "$UPDATE_SYSTEM" "/flash/$IMAGE_SYSTEM"
update_bootloader
rm -rf $UPDATE_DIR/[0-9a-zA-Z]* &>/dev/null
do_reboot
else
rm -rf $UPDATE_DIR/[0-9a-zA-Z]* &>/dev/null
echo "md5 check failed. normal startup in 30s..."
sync
usleep 30000000
fi fi
else else
echo "Missing ${UPDATE_KERNEL}.md5 or ${UPDATE_SYSTEM}.md5!" rm -rf $UPDATE_DIR/[0-9a-zA-Z]* &>/dev/null
MD5_FAILED="1" echo "size check failed. normal startup in 30s..."
fi sync
usleep 30000000
if [ "$MD5_FAILED" -eq "1" ]; then
echo "md5 check failed!"
do_cleanup
StartProgress countdown "Normal startup in 30s... " 30 "NOW"
return 0
fi fi
fi fi
# get sizes
FLASH_FREE=$(df /flash/ | awk '/[0-9]%/{print $4}')
FLASH_FREE=$(( $FLASH_FREE * 1024 ))
# Disregard kernel size if it's a a block device, which is the case on Amlogic/WeTek devices
if [ ! -b $IMAGE_KERNEL ]; then
OLD_KERNEL=$(stat -t "/flash/$IMAGE_KERNEL" | awk '{print $2}')
else
OLD_KERNEL="0"
fi
OLD_SYSTEM=$(stat -t "/flash/$IMAGE_SYSTEM" | awk '{print $2}')
NEW_KERNEL=$(stat -t "$UPDATE_DIR/$UPDATE_KERNEL" | awk '{print $2}')
NEW_SYSTEM=$(stat -t "$UPDATE_DIR/$UPDATE_SYSTEM" | awk '{print $2}')
# old KERNEL+SYSTEM+free space - new KERNEL+SYSTEM must be higher then 5MB
# at least 5MB free after update
TMP_SIZE=$(($OLD_KERNEL+$OLD_SYSTEM+$FLASH_FREE-$NEW_KERNEL-$NEW_SYSTEM))
FLASH_FREE_MIN=$(($FLASH_FREE_MIN*1024*1024))
if [ $TMP_SIZE -ge $FLASH_FREE_MIN ]; then
echo "Checking size: OK"
else
echo "Checking size: FAILED"
echo ""
echo "Your System (FAT) partition is too small for this update,"
echo "and there is not enough space for the update to be installed!"
echo ""
echo "You must re-install your system using the disk image of a"
echo "current release, or you must re-size your existing partitions"
echo "so that the System (FAT) partition is at least 512MB in size."
echo ""
do_cleanup
StartProgress countdown "Normal startup in 60s... " 60 "NOW"
return 0
fi
# all ok, update
if [ -b $IMAGE_KERNEL ]; then
update_partition "Kernel" "$UPDATE_KERNEL" "$IMAGE_KERNEL"
else
update_file "Kernel" "$UPDATE_KERNEL" "/flash/$IMAGE_KERNEL"
fi
update_file "System" "$UPDATE_SYSTEM" "/flash/$IMAGE_SYSTEM"
update_bootloader
do_cleanup
do_reboot
} }
prepare_sysroot() { prepare_sysroot() {
@ -914,14 +680,17 @@
if [ ! -d "/sysroot/lib/modules/$(uname -r)/" -a -f "/sysroot/usr/lib/systemd/systemd" ]; then if [ ! -d "/sysroot/lib/modules/$(uname -r)/" -a -f "/sysroot/usr/lib/systemd/systemd" ]; then
echo "" echo ""
echo "NEVER TOUCH boot= in extlinux.conf / cmdline.txt!" echo "NEVER TOUCH boot= in extlinux.conf / cmdline.txt"
echo "If you don't know what you are doing," echo "if you dont know what you are doing"
echo "your installation is now broken."
echo "" echo ""
StartProgress countdown "Normal startup in 60s... " 60 "NOW" echo "your installation is now broken"
echo ""
echo "normal boot in 60s..."
usleep 60000000
fi fi
[ -f "/sysroot/usr/lib/systemd/systemd" ] || error "final_check" "Could not find systemd!"
[ -f "/sysroot/usr/lib/systemd/systemd" ] || error "final_check" "Could not find system."
} }
if [ "${boot%%=*}" = "FILE" ]; then if [ "${boot%%=*}" = "FILE" ]; then
@ -961,7 +730,6 @@
/bin/busybox mount --move /dev /sysroot/dev /bin/busybox mount --move /dev /sysroot/dev
/bin/busybox mount --move /proc /sysroot/proc /bin/busybox mount --move /proc /sysroot/proc
/bin/busybox mount --move /sys /sysroot/sys /bin/busybox mount --move /sys /sysroot/sys
/bin/busybox rm -fr /tmp
# tell OE settings addon to disable updates # tell OE settings addon to disable updates
if [ "$UPDATE_DISABLED" = "yes" ] ; then if [ "$UPDATE_DISABLED" = "yes" ] ; then
@ -984,7 +752,6 @@
if [ -f /sysroot/storage/.cache/reset_oe -o -f /sysroot/storage/.cache/reset_xbmc ] ; then if [ -f /sysroot/storage/.cache/reset_oe -o -f /sysroot/storage/.cache/reset_xbmc ] ; then
INIT_UNIT="--unit=factory-reset.target" INIT_UNIT="--unit=factory-reset.target"
fi fi
# switch to new sysroot and start real init # switch to new sysroot and start real init
exec /bin/busybox switch_root /sysroot /usr/lib/systemd/systemd $INIT_ARGS $INIT_UNIT exec /bin/busybox switch_root /sysroot /usr/lib/systemd/systemd $INIT_ARGS $INIT_UNIT