#------------------------------------------------------------------------------
# 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"
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}
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
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 "------------------------------"
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
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
${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}
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
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"
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)"