8 #------------------------------------------------------------------------------
18 echo "*******************************************************************"
23 if [ "$PART_NAME" != "rootfs" ]; then
27 echo "===== Start writing image versions ====="
28 local TMP_MNT_PNT="TMP_MNT_PNT"
29 local BUILD_STRING_FILE="build_string.txt"
30 mkdir -p ${TMP_MNT_PNT}
32 tar xvf ${OLD_TAR_DIR}/${OLD_TAR_FILE} ${PART_IMG_ORG}
33 sudo mount -o loop ${PART_IMG_ORG} ${TMP_MNT_PNT}
34 local OLD_BUILD_STRING=`cat ${TMP_MNT_PNT}/etc/info.ini | grep "Date=" | sed "s/Date=//" | sed "s/;$//"`
35 sudo umount ${TMP_MNT_PNT}
36 rm -rf ${PART_IMG_ORG}
38 tar xvf ${NEW_TAR_DIR}/${NEW_TAR_FILE} ${PART_IMG_ORG}
39 sudo mount -o loop ${PART_IMG_ORG} ${TMP_MNT_PNT}
40 local NEW_BUILD_STRING=`cat ${TMP_MNT_PNT}/etc/info.ini | grep "Date=" | sed "s/Date=//" | sed "s/;$//"`
41 local BINOUT="$(LC_ALL=C LANG=C file -b ${TMP_MNT_PNT}/bin/ls)"
42 sudo umount ${TMP_MNT_PNT}
43 rm -rf ${PART_IMG_ORG}
46 # ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, ...
47 *ELF*64-bit*x86-64*) ARCHITECTURE=x86-64;;
49 # ELF 32-bit LSB shared object, ARM, EABI5 version, dynamically linked, interpreter /lib/ld-linux.so.3, ...
50 *ELF*32-bit*ARM,*) ARCHITECTURE=arm32;;
52 # ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, ...
53 *ELF*64-bit*ARM*aarch64*) ARCHITECTURE=arm64;;
56 echo "${BUILD_STRING_FILE} : ${OLD_BUILD_STRING}@${NEW_BUILD_STRING}"
57 echo -n ${OLD_BUILD_STRING}@${NEW_BUILD_STRING} > ${BUILD_STRING_FILE}
59 sed -e "s,@SOURCE_VERSION@,${OLD_BUILD_STRING},g" \
60 -e "s,@TARGET_VERSION@,${NEW_BUILD_STRING},g" \
61 -e "s,@ARCHITECTURE@,${ARCHITECTURE},g" \
62 -e "s,@IMAGE_TYPE@,all,g" \
63 < "../${UPDATE_INFO_PATH}" > "${UPDATE_INFO_FILE}"
66 echo "===== Finish writing image versions ====="
69 #------------------------------------------------------------------------------
74 # $1 - PART_NAME. to descriminate
75 # $2 - base directory to search files for old partition
76 # $3 - base directory to search files for new partition
79 # extract attribute information of files on the given partition
87 V1_ATTR_FILE=${OUTPUT_DIR}/v1_${TARGET}_attr.txt
88 V1_NAME_FILE=${OUTPUT_DIR}/v1_list.txt
89 V2_ATTR_FILE=${OUTPUT_DIR}/v2_${TARGET}_attr.txt
90 V2_NAME_FILE=${OUTPUT_DIR}/v2_list.txtfg
91 V23_NAME_FILE=v23_${TARGET}_attr.txt
92 V13_NAME_FILE=v13_${TARGET}_attr.txt
93 ATTR_CMD=extended_attr.sh
95 echo "Attribute generation for ${TARGET} [START] $(date +%T)"
97 sudo find ./${BASE_DIR_OLD} -type f -printf '"%P" Regular 14 %04m:%04U:%04G:' -exec ${COMMON_BINDIR}/${ATTR_CMD} {} \; > ${V1_ATTR_FILE}
98 sudo find ./${BASE_DIR_OLD} -type l -printf '"%P" SymLink 14 %04m:%04U:%04G:' -exec ${COMMON_BINDIR}/${ATTR_CMD} {} \; >> ${V1_ATTR_FILE}
99 sudo find ./${BASE_DIR_OLD} -type d -printf '"%P" Regular 14 %04m:%04U:%04G:' -exec ${COMMON_BINDIR}/${ATTR_CMD} {} \; >> ${V1_ATTR_FILE}
101 sudo find ./${BASE_DIR_NEW} -type f -printf '"%P" Regular 14 %04m:%04U:%04G:' -exec ${COMMON_BINDIR}/${ATTR_CMD} {} \; > ${V2_ATTR_FILE}
102 sudo find ./${BASE_DIR_NEW} -type l -printf '"%P" SymLink 14 %04m:%04U:%04G:' -exec ${COMMON_BINDIR}/${ATTR_CMD} {} \; >> ${V2_ATTR_FILE}
103 sudo find ./${BASE_DIR_NEW} -type d -printf '"%P" Regular 14 %04m:%04U:%04G:' -exec ${COMMON_BINDIR}/${ATTR_CMD} {} \; >> ${V2_ATTR_FILE}
105 ################ Change user and group permission from '0' to '0000' ############
106 sed -i 's/: 0/:0000/g' ${V1_ATTR_FILE}
107 sed -i 's/: /:000/g' ${V1_ATTR_FILE}
108 sed -i 's/: /:00/g' ${V1_ATTR_FILE}
109 sed -i 's/: /:0/g' ${V1_ATTR_FILE}
111 sed -i 's/: 0/:0000/g' ${V2_ATTR_FILE}
112 sed -i 's/: /:000/g' ${V2_ATTR_FILE}
113 sed -i 's/: /:00/g' ${V2_ATTR_FILE}
114 sed -i 's/: /:0/g' ${V2_ATTR_FILE}
116 ################ Change ":./old" to "/" ############
117 sed -i "s/:.\/${BASE_DIR_OLD}\//:/" ${V1_ATTR_FILE}
118 sed -i "s/:.\/${BASE_DIR_OLD}/:/" ${V1_ATTR_FILE}
120 sed -i "s/:.\/${BASE_DIR_NEW}\//:/" ${V2_ATTR_FILE}
121 sed -i "s/:.\/${BASE_DIR_NEW}/:/" ${V2_ATTR_FILE}
123 echo "Attribute generation for ${TARGET} [END] $(date +%T)"
126 #------------------------------------------------------------------------------
133 PART_IMG_ORG=${PART_BIN}
134 PART_IMG_OLD=${PART_IMG_ORG}.old
135 PART_IMG_NEW=${PART_IMG_ORG}.new
137 #---- untar partition image and rename for old & new ----
138 if [ ! "z${OLD_TAR_FILE}" = "z" ]; then
139 echo "untar ${OLD_TAR_FILE}"
140 tar xvf ${OLD_TAR_DIR}/${OLD_TAR_FILE} ${PART_IMG_ORG}
141 if [ "$?" != "0" ]; then
144 sudo mv ${PART_IMG_ORG} ${PART_IMG_OLD}
147 echo "untar ${NEW_TAR_FILE}"
148 tar xvf ${NEW_TAR_DIR}/${NEW_TAR_FILE} ${PART_IMG_ORG}
149 if [ "$?" != "0" ]; then
152 sudo mv ${PART_IMG_ORG} ${PART_IMG_NEW}
154 if [ ! "z${OLD_TAR_FILE}" = "z" ]; then
155 #---- check whether the binaries are same ----
156 sudo diff ${PART_IMG_OLD} ${PART_IMG_NEW}
157 if [ "$?" = "0" ]; then
158 echo "[${PART_NAME}] two binaries are same"
159 sudo rm -rf ${PART_IMG_OLD}
160 sudo rm -rf ${PART_IMG_NEW}
163 sudo python3 ${COMMON_BINDIR}/CreatePatch.py ${UPDATE_TYPE} ${PART_NAME} ${PART_IMG_OLD} ${PART_IMG_NEW} ${OUTPUT_DIR} ${UPDATE_CFG_PATH}
165 sudo rm ${PART_IMG_OLD}
167 if [ $PythonRet != "0" ]; then
168 echo "[${PART_NAME}] Failed to generate DELTA"
173 sudo mv ${PART_IMG_NEW} ${OUTPUT_DIR}/${PART_IMG_ORG}
174 sudo chown ${MY_ID}:${MY_ID} ${OUTPUT_DIR}/${PART_IMG_ORG}
179 #------------------------------------------------------------------------------
181 # fn_mk_delta_img_core
184 # core routine for delta generation
188 fn_mk_delta_img_core()
191 START_TIMESTAMP="generation of ${DELTA} [START] $(date +%T)"
193 #---- untar partition image and rename for old & new ----
194 echo "untar ${OLD_TAR_FILE}"
195 tar xvf ${OLD_TAR_DIR}/${OLD_TAR_FILE} ${PART_IMG_ORG}
196 if [ "$?" != "0" ]; then
199 sudo mv ${PART_IMG_ORG} ${PART_IMG_OLD}
201 echo "untar ${NEW_TAR_FILE}"
202 tar xvf ${NEW_TAR_DIR}/${NEW_TAR_FILE} ${PART_IMG_ORG}
203 if [ "$?" != "0" ]; then
206 sudo mv ${PART_IMG_ORG} ${PART_IMG_NEW}
208 #---- check whether the binaries are same ----
209 sudo diff ${PART_IMG_OLD} ${PART_IMG_NEW}
210 if [ "$?" = "0" ]; then
211 echo "[${PART_NAME}] two binaries are same"
212 sudo rm -rf ${PART_IMG_OLD}
213 sudo rm -rf ${PART_IMG_NEW}
217 #---- make delta file ----
219 sudo python3 ${COMMON_BINDIR}/CreatePatch.py ${UPDATE_TYPE} ${PART_NAME} ${PART_IMG_OLD} ${PART_IMG_NEW} ${OUTPUT_DIR} ${UPDATE_CFG_PATH}
221 #sudo xdelta delta ${PART_IMG_OLD} ${PART_IMG_NEW} ./${OUTPUT_DIR}/${PART_NAME}".delta"
223 #---- remove files & directories ----
224 echo "remove temp files/directory & move delta/log to result directory"
225 sudo rm -rf ${PART_IMG_OLD}
226 sudo rm -rf ${PART_IMG_NEW}
229 if [ $PythonRet != "0" ]; then
230 echo "[${PART_NAME}] Failed to generate DELTA"
233 END_TIMESTAMP="generation of ${DELTA} [END] $(date +%T)"
234 echo "${START_TIMESTAMP}"
235 echo "${END_TIMESTAMP}"
241 #------------------------------------------------------------------------------
246 # generate delta file for image type partition
251 PART_IMG_ORG=${PART_BIN}
252 PART_IMG_OLD=${PART_IMG_ORG}.old
253 PART_IMG_NEW=${PART_IMG_ORG}.new
256 DEBUG_DELTA=debug_${DELTA}
257 #CFG_XML=${PART_NAME}_IMG.xml
258 mkdir ${OUTPUT_DIR}/i
262 if [ "$?" != "0" ]; then
269 #------------------------------------------------------------------------------
271 # mk_inter_attrib_file
274 # makes a list of attributes for those files which differ between v1 aND V2
275 #manoj:to create intermediate attribute list
276 fn_mk_inter_attrib_file()
278 V1ref_ATTR_FILE=${OUTPUT_DIR}/v1_${TARGET}_attr.txt
279 V2ref_ATTR_FILE=${OUTPUT_DIR}/v2_${TARGET}_attr.txt
282 #------------------------------------------------------------------------------
284 # fn_mk_delta_fs_core
287 # core routine for delta generation
288 # File System Update Type (DELTA_FS)
291 fn_mk_delta_fs_core()
293 START_TIMESTAMP="generation of ${DELTA} [START] $(date +%T)"
296 if [ "${DELTA}" = "boot.img/" ]; then
300 #---- untar partition image and rename for old & new ----
301 echo "untar ${OLD_TAR_FILE}"
302 tar xvf ${OLD_TAR_DIR}/${OLD_TAR_FILE} ${PART_IMG_ORG}
303 if [ "$?" != "0" ]; then
306 sudo mv ${PART_IMG_ORG} ${PART_IMG_OLD}
308 echo "untar ${NEW_TAR_FILE}"
309 tar xvf ${NEW_TAR_DIR}/${NEW_TAR_FILE} ${PART_IMG_ORG}
310 if [ "$?" != "0" ]; then
313 sudo mv ${PART_IMG_ORG} ${PART_IMG_NEW}
315 #---- check whether the binaries are same ----
316 sudo diff ${PART_IMG_OLD} ${PART_IMG_NEW}
317 if [ "$?" = "0" ]; then
318 echo "[${PART_NAME}] two binaries are same"
319 sudo rm -rf ${PART_IMG_OLD}
320 sudo rm -rf ${PART_IMG_NEW}
321 sudo rm -rf ${OUTPUT_DIR}
325 #---- make mount point ----
326 mkdir -p ${MNT_PNT_OLD}
327 mkdir -p ${MNT_PNT_NEW}
329 #---- mount partition image to mount point ----
330 echo "mount ${PART_IMG_OLD} & ${PART_IMG_NEW}"
331 sudo mount -o loop ${PART_IMG_OLD} ${MNT_PNT_OLD}
332 if [ "$?" != "0" ]; then
335 sudo mount -o loop ${PART_IMG_NEW} ${MNT_PNT_NEW}
336 if [ "$?" != "0" ]; then
340 #---- remove unnecessary files & directories ----
341 for ff in ${EXCLUDE_FILES}
343 sudo rm -rf ${MNT_PNT_OLD}/${ff}
344 sudo rm -rf ${MNT_PNT_NEW}/${ff}
347 #---- make attribute ----
348 fn_mk_attribute ${PART_NAME} ${BASE_OLD} ${BASE_NEW}
350 #PART_IMG_ORG parameter should match with DELTA name that is part of default config file. Which will be used to update MAX size file that is present in respective partition.
351 sudo python3 ${COMMON_BINDIR}/CreatePatch.py ${UPDATE_TYPE} ${PART_NAME} ${BASE_OLD} ${BASE_NEW} ${OUTPUT_DIR} ${UPDATE_CFG_PATH} \
352 --attr_old ${V1_ATTR_FILE} --attr_new ${V2_ATTR_FILE}
355 #---- unmount partition image ----
356 echo "umount ${MNT_PNT_OLD} & ${MNT_PNT_NEW}"
357 sudo umount ${MNT_PNT_OLD}
358 sudo umount ${MNT_PNT_NEW}
360 #---- remove files & directories ----
361 echo "remove temp files/directory & move delta/log to result directory"
362 sudo rm -rf ${PART_IMG_OLD}
363 sudo rm -rf ${PART_IMG_NEW}
364 sudo rm -rf ${BASE_OLD} ${BASE_NEW}
367 #---- extra cleanup ----
368 sudo mv ./file_attr_updated_image.txt ${OUTPUT_DIR}/${PART_NAME}_file_attr_updated_image.txt
370 if [ $PythonRet != "0" ]; then
371 echo "[${PART_NAME}] Failed to generate DELTA"
374 END_TIMESTAMP="generation of ${DELTA} [END] $(date +%T)"
375 echo "${START_TIMESTAMP}"
376 echo "${END_TIMESTAMP}"
381 #------------------------------------------------------------------------------
386 # generate delta file for filesystem type partition
391 PART_IMG_ORG=${PART_BIN}
392 PART_IMG_OLD=${PART_IMG_ORG}.old
393 PART_IMG_NEW=${PART_IMG_ORG}.new
396 DEBUG_DELTA=debug_${DELTA}
397 #CFG_XML=${PART_NAME}_FS.xml
399 BASE_OLD=${PART_NAME}_OLD
400 BASE_NEW=${PART_NAME}_NEW
402 #--- !!! this should be modified according to partition ---
403 case "${PART_NAME}" in
405 EXCLUDE_FILES="lost+found dev proc tmp var sys csa"
407 "ramdisk1" | "ramdisk" )
408 EXCLUDE_FILES="lost+found dev proc tmp sys"
410 "ramdisk2" | "ramdisk-recovery" )
411 EXCLUDE_FILES="lost+found"
414 EXCLUDE_FILES="lost+found"
417 EXCLUDE_FILES="lost+found"
427 echo "${PART_NAME} not supported !!!"
432 MNT_PNT_OLD=${BASE_OLD}/
433 MNT_PNT_NEW=${BASE_NEW}/
437 if [ "$?" != "0" ]; then
444 #------------------------------------------------------------------------------
451 PART_IMG_NEW=${PART_BIN}
453 #---- untar partition image and rename for old & new ----
454 echo "untar ${NEW_TAR_FILE}"
455 tar xvf ${NEW_TAR_DIR}/${NEW_TAR_FILE} ${PART_IMG_NEW}
456 if [ "$?" != "0" ]; then
460 sudo mv ${PART_IMG_NEW} ${OUTPUT_DIR}/${PART_BIN}
461 sudo chown ${MY_ID}:${MY_ID} ${OUTPUT_DIR}/${PART_BIN}
468 #------------------------------------------------------------------------------
473 # find tar file name (without path) that contains given partition binary
476 fn_get_tar_file_names()
480 cd ${DATA_DIR}/${OLD_TAR_DIR}
481 OLD_TAR_LIST=`ls *.tar *.tar.gz *.tgz *.tar.md5 2>/dev/null`
484 cd ${DATA_DIR}/${NEW_TAR_DIR}
485 NEW_TAR_LIST=`ls *.tar *.tar.gz *.tgz *.tar.md5 2>/dev/null`
488 #--- find which tar contains the binary ---
489 for tar_file in ${OLD_TAR_LIST}
491 result=`tar -tvf ${DATA_DIR}/${OLD_TAR_DIR}/${tar_file} | grep " ${BIN_TO_FIND}$"`
492 if [ "$?" = "0" ]; then
493 OLD_TAR_FILE=${tar_file}
498 for tar_file in ${NEW_TAR_LIST}
500 result=`tar -tvf ${DATA_DIR}/${NEW_TAR_DIR}/${tar_file} | grep " ${BIN_TO_FIND}$"`
501 if [ "$?" = "0" ]; then
502 NEW_TAR_FILE=${tar_file}
509 ###############################################################################
516 #--- assign input params to internal variables ---
518 if [ "${param_num}" != "4" ]; then
519 echo "Invalid param num"
520 echo "[Usage] $0 PART_NAME UPDATE_TYPE PART_BIN DELTA_BIN"
529 #--- set some default variables ---
535 COMMON_BINDIR=${CUR_DIR}/../common/bin
536 UPDATE_CFG_PATH=./cfg/update.cfg
537 UPDATE_INFO_FILE=update-info.ini
538 UPDATE_INFO_PATH=./cfg/${UPDATE_INFO_FILE}.in
540 #--- check if the current working directory is the parent directory of bin, data, cfg, xml ---
542 if [ ! -d ${TEST_DIR} ]; then
543 echo "Invalid working directory. ${TEST_DIR} does not exist"
548 if [ ! -d ${TEST_DIR} ]; then
549 echo "Invalid working directory. ${TEST_DIR} does not exist"
554 #if [ ! -d ${TEST_DIR} ]; then
555 # echo "Invalid working directory. ${TEST_DIR} does not exist"
559 #--- get old/new tar file which includes $PART_BIN ---
560 if [ "z${OLD_TAR_DIR}" = "z" ]; then
561 OLD_TAR_DIR="old_tar"
563 if [ "z${NEW_TAR_DIR}" = "z" ]; then
564 NEW_TAR_DIR="new_tar"
569 fn_get_tar_file_names ${PART_BIN}
571 if [ "z${OLD_TAR_FILE}" = "z" ]; then
572 UPDATE_TYPE_S=(${UPDATE_TYPE//:/ })
573 if [ ! "${UPDATE_TYPE_S[0]}" = "FULL_IMAGE" ]; then
574 echo "[old] tar file does not exist in ${DATA_DIR}/${OLD_TAR_DIR} which contains ${PART_BIN}"
575 #exit 0, cos this is not an error.
580 if [ "z${NEW_TAR_FILE}" = "z" ]; then
581 echo "[new] tar file does not exist in ${DATA_DIR}/${NEW_TAR_DIR} which contains ${PART_BIN}"
585 if [ ! "z${OLD_TAR_FILE}" = "z" ]; then
586 echo "[old] ${OLD_TAR_FILE} contains ${PART_BIN}"
588 echo "[new] ${NEW_TAR_FILE} contains ${PART_BIN}"
591 #--- generate delta binary ---
595 OUTPUT_DIR=${PART_NAME}_OUT
596 if [ ! -d ${OUTPUT_DIR} ]; then
597 if [ -f ${OUTPUT_DIR} ]; then
598 sudo rm -f ${OUTPUT_DIR}
603 UPDATE_TYPE_S=(${UPDATE_TYPE//:/ })
604 if [ "${UPDATE_TYPE_S[0]}" = "FULL_IMAGE" ]; then
606 elif [ "${UPDATE_TYPE_S[0]}" = "DELTA_IMAGE" ]; then
608 elif [ "${UPDATE_TYPE_S[0]}" = "DELTA_FS" ]; then
611 echo "Invalid update type"