--- /dev/null
+Name: initrd-fota
+Summary: package for building ramdisk-recovery.img
+Version: 0.1.0
+Release: 1
+Group: System/Utilities
+License: Apache-2.0
+Source0: %{name}-%{version}.tar.gz
+ExclusiveArch: %{arm}
+BuildRequires: cmake
+BuildRequires: gettext-tools
+
+Requires: util-linux
+Requires: grep
+Requires: bash
+Requires: gawk
+Requires: procps
+Requires: dbus-libs
+
+%description
+package for building partition image for RAMDISK2 (ramdisk-recovery.img)
+
+
+%prep
+%setup -q
+
+%build
+
+
+%install
+
+%define init_script_dir %{_libdir}/initrd-recovery/fota
+
+mkdir -p %{buildroot}/opt/data/recovery
+mkdir -p %{buildroot}/opt/usr/data/recovery
+
+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}/
+
+mkdir -p %{buildroot}%{_datadir}/initrd-recovery/initrd.list.d
+cp ./scripts/40-fota.list %{buildroot}%{_datadir}/initrd-recovery/initrd.list.d
+
+%files
+%manifest initrd-fota.manifest
+%attr(700,root,root) %{_libdir}/initrd-recovery/fota/*.sh
+%attr(700,root,root) %{_datadir}/initrd-recovery/initrd.list.d/*.list
+%attr(777,system,system) /opt/data/recovery
+%attr(777,system,system) /opt/usr/data/recovery
--- /dev/null
+#!/bin/bash
+
+MODULE_MOUNT_FLAG=@MODULE_MOUNT_FLAG@
+
+
+FAKE_ROOT=/system
+
+UPI_NO_DELTA_ERROR=fdfa
+UPI_NO_UA_ERROR=fdfb
+PRE_UPDATE_ERROR=fdfc
+
+STATUS_DIR=${FAKE_ROOT}/opt/data/recovery
+STATUS_FILE=${STATUS_DIR}/RW.STATUS
+DELTA_PATH_FILE=${STATUS_DIR}/DELTA.PATH
+INT_LOG_DIR=${STATUS_DIR}
+INT_LOG_FILE=${INT_LOG_DIR}/fota_internal.log
+
+FOTA_LOG_DIR=/opt/data/fota
+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"
+AWK="/usr/bin/awk"
+PARTX="/usr/sbin/partx"
+
+SYSTEM_DATA_MNT=opt
+USER_MNT=opt/usr
+
+#------------------------------------------------
+# get partition id
+#------------------------------------------------
+get_partition_id() {
+ EMMC_DEVICE="/dev/mmcblk0"
+ RET_PARTX=$("$PARTX" -s ${EMMC_DEVICE})
+ PART_ROOTFS=${EMMC_DEVICE}p$(IFS=; echo $RET_PARTX | "$AWK" 'tolower($6) == "rootfs" {print $1}')
+ PART_SYSTEM_DATA=${EMMC_DEVICE}p$(IFS=; echo $RET_PARTX | "$AWK" 'tolower($6) == "system-data" {print $1}')
+ PART_USER=${EMMC_DEVICE}p$(IFS=; echo $RET_PARTX | "$AWK" 'tolower($6) == "user" {print $1}')
+ PART_MODULES=${EMMC_DEVICE}p$(IFS=; echo $RET_PARTX | "$AWK" 'tolower($6) == "module" {print $1}')
+}
+
+#------------------------------------------------
+# mount_partitions
+#------------------------------------------------
+mount_partitions() {
+ get_partition_id
+
+ "$MOUNT" -t ext4 -o ro ${PART_ROOTFS} ${FAKE_ROOT}
+ "$MOUNT" -t ext4 ${PART_SYSTEM_DATA} ${FAKE_ROOT}/${SYSTEM_DATA_MNT}
+ "$MOUNT" -t ext4 ${PART_USER} ${FAKE_ROOT}/${USER_MNT}
+ if [ "${MODULE_MOUNT_FLAG}" = "ON" ]; then
+ "$MOUNT" -t ext4 ${PART_MODULES} ${FAKE_ROOT}/lib/modules
+ 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
+}
+
+#------------------------------------------------
+# umount_partitions
+#------------------------------------------------
+umount_partitions() {
+
+ "$UMOUNT" ${FAKE_ROOT}/dev/pts
+ "$UMOUNT" ${FAKE_ROOT}/dev
+ "$UMOUNT" ${FAKE_ROOT}/sys
+ "$UMOUNT" ${FAKE_ROOT}/proc
+
+ if [ "${MODULE_MOUNT_FLAG}" = "ON" ]; then
+ "$UMOUNT" ${FAKE_ROOT}/lib/modules
+ fi
+ "$UMOUNT" ${FAKE_ROOT}/${USER_MNT}
+ "$UMOUNT" ${FAKE_ROOT}/${SYSTEM_DATA_MNT}
+ "$UMOUNT" ${FAKE_ROOT}
+}
+
+#------------------------------------------------
+# handle_no_delta
+#------------------------------------------------
+handle_no_delta() {
+ echo "delta does not exist ..." >> ${INT_LOG_FILE}
+
+ echo "${UPI_NO_DELTA_ERROR}" > ${RESULT_FILE}
+}
+
+#------------------------------------------------
+# handle_no_ua
+#------------------------------------------------
+handle_no_ua() {
+ echo "ua does not exist ..." >> ${INT_LOG_FILE}
+
+ echo "${UPI_NO_UA_ERROR}" > ${RESULT_FILE}
+}
+
+#------------------------------------------------
+# do_create_part_table
+#------------------------------------------------
+do_create_part_table() {
+
+ EMMC_DEVICE="/dev/mmcblk0"
+ RET_PARTX=$("$PARTX" -s ${EMMC_DEVICE} | "$AWK" 'NR>1' | "$AWK" '{print $1 " " toupper($6)}')
+ PART_NUM=$(echo "$RET_PARTX" | "$AWK" 'END{print FNR}')
+
+ echo "$PART_NUM" > ${PART_TBL_PATH}
+ echo "$RET_PARTX" >> ${PART_TBL_PATH}
+ "$SYNC"
+}
+
+#------------------------------------------------
+# do_fota_update
+#------------------------------------------------
+do_fota_update() {
+ echo "fota update start ..." >> ${INT_LOG_FILE}
+
+ DELTA_DIR=`cat ${DELTA_PATH_FILE}`
+ echo "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
+ echo "No partition table" >> ${INT_LOG_FILE}
+ return 1
+ fi
+
+ ${UA} ${DELTA_DIR} ${FOTA_TEMP_DIR} 0
+ if [ $? -ne 0 ]; then
+ echo "update agent fail!!!" >> ${INT_LOG_FILE}
+ return 1
+ else
+ echo "update agent success"
+ return 0
+ fi
+
+}
+
+#------------------------------------------------
+# init_internal_log
+#------------------------------------------------
+init_internal_log() {
+
+ if [ -e "${INT_LOG_FILE}" ]; then
+ /bin/rm -fr ${INT_LOG_FILE}
+ fi
+}
+
+
+#------------------------------------------------
+# init_fota_dir
+#------------------------------------------------
+init_fota_dir() {
+
+ TEST_DIR=${FAKE_ROOT}${FOTA_LOG_DIR}
+ if [ ! -e ${TEST_DIR} ]; then
+ "$MKDIR" -p ${TEST_DIR}
+ if [ "$?" = "0" ]; then
+ echo "success to create ${TEST_DIR}" >> ${INT_LOG_FILE}
+ fi
+ fi
+
+ TEST_DIR=${FAKE_ROOT}${FOTA_RESULT_DIR}
+ if [ ! -e ${TEST_DIR} ]; then
+ "$MKDIR" -p ${TEST_DIR}
+ if [ "$?" = "0" ]; then
+ echo "success to create ${TEST_DIR}" >> ${INT_LOG_FILE}
+ fi
+ fi
+
+ TEST_DIR=${FAKE_ROOT}${FOTA_TEMP_DIR}
+ if [ ! -e ${TEST_DIR} ]; then
+ "$MKDIR" -p ${TEST_DIR}
+ if [ "$?" = "0" ]; then
+ echo "success to create ${TEST_DIR}" >> ${INT_LOG_FILE}
+ fi
+ fi
+
+}
+
+#------------------------------------------------
+# do_reboot
+#------------------------------------------------
+do_reboot() {
+ echo "Reboot"
+ "$SYNC"
+ "$REBOOT"
+ while [ 1 ]
+ do
+ sleep 1
+ echo "."
+ done
+}
+
+#------------------------------------------------
+# check_for_rw_power_fail
+#------------------------------------------------
+check_for_rw_power_fail() {
+ # Case : Power fail during RW update after RO update
+ if [ -r ${STATUS_FILE} ]; then
+ echo "${STATUS_FILE} exists" >> ${INT_LOG_FILE}
+ /bin/cat ${STATUS_FILE} >> ${INT_LOG_FILE}
+ "$SYNC"
+ umount_partitions
+ exec /sbin/fus_rw-init
+ fi
+}
+
+#------------------------------------------------
+# Main Routine Start
+#------------------------------------------------
+
+mount_partitions
+
+init_internal_log
+
+check_for_rw_power_fail
+
+"$MOUNT" -o remount,rw ${FAKE_ROOT}
+init_fota_dir
+
+do_fota_update
+fota_result=$?
+umount_partitions
+if [ "$fota_result" = "0" ]; then
+ exec /sbin/fus_rw-init
+else
+ do_reboot
+fi
--- /dev/null
+#!/bin/bash
+
+FAKE_ROOT=/system
+
+SYNC="/bin/sync"
+REBOOT="/sbin/reboot"
+
+INT_LOG_DIR=${FAKE_ROOT}/opt/data/recovery
+INT_LOG_FILE=${INT_LOG_DIR}/fota_internal.log
+
+MOUNT="/bin/mount"
+UMOUNT="/bin/umount"
+GREP="/bin/grep"
+AWK="/usr/bin/awk"
+PARTX="/usr/sbin/partx"
+
+#------------------------------------------------
+# get partition id
+#------------------------------------------------
+get_partition_id() {
+ EMMC_DEVICE="/dev/mmcblk0"
+ RET_PARTX=$("$PARTX" -s ${EMMC_DEVICE})
+ PART_ROOTFS=${EMMC_DEVICE}p$(IFS=; echo $RET_PARTX | "$AWK" 'tolower($6) == "rootfs" {print $1}')
+ PART_SYSTEM_DATA=${EMMC_DEVICE}p$(IFS=; echo $RET_PARTX | "$AWK" 'tolower($6) == "system-data" {print $1}')
+ PART_USER=${EMMC_DEVICE}p$(IFS=; echo $RET_PARTX | "$AWK" 'tolower($6) == "user" {print $1}')
+ PART_MODULES=${EMMC_DEVICE}p$(IFS=; echo $RET_PARTX | "$AWK" 'tolower($6) == "module" {print $1}')
+}
+
+#------------------------------------------------
+# mount_partitions
+#------------------------------------------------
+mount_partitions() {
+ get_partition_id
+
+ "$MOUNT" -t ext4 -o ro ${PART_ROOTFS} ${FAKE_ROOT}
+ "$MOUNT" -t ext4 ${PART_SYSTEM_DATA} ${FAKE_ROOT}/opt
+ "$MOUNT" -t ext4 ${PART_USER} ${FAKE_ROOT}/opt/usr
+
+ "$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
+}
+
+#------------------------------------------------
+# do_reboot
+#------------------------------------------------
+do_reboot() {
+ echo "Reboot"
+ "$SYNC"
+ "$REBOOT"
+ while [ 1 ]
+ do
+ sleep 1
+ echo "."
+ done
+}
+
+#------------------------------------------------
+# do_rw_update
+#------------------------------------------------
+do_rw_update() {
+ echo "Change into rw update mode"
+ NEW_ROOT=${FAKE_ROOT}
+ NEW_INIT=/etc/rc.d/init.d/rw-update-init.sh
+
+ if [ ! -e ${NEW_ROOT}${NEW_INIT} ]; then
+ do_reboot
+ fi
+
+ exec /sbin/switch_root ${NEW_ROOT} ${NEW_INIT}
+
+ do_reboot
+}
+
+#------------------------------------------------
+# Main Routine Start
+#------------------------------------------------
+mount_partitions
+
+echo "rw update mode start ..." >> ${INT_LOG_FILE}
+"$SYNC"
+
+do_rw_update
+