Fix rootfs mount for metadata extraction
[platform/core/system/upgrade-tools.git] / mk_delta / common / bin / mk_delta_full.sh
1 #!/bin/bash
2
3 set -u
4 shopt -s nullglob
5
6 fn_set_default_params()
7 {
8         MY_ID=$(whoami)
9         DATA_DIR=./data
10         CFG_DIR=./cfg
11         DELTA_CFG_PATH=${CFG_DIR}/delta.cfg
12         UPDATE_CFG_PATH=${DATA_DIR}/update.cfg
13         UPDATE_INFO_FILE=update-info.ini
14         UPDATE_INFO_ORIG_PATH=${CFG_DIR}/${UPDATE_INFO_FILE}.in
15         UPDATE_INFO_PATH=${DATA_DIR}/${UPDATE_INFO_FILE}
16         SETUP_SCRIPT_PATH=${CFG_DIR}/setup.sh
17
18         LOG_PATH=${DATA_DIR}/Delta.log
19         BUILD_STRING_FILE=build_string.txt
20         BUILD_STRING_PATH=${DATA_DIR}/${BUILD_STRING_FILE}
21         # Getting date and minor version
22         MONDATE=$(date +%m%d)
23         i=1
24         while [ -d "result/${MONDATE}_${i}" ]
25         do
26                 i=$(($i + 1))
27         done
28         MONDATE="${MONDATE}_${i}"
29         echo "MONDATE = ${MONDATE}"
30
31         NEW_TAR_DIR="new_tar"
32         RESULT_DIR=result/$MONDATE/FW_DELTA
33         DELTA_DIR=${RESULT_DIR}/DELTA
34         mkdir -p ${DELTA_DIR}
35
36         DIR_WITH_IMAGES=${DATA_DIR}/images
37         mkdir -p ${DIR_WITH_IMAGES}
38 }
39
40 fn_gen_metadata()
41 {
42         ROOTFS_IMG="$1"
43
44         echo "===== Start writing image versions ====="
45         local TMP_MNT_PNT="TMP_MNT_PNT"
46         mkdir -p ${TMP_MNT_PNT}
47
48         local OLD_BUILD_STRING="0.0"
49
50         sudo mount -o loop,ro ${ROOTFS_IMG} ${TMP_MNT_PNT}
51         local NEW_BUILD_STRING=`cat ${TMP_MNT_PNT}/etc/info.ini | grep "Release=" | sed "s/Release=//" | sed "s/;$//"`
52         local BINOUT="$(LC_ALL=C LANG=C file -b ${TMP_MNT_PNT}/bin/ls)"
53
54         # Copy upgrade scripts
55         cp -Rd ${TMP_MNT_PNT}/usr/libexec/upgrade-support/* ${DELTA_DIR}
56         sudo umount ${TMP_MNT_PNT}
57
58         case "${BINOUT}" in
59                 # ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, ...
60                 *ELF*64-bit*x86-64*) ARCHITECTURE=x86-64;;
61
62                 # ELF 32-bit LSB shared object, ARM, EABI5 version, dynamically linked, interpreter /lib/ld-linux.so.3, ...
63                 *ELF*32-bit*ARM,*) ARCHITECTURE=arm32;;
64
65                 # ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, ...
66                 *ELF*64-bit*ARM*aarch64*) ARCHITECTURE=arm64;;
67         esac
68
69         echo "${BUILD_STRING_FILE} : ${OLD_BUILD_STRING}@${NEW_BUILD_STRING}"
70         echo -n ${OLD_BUILD_STRING}@${NEW_BUILD_STRING} > ${BUILD_STRING_PATH}
71
72         sed     -e "s,@SOURCE_VERSION@,${OLD_BUILD_STRING},g" \
73                 -e "s,@TARGET_VERSION@,${NEW_BUILD_STRING},g" \
74                 -e "s,@ARCHITECTURE@,${ARCHITECTURE},g" \
75                 -e "s,@IMAGE_TYPE@,all,g" \
76                 < "${UPDATE_INFO_ORIG_PATH}" > "${UPDATE_INFO_PATH}"
77
78         echo "update-info.ini:"
79         cat "${UPDATE_INFO_PATH}"
80         rm -rf ${TMP_MNT_PNT}
81         echo "===== Finish writing image versions ====="
82 }
83
84 fn_read_delta_cfg()
85 {
86         in_file=$1
87
88         echo "Read ${in_file}"
89
90         if [ ! -r ${in_file} ]; then
91                 echo "file ${in_file} cannot be read"
92                 return 1
93         fi
94
95         line_num=0
96         while read line
97         do
98                 # skip comment line
99                 if [ "${line:0:1}" = "#" ]; then
100                         continue
101                 fi
102
103                 # skip empty line
104                 line_len=${#line}
105                 if [ "${line_len}" = "0" ]; then
106                         continue
107                 fi
108
109
110                 fields=(${line})
111                 PART_NAME[${line_num}]=${fields[0]}
112                 PART_BIN[${line_num}]=${fields[1]}
113                 DELTA_BIN[${line_num}]=${fields[2]}
114
115                 line_num=$(($line_num + 1))
116
117         done < ${in_file}
118
119         PART_NUM=${line_num}
120         return 0
121 }
122
123 fn_extract_all_images()
124 {
125         echo "Extracting archives with images:"
126         for tar_file in "${DATA_DIR}/${NEW_TAR_DIR}"/*.{tar,tar.gz}
127         do
128                 echo -e "\t$(basename ${tar_file})"
129                 tar xf "${tar_file}" -C "${DIR_WITH_IMAGES}"
130         done
131 }
132
133 fn_copy_image()
134 {
135         PART_NAME="$1"
136         PART_BIN="$2"
137         DELTA_BIN="$3"
138         CUR_DIR=$(pwd)
139
140         echo -ne "Add an image for ${PART_NAME} (${PART_BIN} -> ${DELTA_BIN})"
141         IMG_SIZE=$(du -b ${DIR_WITH_IMAGES}/${PART_BIN} | awk '{print $1}')
142         SHA1_SUM=$(sha1sum ${DIR_WITH_IMAGES}/${PART_BIN} | awk '{print $1}')
143         echo -e "\t\t${IMG_SIZE}\t[${SHA1_SUM}]"
144
145         if [ "${PART_NAME}" == "rootfs" ]; then
146                 fn_gen_metadata ${DIR_WITH_IMAGES}/${PART_BIN}
147         fi
148
149         sudo mv ${DIR_WITH_IMAGES}/${PART_BIN} ${DELTA_DIR}/${DELTA_BIN}
150         sudo chown ${MY_ID}:${MY_ID} ${DELTA_DIR}/${PART_BIN}
151
152         echo -e "${PART_NAME}\t${DELTA_BIN}\tPRE_UA\t/dev/null\t0\t0\t${IMG_SIZE}\t0\t${SHA1_SUM}" >> ${UPDATE_CFG_PATH}
153 }
154
155 fn_make_delta_full()
156 {
157         echo "Make full delta file"
158         fn_extract_all_images $DIR_WITH_IMAGES
159
160         for ((part_num=0;part_num<PART_NUM;part_num++))
161         do
162                 part_name=${PART_NAME[${part_num}]}
163                 part_bin=${PART_BIN[${part_num}]}
164                 delta_bin=${DELTA_BIN[${part_num}]}
165
166                 fn_copy_image ${part_name} ${part_bin} ${delta_bin}
167                 if [ "$?" != "0" ]; then
168                         echo "Error: Abort Delta Generation"
169                         exit 1
170                 fi
171         done
172
173         #move update.cfg to delta directory
174         if [ -r ${UPDATE_CFG_PATH} ]; then
175                 sudo cp ${UPDATE_CFG_PATH} ${DELTA_DIR}/update.cfg
176                 sudo rm ${UPDATE_CFG_PATH}
177         fi
178         if [ -r ${LOG_PATH} ]; then
179                 sudo cp ${LOG_PATH} ${RESULT_DIR}/Delta.log
180                 sudo rm ${LOG_PATH}
181         fi
182
183         if [ -r ${BUILD_STRING_PATH} ]; then
184                 sudo cp ${BUILD_STRING_PATH} ${DELTA_DIR}/${BUILD_STRING_FILE}
185                 sudo rm ${BUILD_STRING_PATH}
186         fi
187
188         if [ -r ${UPDATE_INFO_PATH} ]; then
189                 sudo cp ${UPDATE_INFO_PATH} ${DELTA_DIR}/${UPDATE_INFO_FILE}
190                 sudo rm ${UPDATE_INFO_PATH}
191         fi
192
193         if [ -r ${SETUP_SCRIPT_PATH} ]; then
194                 sudo cp ${SETUP_SCRIPT_PATH} ${DELTA_DIR}/setup.sh
195         fi
196
197         if [ -r ${DIR_WITH_IMAGES} ]; then
198                 sudo rm -r ${DIR_WITH_IMAGES}
199         fi
200
201         #--- archive result directory ---
202         pushd result/$MONDATE/FW_DELTA/DELTA/
203         echo "tar result directory"
204         sudo tar cf delta.tar *
205         popd
206
207         echo "Making delta binary is End!!"
208 }
209
210 #==================
211 # Main Start
212 #==================
213
214 COMMON_BINDIR=${PWD}/../common/bin
215
216 fn_set_default_params
217
218 fn_read_delta_cfg ${DELTA_CFG_PATH}
219
220 fn_make_delta_full