Pack important files at beginning of the archive
[platform/core/system/upgrade-tools.git] / mk_delta / common / bin / mk_delta.sh
index d42702b..a730cf4 100755 (executable)
@@ -7,63 +7,16 @@
 
 #------------------------------------------------------------------------------
 # Function :
-#      fn_read_delta_cfg
-#
-# Description :
-#      read configuration file for delta generation.
-#      config file format : PART_NAME PART_BIN UPDATE_TYPE (deliminator : TAB)
-#
-
-fn_read_delta_cfg()
-{
-       in_file=$1
-
-       if [ ! -r ${in_file} ]; then
-               echo "file ${in_file} cannot be read"
-               return 1
-       fi
-
-       line_num=0
-       while read line
-       do
-               # skip comment line
-               if [ "${line:0:1}" = "#" ]; then
-                       continue
-               fi
-
-               # skip empty line
-               line_len=${#line}
-               if [ "${line_len}" = "0" ]; then
-                       continue
-               fi
-
-
-               fields=(${line})
-               PART_NAME_delta[${line_num}]=${fields[0]}
-               PART_BIN_delta[${line_num}]=${fields[1]}
-               UPDATE_TYPE_delta[${line_num}]=${fields[2]}
-
-               line_num=$(($line_num + 1))
-
-       done < ${in_file}
-
-       PART_NUM_delta=${line_num}
-
-       return 0
-}
-
-#------------------------------------------------------------------------------
-# Function :
-#      fn_read_part_cfg
+#      fn_gen_update_cfg
 #
 # Description :
-#      read configuration file for partition information.
-#      config file format : PART_NAME DELTA_BIN UPDATE_TYPE BLK_DEV BLK_OFFSET (deliminator : TAB)
-#
+#      read delta configuration file for generating update configuration file to be used during update.
+#      delta config file format : PART_NAME PART_BIN DELTA_BIN UPDATE_TYPE BLK_DEV BLK_OFFSET (deliminator : TAB)
 
-fn_read_part_cfg()
+fn_gen_update_cfg()
 {
        in_file=$1
+       out_file=$2
 
        if [ ! -r ${in_file} ]; then
                echo "file ${in_file} cannot be read"
@@ -86,63 +39,18 @@ fn_read_part_cfg()
 
 
                fields=(${line})
-               PART_NAME_part[${line_num}]=${fields[0]}
-               DELTA_BIN_part[${line_num}]=${fields[1]}
-               UPDATE_TYPE_part[${line_num}]=${fields[2]}
-               BLK_DEV_part[${line_num}]=${fields[3]}
-               BLK_OFFSET_part[${line_num}]=${fields[4]}
+               PART_NAME[${line_num}]=${fields[0]}
+               PART_BIN[${line_num}]=${fields[1]}
+               DELTA_BIN[${line_num}]=${fields[2]}
+               UPDATE_TYPE[${line_num}]=${fields[3]}
+               BLK_DEV[${line_num}]=${fields[4]}
+               BLK_OFFSET[${line_num}]=${fields[5]}
 
                line_num=$(($line_num + 1))
 
        done < ${in_file}
 
-       PART_NUM_part=${line_num}
-
-       return 0
-}
-
-#------------------------------------------------------------------------------
-# Function :
-#      fn_gen_update_cfg
-#
-# Description :
-#      generate configuration file to be used during update.
-#
-
-fn_gen_update_cfg()
-{
-       out_file=$1
-
-       update_idx=0
-
-       for ((delta_idx=0;delta_idx<PART_NUM_delta;delta_idx++))
-       do
-               FOUND=0
-               for ((part_idx=0;part_idx<PART_NUM_part;part_idx++))
-               do
-                       if [ "${PART_NAME_part[${part_idx}]}" = "${PART_NAME_delta[${delta_idx}]}" ]; then
-                               FOUND=1
-                               break
-                       fi
-               done
-
-               if [ "${FOUND}" = "1" ]; then
-                       #-- PART_NAME, DELTA_BIN, BLK_DEV, BLK_OFFSET are from part.cfg
-                       PART_NAME[${update_idx}]=${PART_NAME_part[${part_idx}]}
-                       DELTA_BIN[${update_idx}]=${DELTA_BIN_part[${part_idx}]}
-                       BLK_DEV[${update_idx}]=${BLK_DEV_part[${part_idx}]}
-                       BLK_OFFSET[${update_idx}]=${BLK_OFFSET_part[${part_idx}]}
-
-                       #-- PART_BIN, UPDATE_TYPE are from delta.cfg
-                       PART_BIN[${update_idx}]=${PART_BIN_delta[${delta_idx}]}
-                       UPDATE_TYPE[${update_idx}]=${UPDATE_TYPE_delta[${delta_idx}]}
-
-                       update_idx=$(($update_idx + 1))
-               fi
-
-       done
-
-       PART_NUM=${update_idx}
+       PART_NUM=${line_num}
 
        if [ -f ${out_file} ]; then
                sudo rm -fr ${out_file}
@@ -175,11 +83,16 @@ fn_set_default_params()
        MY_ID=`whoami`
        MK_PART_DELTA=${COMMON_BINDIR}/mk_part_delta.sh
        DELTA_CFG_PATH=./cfg/delta.cfg
-       PART_CFG_PATH=./cfg/default_part.cfg
        UPDATE_CFG_PATH=./cfg/update.cfg
+       UPDATE_INFO_FILE=update-info.ini
+       UPDATE_INFO_PATH=./data/${UPDATE_INFO_FILE}
+       SETUP_SCRIPT_PATH=./cfg/setup.sh
        DELTA_UA=./data/delta.ua
+       UPDATE_MANAGER=./data/upgrade-trigger.sh
 
        LOG_PATH=./data/Delta.log
+       BUILD_STRING_FILE=build_string.txt
+       BUILD_STRING_PATH=./data/${BUILD_STRING_FILE}
        # Getting date and minor version
        MONDATE=$(date +%m%d)
        i=1
@@ -224,10 +137,9 @@ fn_print_update_cfg()
                        echo "------------------------------"
                        echo "[PART_NAME]    ${PART_NAME[${update_idx}]}"
                        echo "[DELTA_BIN]    ${DELTA_BIN[${update_idx}]}"
+                       echo "[UPDATE_TYPE]  ${UPDATE_TYPE[${update_idx}]}"
                        echo "[BLK_DEV]      ${BLK_DEV[${update_idx}]}"
                        echo "[BLK_OFFSET]   ${BLK_OFFSET[${update_idx}]}"
-                       echo "[PART_BIN]     ${PART_BIN[${update_idx}]}"
-                       echo "[UPDATE_TYPE]  ${UPDATE_TYPE[${update_idx}]}"
 
        done
        echo "------------------------------"
@@ -266,6 +178,87 @@ fn_process_extra_delta()
        fi
 }
 
+#------------------------------------------------------------------------------
+# Function :
+#      fn_get_tar_file_names
+#
+# Description :
+#      find tar file name (without path) that contains given partition binary
+#
+
+fn_get_tar_file_names()
+{
+       BIN_TO_FIND=$1
+
+       cd ${DATA_DIR}/${OLD_TAR_DIR}
+       OLD_TAR_LIST=`ls *.tar *.tar.gz *.tgz *.tar.md5 2>/dev/null`
+       cd ${CUR_DIR}
+
+       cd ${DATA_DIR}/${NEW_TAR_DIR}
+       NEW_TAR_LIST=`ls *.tar *.tar.gz *.tgz *.tar.md5 2>/dev/null`
+       cd ${CUR_DIR}
+
+       #--- find which tar contains the binary ---
+       for tar_file in ${OLD_TAR_LIST}
+       do
+               result=`tar -tvf ${DATA_DIR}/${OLD_TAR_DIR}/${tar_file} | grep " ${BIN_TO_FIND}$"`
+               if [ "$?" = "0" ]; then
+                       OLD_TAR_FILE=${tar_file}
+                       break
+               fi
+       done
+
+       for tar_file in ${NEW_TAR_LIST}
+       do
+               result=`tar -tvf ${DATA_DIR}/${NEW_TAR_DIR}/${tar_file} | grep " ${BIN_TO_FIND}$"`
+               if [ "$?" = "0" ]; then
+                       NEW_TAR_FILE=${tar_file}
+                       break
+               fi
+       done
+
+}
+
+#------------------------------------------------------------------------------
+# Function :
+#      fn_extract_from_image
+#
+# Description :
+#      extract some files from given image
+#
+
+fn_extract_from_image()
+{
+       CUR_DIR=`pwd`
+       DATA_DIR=./data
+       IMAGE=$1
+       TARGET_FILE=$2
+       MNT_PNT=TMP_MNT
+       mkdir -p ${MNT_PNT}
+
+       fn_get_tar_file_names $IMAGE
+       tar xvf ${DATA_DIR}/${NEW_TAR_DIR}/${NEW_TAR_FILE} ${IMAGE}
+       if [ "$?" != "0" ]; then
+               return 1;
+       fi
+
+       sudo mount -o loop ${IMAGE} ${MNT_PNT}
+       if [ "$?" != "0" ]; then
+               return 1;
+       fi
+
+       EXTRACT_FILE="${MNT_PNT}${TARGET_FILE}"
+       if [ -e ${EXTRACT_FILE} ]; then
+               sudo cp ${EXTRACT_FILE} ${DELTA_DIR}
+       else
+               echo "There is no ${TARGET_FILE} in ${IMAGE}"
+       fi
+
+       sudo umount ${MNT_PNT}
+       sudo rm -rf ${MNT_PNT}
+       sudo rm -f ${IMAGE}
+}
+
 ###############################################################################
 #==================
 # Main Start
@@ -275,11 +268,7 @@ COMMON_BINDIR=${PWD}/../common/bin
 
 fn_set_default_params
 
-fn_read_delta_cfg ${DELTA_CFG_PATH}
-
-fn_read_part_cfg ${PART_CFG_PATH}
-
-fn_gen_update_cfg ${UPDATE_CFG_PATH}
+fn_gen_update_cfg ${DELTA_CFG_PATH} ${UPDATE_CFG_PATH}
 
 ################### Make delta Forward and Backward #####################
 if [ "z${FW_BW}" = "z" ]; then
@@ -318,11 +307,15 @@ do
                        ${MK_PART_DELTA} ${part_name} ${update_type} ${part_bin} ${delta_bin}
                        if [ "$?" = "0" ]; then
                                if [ "${update_type}" = "DELTA_FS" ]; then
-                               sudo mv data/${PART_OUT} ${RESULT_DIR}/${part_bin}
-                               sudo mv ${RESULT_DIR}/${part_bin} ${DELTA_DIR}
+                                       sudo mv data/${PART_OUT} ${RESULT_DIR}/${part_bin}
+                                       sudo mv ${RESULT_DIR}/${part_bin} ${DELTA_DIR}
                                else
                                        sudo mv data/${PART_OUT} ${RESULT_DIR}/${part_bin}
-                               sudo mv ${RESULT_DIR}/${part_bin}/${delta_bin} ${DELTA_DIR}
+                                       sudo mv ${RESULT_DIR}/${part_bin}/${delta_bin} ${DELTA_DIR}
+                               fi
+                               if [ "$?" != "0" ]; then
+                                       echo "Warning: No differences - remove record for \"${part_name}\" from the final update.cfg"
+                                       sed -i "/^${part_name}\b/d" "${UPDATE_CFG_PATH}"
                                fi
                        else
                                sudo rm -rf ${RESULT_DIR}/${part_bin}
@@ -333,6 +326,11 @@ do
                sudo rm -rf ${RESULT_DIR}/${part_bin}
        done
 
+       if [ ! -s "${UPDATE_CFG_PATH}" ]; then
+               echo "Error: No differences between versions - abort delta generation"
+               exit 2
+       fi
+
        #move update.cfg to delta directory
        if [ -r ${UPDATE_CFG_PATH} ]; then
                sudo cp ${UPDATE_CFG_PATH} ${DELTA_DIR}/update.cfg
@@ -343,12 +341,25 @@ do
                sudo rm ${LOG_PATH}
        fi
 
-       #--- move delta.ua to delta directory ---
-       if [ -r ${DELTA_UA} ]; then
-               sudo cp ${DELTA_UA} ${DELTA_DIR}/delta.ua
-               sudo rm ${DELTA_UA}
+       if [ -r ${BUILD_STRING_PATH} ]; then
+               sudo cp ${BUILD_STRING_PATH} ${DELTA_DIR}/${BUILD_STRING_FILE}
+               sudo rm ${BUILD_STRING_PATH}
+       fi
+
+       if [ -r ${UPDATE_INFO_PATH} ]; then
+               sudo cp ${UPDATE_INFO_PATH} ${DELTA_DIR}/${UPDATE_INFO_FILE}
+               sudo rm ${UPDATE_INFO_PATH}
        fi
 
+       if [ -r ${SETUP_SCRIPT_PATH} ]; then
+               sudo cp ${SETUP_SCRIPT_PATH} ${DELTA_DIR}/setup.sh
+       fi
+
+       #--- extract files which would be appended to delta.tar ---
+       echo "Extract binaries for update from images"
+       fn_extract_from_image rootfs.img /usr/bin/upgrade-trigger.sh
+       fn_extract_from_image ramdisk-recovery.img /usr/bin/delta.ua
+
        #--- archive result directory ---
        cd result/$MONDATE
        echo "tar result directory"
@@ -363,7 +374,19 @@ if [ -r ${UPDATE_CFG_PATH} ]; then
 fi
 cd ${DELTA_DIR}
 sudo cp ${COMMON_BINDIR}/unpack.sh ./
-sudo tar --overwrite -cf ../delta.tar *
+
+# Ensure essential files are at beginning of archive (metadata, scripts and binaries to perform upgrade)
+touch *.txt *.cfg *.ini *.sh *.ua
+sudo tar --overwrite -cpf ../delta.tar $(ls -1td *)
+
+SIGN_PKCS_FILE=$1
+SIGN_PKCS_PASSWORD=$2
+if [ "z${SIGN_PKCS_FILE}" != "z" ]; then
+       if [ "z${SIGN_PKCS_PASSWORD}" != "z" ]; then
+               SIGNER_OPTIONAL_ARGUMENT="-p ${SIGN_PKCS_PASSWORD}"
+       fi
+       sudo ${COMMON_BINDIR}/sign_img.sh -k ${SIGN_PKCS_FILE} -i ../delta.tar ${SIGNER_OPTIONAL_ARGUMENT}
+fi
 cd -
 
 END_TIMESTAMP="$(date +%T)"