mkdir -p %{buildroot}%{init_script_dir}
cp ./scripts/fota-init.sh %{buildroot}%{init_script_dir}/fota-init.sh
cp ./scripts/fus_rw-init.sh %{buildroot}%{init_script_dir}/fus_rw-init.sh
+cp ./scripts/progress_restart.sh %{buildroot}%{init_script_dir}/progress_restart.sh
mkdir -p %{buildroot}%{_datadir}/initrd-recovery/initrd.list.d
cp ./scripts/40-fota.list %{buildroot}%{_datadir}/initrd-recovery/initrd.list.d
+%post
+chsmack -e "System::Privileged" %{buildroot}%{init_script_dir}/progress_restart.sh
+
%files
%manifest initrd-fota.manifest
%license LICENSE
MVWITHLIBS="
@INITRD_FOTA_LIB_DIR@/initrd-recovery/fota/fota-init.sh
@INITRD_FOTA_LIB_DIR@/initrd-recovery/fota/fus_rw-init.sh
+@INITRD_FOTA_LIB_DIR@/initrd-recovery/fota/progress_restart.sh
@INITRD_FOTA_LIB_DIR@/initrd-recovery/minireboot
"
/bin/sh:bash
/sbin/fota-init:@INITRD_FOTA_LIB_DIR@/initrd-recovery/fota/fota-init.sh
/sbin/fus_rw-init:@INITRD_FOTA_LIB_DIR@/initrd-recovery/fota/fus_rw-init.sh
+/sbin/progress_restart:@INITRD_FOTA_LIB_DIR@/initrd-recovery/fota/progress_restart.sh
"
--- /dev/null
+#!/bin/bash
+set -x
+
+PATH="/usr/bin:/bin:/usr/sbin:/sbin"
+MODE=${1}
+
+SCRIPT_NAME="progress_restart.sh"
+LAST_LOG="__NONE__"
+SAME_LOG_IT="0"
+#------------------------------------------------
+# log msg [file]
+#------------------------------------------------
+function log {
+ # log format: [script_name][tag]actual_log
+ LOG="[${SCRIPT_NAME}]$1"
+ if [ "$LOG" == "$LAST_LOG" ]; then
+ SAME_LOG_IT=$((SAME_LOG_IT + 1))
+ if (( $SAME_LOG_IT > 10 )); then
+ return
+ fi
+ else
+ SAME_LOG_IT=0
+ fi
+ LAST_LOG="$LOG"
+ if [ "$2" != "" ]; then
+ echo "$LOG" >> "$2"
+ fi
+ echo "$LOG"
+}
+
+function info {
+ log "[INFO] ${1}"
+}
+
+function error {
+ log "[ERROR] ${1}"
+}
+
+
+info "[RESTART_TEST] Start"
+
+
+function init_ro {
+ info "[RESTART_TEST] Init RO restart test"
+ INIT_PROGRES=10
+ MAX_PROGRESS=100
+ EPSILON=10
+ RESTART_PROGRESS_FILE="/mnt/inform/restart-progress-ro"
+ PROGRESS_FILE="/tmp/upgrade/ro_progress"
+ DELAY=2
+}
+
+function init_rw {
+ info "[RESTART_TEST] Init RW restart test"
+ INIT_PROGRES=2
+ EPSILON=2
+ RESTART_PROGRESS_FILE="/mnt/inform/restart-progress-rw"
+ FAKE_ROOT=/system
+ PROGRESS_FILE="${FAKE_ROOT}/tmp/upgrade/progress"
+ DELAY=0.1
+}
+
+function cleanup {
+ info "[RESTART_TEST] Cleanup"
+ rm -rf "${RESTART_PROGRESS_FILE}"
+}
+
+function init_progress_file {
+ echo ${INIT_PROGRES} > "${RESTART_PROGRESS_FILE}"
+}
+
+function update_progress {
+ RESTART_PROGRESS=$(cat "${RESTART_PROGRESS_FILE}")
+ PROGRESS=$(cat "${PROGRESS_FILE}")
+ if [[ "${MODE}" == "RW" ]]; then
+ MAX_PROGRESS=$(cat "${FAKE_ROOT}/tmp/upgrade/total")
+ fi
+}
+
+
+if [[ "${MODE}" == "RO" ]]; then
+ init_ro
+elif [[ "${MODE}" == "RW" ]]; then
+ init_rw
+else
+ error "[RESTART_TEST] Invalid mode: ${MODE}"
+ exit
+fi
+
+if [ ! -f "${RESTART_PROGRESS_FILE}" ]; then
+ exit
+else
+ RESTART_PROGRESS=$(cat "${RESTART_PROGRESS_FILE}")
+ if [[ "${RESTART_PROGRESS}" == "INIT" ]]; then
+ init_progress_file
+ fi
+fi
+
+while true; do
+ if [ -f "${PROGRESS_FILE}" ]; then
+ update_progress
+
+ info "[RESTART_TEST] Current: ${PROGRESS} Next restart: ${RESTART_PROGRESS}"
+ if (( PROGRESS < 0 )); then
+ info "[RESTART_TEST] End"
+ cleanup
+ exit
+ fi
+ if (( PROGRESS > RESTART_PROGRESS )); then
+ if (( PROGRESS + EPSILON >= MAX_PROGRESS )); then
+ cleanup
+ else
+ echo $((PROGRESS + EPSILON)) > "${RESTART_PROGRESS_FILE}"
+ fi
+ info "[RESTART_TEST] Restarting"
+ reboot -f fota
+ fi
+ else
+ error "[RESTART_TEST] No ${PROGRESS_FILE} :("
+ fi
+ sleep ${DELAY}
+done