#!/bin/bash
PATH=/bin:/usr/bin:/sbin:/usr/sbin
+WITH_USR_PART=
+
FAKE_ROOT=/run/upgrade-sysroot
+HAL_MNT=hal
-UPI_NO_DELTA_ERROR=fb15
-UPI_NO_UA_ERROR=fa17
+SYNC="/bin/sync"
+REBOOT="/sbin/reboot"
-STATUS_DIR=${FAKE_ROOT}/opt/data/update
-STATUS_FILE=${STATUS_DIR}/RW.STATUS
-DELTA_PATH_FILE=${STATUS_DIR}/DELTA.PATH
-INT_LOG_DIR=${STATUS_DIR}
+INT_LOG_DIR=${FAKE_ROOT}/opt/data/update
INT_LOG_FILE=${INT_LOG_DIR}/fota_internal.log
-FOTA_LOG_DIR=/opt/data/update
-FOTA_RESULT_DIR=${FOTA_LOG_DIR}
-FOTA_TEMP_DIR=${FOTA_LOG_DIR}
-
-PART_TBL_FILE="part_tbl.txt"
-PART_TBL_PATH=${FOTA_TEMP_DIR}/${PART_TBL_FILE}
-
CAT="/bin/cat"
-SYNC="/bin/sync"
-MKDIR="/bin/mkdir"
-REBOOT="/sbin/reboot"
MOUNT="/bin/mount"
-UMOUNT="/bin/umount"
GREP="/bin/grep"
-CUT="/usr/bin/cut"
-TR="/usr/bin/tr"
BLKID="/usr/sbin/blkid"
-SORT="/usr/bin/sort"
-SED="/usr/bin/sed"
-WC="/usr/bin/wc"
-LS="/bin/ls"
-VERITYCTL="/usr/bin/verityctl"
-VERITY_HANDLER="/usr/bin/verity_handler"
-
-DMSETUP="dmsetup"
-FSTRIM="fstrim"
-STAT="stat"
-
-FOTA_GUI="/usr/bin/fota_gui"
-FOTA_GUI_ENABLE=
-
-SYSTEM_DATA_MNT=opt
-USER_MNT=opt/usr
-HAL_MNT=hal
-
-SCRIPT_NAME="fota-init.sh"
-UPGRADE_SUCCESS=0
-P_SLOT=""
-SYSROOT_DIR="sysroot"
-#------------------------------------------------
-# log msg [file]
-#------------------------------------------------
-log() {
- # log format: [script_name][tag]actual_log
- LOG="[${SCRIPT_NAME}]$1"
- if [ "$2" != "" ]; then
- echo "$LOG" >> "$2"
- fi
- echo "$LOG"
-
- return 0
-}
#------------------------------------------------
# do_reboot
#------------------------------------------------
do_reboot() {
- log "Reboot"
+ echo "Reboot"
"$SYNC"
"$REBOOT"
- while true
+ while [ 1 ]
do
sleep 1
echo "."
return 0
}
-mount_bow_partition() {
- LABEL=${1}
- PARTITION=${2}
- DIRECTORY=${3}
- BOWDEV_NAME=bowdev_${LABEL}
- BOWDEV_PATH=/dev/mapper/${BOWDEV_NAME}
- SECTORS=$(</sys/class/block/$(lsblk -no NAME ${PARTITION})/size)
-
- if ! "${DMSETUP}" create "${BOWDEV_NAME}" --table "0 ${SECTORS} bow ${PARTITION}" ; then
- log "[Error] Cannot create ${BOWDEV_NAME}"
- return 1
- fi
-
- if ! "${MOUNT}" "${BOWDEV_PATH}" "${DIRECTORY}" ; then
- log "[Error] Cannot mount ${BOWDEV_PATH} into ${DIRECTORY}"
- return 1
- fi
-
- "${FSTRIM}" -v "${DIRECTORY}"
-
- DM_NUMBER=$(($("${STAT}" -c "0x%T" $(readlink -f "${BOWDEV_PATH}"))))
- echo 1 > /sys/block/dm-${DM_NUMBER}/bow/state
- log "[Debug] Mounted ${PARTITION} as DM-BOW" "${INT_LOG_FILE}"
-
- return 0
-}
-
-mount_f2fs_partition() {
- LABEL=${1}
- PARTITION=${2}
- DIRECTORY=${3}
- if ! "${MOUNT}" -o checkpoint=disable "${PARTITION}" "${DIRECTORY}" ; then
- log "[Error] Cannot mount ${PARTITION} into ${DIRECTORY}"
- return 1
- fi
- log "[Debug] Mounted ${PARTITION} as F2FS checkpoint=disable" "${INT_LOG_FILE}"
-
- return 0
-}
-
-mount_checkpoint_partition() {
- LABEL=${1}
- PARTITION=${2}
- DIRECTORY=${3}
- FSTYPE=$(lsblk -o FSTYPE -n "${PARTITION}")
-
- if [ "${FSTYPE}" = "ext4" ]; then
- if ! mount_bow_partition "${LABEL}" "${PARTITION}" "${DIRECTORY}" ; then
- return 1
- fi
- elif [ "${FSTYPE}" = "f2fs" ]; then
- if ! mount_f2fs_partition "${LABEL}" "${PARTITION}" "${DIRECTORY}" ; then
- return 1
- fi
- else
- "${MOUNT}" "${PARTITION}" "${DIRECTORY}"
- log "[Info] Unsupported filesystem ${FSTYPE} on ${PARTITION}" "${INT_LOG_FILE}"
- fi
-
- return 0
-}
-
-commit_bow_partition()
-{
- LABEL=${1}
-
- BOWDEV_NAME=bowdev_${LABEL}
- BOWDEV_PATH=/dev/mapper/${BOWDEV_NAME}
- DM_NUMBER=$(($("${STAT}" -c "0x%T" $(readlink -f "${BOWDEV_PATH}"))))
- echo 2 > /sys/block/dm-${DM_NUMBER}/bow/state
- log "[Info] Changes on partition ${LABEL} commited (dm-bow)" "${INT_LOG_FILE}"
-
- return 0
-}
-
-commit_f2fs_partition()
-{
- LABEL=${1}
- PART_SYSTEM_DATA=$(blkid --match-token PARTLABEL="${LABEL}" -o device -l || blkid --match-token LABEL="${LABEL}" -o device -l)
- "${MOUNT}" -o remount,checkpoint=enable "${PART_SYSTEM_DATA}"
- log "[Info] Changes on partition ${LABEL} commited (f2fs)" "${INT_LOG_FILE}"
-
- return 0
-}
-
-commit_partition()
-{
- LABEL=${1}
- MNT_POINT=${2}
- TYPE=$(blkid --match-token PARTLABEL="${LABEL}" -o value -s TYPE || blkid --match-token LABEL="${LABEL}" -o value -s TYPE | tail -n 1)
- if [ "${TYPE}" = "ext4" ]; then
- if ! commit_bow_partition "${LABEL}"; then
- return 1
- fi
- elif [ "${TYPE}" = "f2fs" ]; then
- if ! commit_f2fs_partition "${LABEL}"; then
- return 1
- fi
- else
- log "[Info] Cannot commit ${LABEL}: Unsupported filesystem ${TYPE}" "${INT_LOG_FILE}"
- fi
-
- return 0
-}
-
+#------------------------------------------------
+# mount_rootfs
+#------------------------------------------------
mount_rootfs()
{
/usr/bin/verityctl create rootfs "${PART_ROOTFS}" "${FAKE_ROOT}"
return 0
}
-#------------------------------------------------
-# mount_partitions
-#------------------------------------------------
-mount_partitions() {
-
- if [[ "${P_SLOT}" != "" ]]
- then
- # For A/B Update rootfs should be updated before the system boots in fota mode.
- # Therefore rootfs should be mounted as RO.
- # We cannot mount rootfs as RW because mount timestamp would
- # change and dmverity data would become incorrect
- if ! mount_rootfs; then
- return 1
- fi
- else
- if ! mount_checkpoint_partition rootfs "${PART_ROOTFS}" "${FAKE_ROOT}"; then
- return 1
- fi
- fi
-
- if ! mount_checkpoint_partition system-data "${PART_SYSTEM_DATA}" "${FAKE_ROOT}/${SYSTEM_DATA_MNT}"; then
- return 1
- fi
-
- if [ ! "z${PART_USER}" = "z" ]; then
- if ! mount_checkpoint_partition user "${PART_USER}" "${FAKE_ROOT}/${USER_MNT}"; then
- return 1
- fi
- fi
- if [ ! "z${PART_HAL}" = "z" ]; then
- if [ "${P_SUFFIX}" == "" ]; then
- if ! mount_checkpoint_partition hal "${PART_HAL}" "${FAKE_ROOT}/${HAL_MNT}"; then
- return 1
- fi
- else
- if ! "$MOUNT" -o ro "${PART_HAL}" "${FAKE_ROOT}/${HAL_MNT}"; then
- return 1
- fi
- fi
- fi
-
- "$MOUNT" -t proc none "${FAKE_ROOT}/proc" &&
- "$MOUNT" -t sysfs none "${FAKE_ROOT}/sys" &&
- "$MOUNT" -t devtmpfs devtmpfs "${FAKE_ROOT}/dev" &&
- "$MOUNT" -t devpts devpts "${FAKE_ROOT}/dev/pts"
-
- if [ $? -ne 0 ]; then
- return 1
- fi
-
- return 0
-}
-
-umount_bow_partition()
-{
- LABEL=${1}
- PART=${2}
-
- if ! "$UMOUNT" "${PART}"; then
- return 1
- fi
-
- BOWDEV_NAME=bowdev_${LABEL}
- if ! "${DMSETUP}" remove ${BOWDEV_NAME}; then
- return 1
- fi
-
- return 0
-}
-
-umount_partition()
-{
- LABEL=${1}
- DIRECTORY=${2}
-
- TYPE=$(blkid --match-token PARTLABEL="${LABEL}" -o value -s TYPE || blkid --match-token LABEL="${LABEL}" -o value -s TYPE | tail -n 1)
- if [ "${TYPE}" = "ext4" ]; then
- if ! umount_bow_partition "${LABEL}" "${DIRECTORY}"; then
- return 1
- fi
- else
- if ! "$UMOUNT" "${DIRECTORY}"; then
- return 1
- fi
- fi
-
- return 0
-}
#------------------------------------------------
-# umount_partitions
+# mount_hal
#------------------------------------------------
-umount_partitions() {
-
- "$UMOUNT" "${FAKE_ROOT}/dev/pts"
- "$UMOUNT" "${FAKE_ROOT}/dev"
- "$UMOUNT" "${FAKE_ROOT}/sys"
- "$UMOUNT" "${FAKE_ROOT}/proc"
-
- if [ "${P_SUFFIX}" == "" ]; then
- if [ ! "z${PART_HAL}" = "z" ]; then
- if [ "${UPGRADE_SUCCESS}" = "1" ]; then
- if ! commit_partition hal "${FAKE_ROOT}/${HAL_MNT}"; then
- return 1
- fi
- fi
- if ! umount_partition hal "${FAKE_ROOT}/${HAL_MNT}"; then
- return 1
- fi
- fi
- else
- if ! "$UMOUNT" "${FAKE_ROOT}/${HAL_MNT}"; then
- return 1
- fi
- fi
-
- if [ ! "z${PART_USER}" = "z" ]; then
- if [ "${UPGRADE_SUCCESS}" = "1" ]; then
- if ! commit_partition user "${FAKE_ROOT}/${USER_MNT}"; then
- return 1
- fi
- fi
- if ! umount_partition user "${FAKE_ROOT}/${USER_MNT}"; then
- return 1
- fi
- fi
-
- if [ "${UPGRADE_SUCCESS}" = "1" ]; then
- if ! commit_partition system-data "${FAKE_ROOT}/${SYSTEM_DATA_MNT}"; then
- return 1
- fi
- fi
- if ! umount_partition system-data "${FAKE_ROOT}/${SYSTEM_DATA_MNT}"; then
- return 1
- fi
-
- if [[ "${P_SLOT}" != "" ]]
- then
- if ! "$UMOUNT" "${FAKE_ROOT}"; then
- return 1
- fi
- else
- if [ "${UPGRADE_SUCCESS}" = "1" ]; then
- if ! commit_partition rootfs "${FAKE_ROOT}"; then
- return 1
- fi
- fi
- if ! umount_partition rootfs "${FAKE_ROOT}"; then
- return 1
- fi
- fi
-
- # close dm-verity
- if ! /usr/bin/verityctl close rootfs; then
- return 1
- fi
-
- return 0
-}
-
-#------------------------------------------------
-# handle_no_delta
-#------------------------------------------------
-handle_no_delta() {
- log "[Error] delta does not exist ..." "${INT_LOG_FILE}"
- echo "${UPI_NO_DELTA_ERROR}" > "${RESULT_FILE}"
-
- return 0
-}
-
-#------------------------------------------------
-# handle_no_ua
-#------------------------------------------------
-handle_no_ua() {
- log "[Error] ua does not exist ..." "${INT_LOG_FILE}"
- echo "${UPI_NO_UA_ERROR}" > "${RESULT_FILE}"
-
- return 0
-}
-
-#------------------------------------------------
-# do_create_part_table
-#------------------------------------------------
-do_create_part_table() {
-
- EMMC_DEVICE="/dev/mmcblk0"
- PART_LIST=$("$BLKID" -o full | "$GREP" "${EMMC_DEVICE}p" |
- "$SED" -e 's/\/dev\/mmcblk0p//g' -e 's/\ .*LABEL=\"\(.*\).*$/\1/' |
- "$CUT" -d '"' -f 1 | "$SED" 's/\:/\ /' |
- "$TR" '[:upper:]' '[:lower:]' |
- "$SORT" -k 1 -n)
- PART_NUM=$(echo "$PART_LIST" | "$WC" -l)
-
- echo "$PART_NUM" > "${PART_TBL_PATH}"
- echo "$PART_LIST" >> "${PART_TBL_PATH}"
- "$SYNC"
-
- return 0
-}
-
-#------------------------------------------------
-# do_fota_update
-#------------------------------------------------
-do_fota_update() {
- log "[Info] fota update start ..." "${INT_LOG_FILE}"
-
- DELTA_DIR=$("$CAT" "${DELTA_PATH_FILE}")
- log "[Info] DELTA_DIR = ${DELTA_DIR}" "${INT_LOG_FILE}"
-
- RESULT_FILE=${FAKE_ROOT}${FOTA_RESULT_DIR}/result
- if [ -e "${RESULT_FILE}" ]; then
- rm -fr "${RESULT_FILE}"
- fi
-
- UA=${DELTA_DIR}/delta.ua
- if [ ! -s "${UA}" ]; then
- handle_no_ua
- return 1
- fi
-
- /bin/chmod +x "${UA}"
-
- DELTA=${DELTA_DIR}/delta.tar
- if [ ! -s "${DELTA}" ]; then
- handle_no_delta
- return 1
- fi
-
- do_create_part_table
- if [ ! -e "${PART_TBL_PATH}" ]; then
- log "[Error] No partition table" "${INT_LOG_FILE}"
- return 1
- fi
-
- VERIFY_TOOL=/usr/sbin/img-verifier
- if [ -e "${VERIFY_TOOL}" ]; then
- if ! "${VERIFY_TOOL}" -i "${DELTA}" -l "/opt/var/log/last_iv.log"; then
- log "[Error] signature verification failed!" "${INT_LOG_FILE}"
- return 1
- else
- log "[Info] update package verification success"
- fi
- else
- log "[Error] Warning: No signature verifier... Skip it" "${INT_LOG_FILE}"
- fi
-
- FOTA_ARG="1"
- if [ "$FOTA_GUI_ENABLE" = "1" ]; then
- FOTA_ARG="0"
- fi
- if ! "${UA}" "${DELTA_DIR}" "${FOTA_TEMP_DIR}" "$FOTA_ARG"; then
- log "[Error] update agent fail!!!" "${INT_LOG_FILE}"
- return 1
- else
- log "[Info] update agent success"
- return 0
- fi
-
-}
-
-#------------------------------------------------
-# clear_internal_log
-#------------------------------------------------
-clear_internal_log() {
-
- if [ -e "${INT_LOG_FILE}" ]; then
- /bin/rm -fr "${INT_LOG_FILE}"
- fi
-
- return 0
-}
-
-
-#------------------------------------------------
-# init_fota_dir
-#------------------------------------------------
-init_fota_dir() {
-
- TEST_DIRS=("${FAKE_ROOT}${FOTA_LOG_DIR}" "${FAKE_ROOT}${FOTA_RESULT_DIR}" "${FAKE_ROOT}${FOTA_TEMP_DIR}")
- for TEST_DIR in "${TEST_DIRS[@]}"; do
- if [ ! -e "${TEST_DIR}" ]; then
- if "$MKDIR" -p "${TEST_DIR}"; then
- log "[Info] Successfully created <${TEST_DIR}>" "${INT_LOG_FILE}"
- else
- log "[Error] Unable to create <${TEST_DIR}>"
- fi
- fi
- done
-
- return 0
-}
-
-#------------------------------------------------
-# check_for_rw_power_fail
-#------------------------------------------------
-check_for_rw_power_fail() {
- # Case : Power fail during RW update after RO update
- if [ -r "${STATUS_FILE}" ]; then
- log "[Info] ${STATUS_FILE} exists" "${INT_LOG_FILE}"
- log "[Info] Status file: $("$CAT" "${STATUS_FILE}")" "${INT_LOG_FILE}"
- UPGRADE_SUCCESS=1
- "$SYNC"
- umount_partitions
- exec /sbin/fus_rw-init
- fi
-
- return 1
-}
+mount_hal() {
+ if [ "z${PART_HAL}" = "z" ]; then
+ # No hal partition
+ return 2
+ fi
-#------------------------------------------------
-# check_for_fota_gui
-#------------------------------------------------
-check_for_fota_gui() {
- if [ -r "${FOTA_GUI}" ]; then
- log "[Info] GUI Enabled" "${INT_LOG_FILE}"
- FOTA_GUI_ENABLE=1
- fi
+ if ! "$MOUNT" -o ro "${PART_HAL}" "${FAKE_ROOT}/${HAL_MNT}"; then
+ return 1
+ fi
- return 0
+ return 0
}
#------------------------------------------------
-# check_debug_mode
+# mount_partitions
#------------------------------------------------
-check_debug_mode() {
- DEBUG_MODE_FILE=${FAKE_ROOT}/opt/usr/.upgdebug_ro
- if [ -f "${DEBUG_MODE_FILE}" ]; then
- DEBUG_MODE_FILE_OWNER=$("${LS}" -l "${DEBUG_MODE_FILE}" | "${CUT}" -d " " -f 3)
- if [ "${DEBUG_MODE_FILE_OWNER}" = "0" ]; then
- log "[Info] Enter RO debug mode"
- log "[Info] If you want to continue FOTA, please remove ${DEBUG_MODE_FILE}"
- # Wait until debug mode file is removed
- while [ -f "${DEBUG_MODE_FILE}" ]; do
- sleep 3
- done
- log "[Info] Debug mode file is removed. Resume FOTA"
- else
- log "[Info] Warning: somebody made non-root debug mode file... ignore it"
- fi
- fi
+mount_partitions() {
+ get_partition_id &&
+ mount_rootfs &&
+ mount_hal &&
+ "$MOUNT" -t proc none ${FAKE_ROOT}/proc &&
+ "$MOUNT" -t sysfs none ${FAKE_ROOT}/sys &&
+ "$MOUNT" -t devtmpfs devtmpfs ${FAKE_ROOT}/dev &&
+ "$MOUNT" -t devpts devpts ${FAKE_ROOT}/dev/pts &&
+ "$MOUNT" -t tmpfs tmpfs ${FAKE_ROOT}/tmp
+
+ if [ $? -ne 0 ]; then
+ return 1
+ fi
- return 0
+ return 0
}
#------------------------------------------------
-# remake_hash_table
+# do_rw_update
#------------------------------------------------
-remake_hash_table() {
- if [ -f "${VERITYCTL}" ]; then
- if [ -f "${VERITY_HANDLER}" ]; then
- "$MOUNT" -o remount,ro "${FAKE_ROOT}"
+do_rw_update() {
+ echo "Change into rw update mode" >> ${INT_LOG_FILE}
- if ! "${VERITY_HANDLER}" "${PART_ROOTFS}"; then
- log "[Error] verity-handler fail!!!"
- return 1
- else
- log "[Info] verity-handler success"
- return 0
- fi
- else
- log "[Error] Warning: ${VERITYCTL} exists but ${VERITY_HANDLER} does not exists"
- return 2
- fi
- else
- log "[Info] verityctl does not exist. Skip hash remaking"
- return 0
+ /sbin/progress_restart RW &
+ # Go to system-update.target
+ if [ $$ = 1 ]; then
+ cd ${FAKE_ROOT}
+ exec /bin/chroot . /usr/lib/systemd/systemd --unit=system-update.target $@
fi
+ do_reboot
}
-
-#------------------------------------------------
-# mark_rw_update
-#------------------------------------------------
-mark_rw_update() {
- echo "start" > ${STATUS_FILE}
- return 0
-}
-
-#------------------------------------------------
-# jump_to_ramdisk
-#------------------------------------------------
-jump_to_ramdisk() {
- "${MOUNT}" "${PART_RAMDISK}" "${FAKE_ROOT}"
- cd "${FAKE_ROOT}"
- mkdir -p "${SYSROOT_DIR}"
- ./sbin/pivot_root . ./${SYSROOT_DIR}
- ./bin/mount -M ./${SYSROOT_DIR}/dev /dev
- ./bin/mount -M ./${SYSROOT_DIR}/sys /sys
- ./bin/mount -M ./${SYSROOT_DIR}/proc /proc
- ./bin/umount -l ./${SYSROOT_DIR}
- ./bin/umount -l /dev
- ./bin/umount -l /sys
- ./bin/umount -l /proc
- exec chroot . /sbin/init
- # WARNING! never rearch
- log "[Error] jump_to_ramdisk() failed"
- exec /bin/sh
-}
-
#------------------------------------------------
# prepare_fakeroot
#------------------------------------------------
return 0
}
-#------------------------------------------------
-# log boot info
-#------------------------------------------------
-function log_boot_info() {
- CMDLINE_ROOT=$([[ $(</proc/cmdline) =~ (root=[^ ]*) ]]; echo ${BASH_REMATCH[1]})
- CMDLINE_PARTITION_AB=$([[ $(</proc/cmdline) =~ (partition_ab=[ab]) ]]; echo ${BASH_REMATCH[1]})
- CMDLINE_BOOTMODE=$([[ $(</proc/cmdline) =~ (bootmode=[^ ]*) ]]; echo ${BASH_REMATCH[1]})
- log "[Info] Initrd-fota booting (/proc/cmdline $CMDLINE_BOOTMODE $CMDLINE_PARTITION_AB $CMDLINE_ROOT)"
- return 0
-}
-
#------------------------------------------------
# Main Routine Start
#------------------------------------------------
-
-get_partition_id
-
-if [ "${P_SLOT}" != "" ]
-then
- log "[Info] FOTA with A/B detected - skip RO update"
- exec /sbin/fus_rw-init
-fi
-
prepare_fakeroot
+mount_partitions
-if ! mount_partitions ; then
- umount_partitions
- log "[Error] Upgrade failed"
- do_reboot
-fi
-
-log_boot_info
-
-# For debugging - It should be deleted on Release
-/sbin/agetty -l /bin/bash -n --keep-baud 115200,38400,9600 console linux &
-
-check_debug_mode
+echo "rw update mode start ..." >> ${INT_LOG_FILE}
+"$SYNC"
-clear_internal_log
+do_rw_update
-check_for_rw_power_fail
-
-"$MOUNT" -o remount,rw "${FAKE_ROOT}"
-init_fota_dir
-
-check_for_fota_gui
-if [ "$FOTA_GUI_ENABLE" = "1" ]; then
- export XDG_RUNTIME_DIR=/run
- export TBM_DISPLAY_SERVER=1
-
- /usr/bin/fota_gui &
- /usr/bin/sleep 2
-fi
-/sbin/progress_restart RO &
-do_fota_update
-fota_result=$?
-if [ "$fota_result" = "0" ]; then
- /bin/rm -fr "${DELTA_DIR:?}"/*
-fi
-
-remake_hash_table
-remake_result=$?
-
-RO_PROGRESS_FILE=/tmp/upgrade/ro_progress
-if [ -f "${RO_PROGRESS_FILE}" ]; then
- echo -1 > "${RO_PROGRESS_FILE}"
-fi
-
-if [ "$fota_result" = "0" ] && [ "$remake_result" = "0" ]; then
- UPGRADE_SUCCESS=1
- mark_rw_update
- umount_partitions
- exec /sbin/fus_rw-init
-else
- umount_partitions
- log "[Error] Upgrade FAILED"
- do_reboot
-fi
+++ /dev/null
-#!/bin/bash
-PATH=/bin:/usr/bin:/sbin:/usr/sbin
-
-WITH_USR_PART=
-
-FAKE_ROOT=/run/upgrade-sysroot
-HAL_MNT=hal
-
-SYNC="/bin/sync"
-REBOOT="/sbin/reboot"
-
-INT_LOG_DIR=${FAKE_ROOT}/opt/data/update
-INT_LOG_FILE=${INT_LOG_DIR}/fota_internal.log
-
-CAT="/bin/cat"
-MOUNT="/bin/mount"
-GREP="/bin/grep"
-BLKID="/usr/sbin/blkid"
-
-#------------------------------------------------
-# do_reboot
-#------------------------------------------------
-do_reboot() {
- echo "Reboot"
- "$SYNC"
- "$REBOOT"
- while [ 1 ]
- do
- sleep 1
- echo "."
- done
-}
-
-#------------------------------------------------
-# get partition id
-#------------------------------------------------
-get_partition_id() {
- P_SLOT=$([[ $(</proc/cmdline) =~ partition_ab=([ab]) ]]; echo ${BASH_REMATCH[1]})
- P_SUFFIX=""
-
- if [ "${P_SLOT}" != "" ]; then
- P_SUFFIX="_${P_SLOT}"
- echo "Using A/B slot: ${P_SLOT}"
- fi
-
- PART_ROOTFS=`/sbin/blkid -t PARTLABEL=rootfs${P_SUFFIX} -o device -l`
- if [ x$PART_ROOTFS = "x" ]
- then
- PART_ROOTFS=`/sbin/blkid -L rootfs`
- fi
-
- PART_SYSTEM_DATA=`/sbin/blkid -t PARTLABEL=system-data -o device -l`
- if [ x$PART_SYSTEM_DATA = "x" ]
- then
- PART_SYSTEM_DATA=`/sbin/blkid -L system-data`
- fi
-
- PART_RAMDISK=`/sbin/blkid -t PARTLABEL=ramdisk${P_SUFFIX} -o device -l`
- if [ x$PART_RAMDISK = "x" ]
- then
- PART_RAMDISK=`/sbin/blkid -L ramdisk`
- fi
-
- PART_HAL=`/sbin/blkid -t PARTLABEL=hal${P_SUFFIX} -o device -l`
- if [ x$PART_HAL = "x" ]
- then
- PART_HAL=`/sbin/blkid -L hal`
- fi
-
- PART_USER=$("$BLKID" --match-token PARTLABEL=user -o device -l || "$BLKID" --match-token LABEL=user -o device -l)
-
- return 0
-}
-
-#------------------------------------------------
-# mount_rootfs
-#------------------------------------------------
-mount_rootfs()
-{
- /usr/bin/verityctl create rootfs "${PART_ROOTFS}" "${FAKE_ROOT}"
- case $? in
- 0)
- echo "verifyboot: disabled"
- # do nothing
- ;;
- 1)
- echo "verityboot: enabled";
- return
- ;;
- 2)
- echo "verifyboot: enabled but corrupted"
- # reboot
- do_reboot
- ;;
- 3)
- echo "verifyboot: disabling"
- ;;
- esac
-
- if ! "$MOUNT" -o ro "${PART_ROOTFS}" "${FAKE_ROOT}"; then
- return 1
- fi
-
- return 0
-}
-
-
-#------------------------------------------------
-# mount_hal
-#------------------------------------------------
-mount_hal() {
- if [ "z${PART_HAL}" = "z" ]; then
- # No hal partition
- return 2
- fi
-
- if ! "$MOUNT" -o ro "${PART_HAL}" "${FAKE_ROOT}/${HAL_MNT}"; then
- return 1
- fi
-
- return 0
-}
-
-#------------------------------------------------
-# mount_partitions
-#------------------------------------------------
-mount_partitions() {
- get_partition_id &&
- mount_rootfs &&
- mount_hal &&
- "$MOUNT" -t proc none ${FAKE_ROOT}/proc &&
- "$MOUNT" -t sysfs none ${FAKE_ROOT}/sys &&
- "$MOUNT" -t devtmpfs devtmpfs ${FAKE_ROOT}/dev &&
- "$MOUNT" -t devpts devpts ${FAKE_ROOT}/dev/pts &&
- "$MOUNT" -t tmpfs tmpfs ${FAKE_ROOT}/tmp
-
- if [ $? -ne 0 ]; then
- return 1
- fi
-
- return 0
-}
-
-#------------------------------------------------
-# do_rw_update
-#------------------------------------------------
-do_rw_update() {
- echo "Change into rw update mode" >> ${INT_LOG_FILE}
-
- /sbin/progress_restart RW &
- # Go to system-update.target
- if [ $$ = 1 ]; then
- cd ${FAKE_ROOT}
- exec /bin/chroot . /usr/lib/systemd/systemd --unit=system-update.target $@
- fi
- do_reboot
-}
-#------------------------------------------------
-# prepare_fakeroot
-#------------------------------------------------
-prepare_fakeroot() {
- mkdir -p ${FAKE_ROOT}
- return 0
-}
-
-#------------------------------------------------
-# Main Routine Start
-#------------------------------------------------
-prepare_fakeroot
-mount_partitions
-
-echo "rw update mode start ..." >> ${INT_LOG_FILE}
-"$SYNC"
-
-do_rw_update
-