Pack important files at beginning of the archive
[platform/core/system/upgrade-tools.git] / mk_delta / common / bin / mk_delta.sh
index 97cb947..a730cf4 100755 (executable)
@@ -64,9 +64,7 @@ fn_gen_update_cfg()
                f4=${BLK_DEV[${update_idx}]}
                f5=${BLK_OFFSET[${update_idx}]}
 
-               if [ "${f3}" != "EXCLUDED" ]; then
-                       echo -e "$f1\t\t$f2\t\t$f3\t\t$f4\t\t$f5" >> ${out_file}
-               fi
+               echo -e "$f1\t\t$f2\t\t$f3\t\t$f4\t\t$f5" >> ${out_file}
        done
 
        return 0
@@ -86,10 +84,15 @@ fn_set_default_params()
        MK_PART_DELTA=${COMMON_BINDIR}/mk_part_delta.sh
        DELTA_CFG_PATH=./cfg/delta.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
@@ -175,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
@@ -217,10 +301,7 @@ do
 
                PART_OUT=${part_name}_OUT
 
-               if [ "${update_type}" = "EXCLUDED" ]; then
-                       ${MK_PART_DELTA} ${part_name} ${update_type} ${part_bin} ${delta_bin}
-                       continue
-               elif [ "${update_type}" = "EXTRA" ]; then
+               if [ "${update_type}" = "EXTRA" ]; then
                        fn_process_extra_delta
                else
                        ${MK_PART_DELTA} ${part_name} ${update_type} ${part_bin} ${delta_bin}
@@ -232,6 +313,10 @@ do
                                        sudo mv data/${PART_OUT} ${RESULT_DIR}/${part_bin}
                                        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}
                                echo "Error: Abort Delta Generation"
@@ -241,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
@@ -251,18 +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
 
-       #--- move update manager script to delta directory ---
-       if [ -r ${UPDATE_MANAGER} ]; then
-               sudo cp ${UPDATE_MANAGER} ${DELTA_DIR}/upgrade-trigger.sh
-               sudo rm ${UPDATE_MANAGER}
+       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"
@@ -277,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)"