Upload initial initrd-fota 76/133676/8
authorSunmin Lee <sunm.lee@samsung.com>
Tue, 13 Jun 2017 05:49:43 +0000 (14:49 +0900)
committerSunmin Lee <sunm.lee@samsung.com>
Mon, 17 Jul 2017 10:03:54 +0000 (19:03 +0900)
Upload initial initrd-fota codes based on reference repository.

Change-Id: I2b5c78386e6a9e202eb450425b8273ea9750a82a
Signed-off-by: Sunmin Lee <sunm.lee@samsung.com>
initrd-fota.manifest [new file with mode: 0755]
packaging/initrd-fota.spec [new file with mode: 0755]
scripts/40-fota.list [new file with mode: 0755]
scripts/fota-init.sh [new file with mode: 0755]
scripts/fus_rw-init.sh [new file with mode: 0755]

diff --git a/initrd-fota.manifest b/initrd-fota.manifest
new file mode 100755 (executable)
index 0000000..ca37499
--- /dev/null
@@ -0,0 +1,6 @@
+<manifest>
+       <request>
+               <domain name="_" />
+       </request>
+</manifest>
+
diff --git a/packaging/initrd-fota.spec b/packaging/initrd-fota.spec
new file mode 100755 (executable)
index 0000000..c277211
--- /dev/null
@@ -0,0 +1,48 @@
+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
diff --git a/scripts/40-fota.list b/scripts/40-fota.list
new file mode 100755 (executable)
index 0000000..3f2dbc6
--- /dev/null
@@ -0,0 +1,39 @@
+# ---- Target contents ----------------------------------------------------- #
+VERBATIMS="
+/usr/lib/initrd-recovery/fota/fota-init.sh
+/usr/lib/initrd-recovery/fota/fus_rw-init.sh
+"
+
+LIBONLYS="
+/usr/bin/delta.ua
+"
+
+WITHLIBS="
+/bin/grep
+/bin/bash
+/bin/echo
+/bin/ls
+/bin/gawk
+/bin/tar
+/sbin/switch_root
+/usr/lib/initrd-recovery/minireboot
+/bin/cat
+/bin/chmod
+/bin/ln
+/bin/mkdir
+/bin/mount
+/bin/rm
+/bin/rmdir
+/bin/sed
+/bin/sleep
+/bin/sync
+/bin/umount
+"
+
+# LinkFileName:Target
+SYMLINKS="
+/bin/sh:bash
+/usr/bin/awk:/bin/gawk
+/sbin/fota-init:/usr/lib/initrd-recovery/fota/fota-init.sh
+/sbin/fus_rw-init:/usr/lib/initrd-recovery/fota/fus_rw-init.sh
+"
diff --git a/scripts/fota-init.sh b/scripts/fota-init.sh
new file mode 100755 (executable)
index 0000000..db9597a
--- /dev/null
@@ -0,0 +1,254 @@
+#!/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
diff --git a/scripts/fus_rw-init.sh b/scripts/fus_rw-init.sh
new file mode 100755 (executable)
index 0000000..9f88c30
--- /dev/null
@@ -0,0 +1,85 @@
+#!/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
+