Merge "Parse command options to allow empty PKCS password" into tizen
[platform/core/system/upgrade-tools.git] / mk_delta / common / bin / mk_delta.sh
1 #!/bin/bash
2
3
4 #==================
5 # funtions
6 #==================
7
8 #------------------------------------------------------------------------------
9 # Function :
10 #       fn_gen_update_cfg
11 #
12 # Description :
13 #       read delta configuration file for generating update configuration file to be used during update.
14 #       delta config file format : PART_NAME PART_BIN DELTA_BIN UPDATE_TYPE BLK_DEV BLK_OFFSET (deliminator : TAB)
15
16 fn_gen_update_cfg()
17 {
18         in_file=$1
19         out_file=$2
20
21         if [ ! -r ${in_file} ]; then
22                 echo "file ${in_file} cannot be read"
23                 return 1
24         fi
25
26         line_num=0
27         while read line
28         do
29                 # skip comment line
30                 if [ "${line:0:1}" = "#" ]; then
31                         continue
32                 fi
33
34                 # skip empty line
35                 line_len=${#line}
36                 if [ "${line_len}" = "0" ]; then
37                         continue
38                 fi
39
40
41                 fields=(${line})
42                 PART_NAME[${line_num}]=${fields[0]}
43                 PART_BIN[${line_num}]=${fields[1]}
44                 DELTA_BIN[${line_num}]=${fields[2]}
45                 UPDATE_TYPE[${line_num}]=${fields[3]}
46                 BLK_DEV[${line_num}]=${fields[4]}
47                 BLK_OFFSET[${line_num}]=${fields[5]}
48
49                 line_num=$(($line_num + 1))
50
51         done < ${in_file}
52
53         PART_NUM=${line_num}
54
55         if [ -f ${out_file} ]; then
56                 sudo rm -fr ${out_file}
57         fi
58
59         for ((update_idx=0;update_idx<PART_NUM;update_idx++))
60         do
61                 f1=${PART_NAME[${update_idx}]}
62                 f2=${DELTA_BIN[${update_idx}]}
63                 f3=${UPDATE_TYPE[${update_idx}]}
64                 f4=${BLK_DEV[${update_idx}]}
65                 f5=${BLK_OFFSET[${update_idx}]}
66
67                 echo -e "$f1\t\t$f2\t\t$f3\t\t$f4\t\t$f5" >> ${out_file}
68         done
69
70         return 0
71 }
72
73 #------------------------------------------------------------------------------
74 # Function :
75 #       fn_set_default_params
76 #
77 # Description :
78 #       set default params used globally in this script
79 #
80
81 fn_set_default_params()
82 {
83         MY_ID=`whoami`
84         MK_PART_DELTA=${COMMON_BINDIR}/mk_part_delta.sh
85         DELTA_CFG_PATH=./cfg/delta.cfg
86         UPDATE_CFG_PATH=./cfg/update.cfg
87         PRE_SCRIPT_PATH=./cfg/pre.sh
88         DELTA_UA=./data/delta.ua
89         UPDATE_MANAGER=./data/upgrade-trigger.sh
90
91         LOG_PATH=./data/Delta.log
92         BUILD_STRING_FILE=build_string.txt
93         BUILD_STRING_PATH=./data/${BUILD_STRING_FILE}
94         # Getting date and minor version
95         MONDATE=$(date +%m%d)
96         i=1
97         while [ -d "result/${MONDATE}_${i}" ]
98         do
99                 i=$(($i + 1))
100         done
101         MONDATE="${MONDATE}_${i}"
102         echo "MONDATE = ${MONDATE}"
103
104         if [ "z${OLD_TAR_DIR}" = "z" ]; then
105                 export OLD_TAR_DIR="old_tar"
106         fi
107         if [ "z${NEW_TAR_DIR}" = "z" ]; then
108                 export NEW_TAR_DIR="new_tar"
109         fi
110 }
111
112 #------------------------------------------------------------------------------
113 # Function :
114 #       fn_swap_binary_files
115 #
116 # Description :
117 #       change old & new for making backward delta
118 #
119
120 fn_swap_binary_files()
121 {
122         TEMP_TAR_DIR=${OLD_TAR_DIR}
123         export OLD_TAR_DIR=${NEW_TAR_DIR}
124         export NEW_TAR_DIR=${TEMP_TAR_DIR}
125 }
126
127 #------------------------------------------------------------------------------
128 # Function :
129 #       fn_print_update_cfg
130
131 fn_print_update_cfg()
132 {
133         for ((update_idx=0;update_idx<PART_NUM;update_idx++))
134         do
135                         echo "------------------------------"
136                         echo "[PART_NAME]    ${PART_NAME[${update_idx}]}"
137                         echo "[DELTA_BIN]    ${DELTA_BIN[${update_idx}]}"
138                         echo "[UPDATE_TYPE]  ${UPDATE_TYPE[${update_idx}]}"
139                         echo "[BLK_DEV]      ${BLK_DEV[${update_idx}]}"
140                         echo "[BLK_OFFSET]   ${BLK_OFFSET[${update_idx}]}"
141
142         done
143         echo "------------------------------"
144 }
145
146 #------------------------------------------------------------------------------
147 # Function :
148 #       fn_process_extra_delta
149 #
150
151 fn_process_extra_delta()
152 {
153         RAMDISK2_FULL_IMG=0
154         if [ "${part_name}" = "RAMDISK2" ]; then
155                 if [ "${RAMDISK2_FULL_IMG}" = "0" ]; then
156                         #--- delta recovery partition ---
157                         ${MK_PART_DELTA} ${part_name} DELTA_IMG ${part_bin} ${delta_bin}
158                         if [ "$?" = "0" ]; then
159                                 sudo mv data/${PART_OUT} ${RESULT_DIR}/${part_bin}
160                                 sudo mv ${RESULT_DIR}/${part_bin}/${delta_bin} ${DELTA_DIR}
161                         fi
162                 fi
163                 if [ "${RAMDISK2_FULL_IMG}" = "1" ]; then
164                         #--- full recovery partition ---
165                         ${MK_PART_DELTA} ${part_name} FULL_IMG ${part_bin} ${delta_bin}
166                         if [ "$?" = "0" ]; then
167                                 sudo mv data/${PART_OUT} ${RESULT_DIR}/${part_bin}
168                                 sudo mv ${RESULT_DIR}/${part_bin}/${part_bin} ${DELTA_DIR}
169                         fi
170                 fi
171         elif [ "${part_name}" = "RECOVERY" ]; then
172                 #--- recovery kernel ---
173                 sudo echo "1" > ${DELTA_DIR}/${delta_bin}
174         elif [ "${part_name}" = "EXTRA" ]; then
175                 echo "---"
176         fi
177 }
178
179 #------------------------------------------------------------------------------
180 # Function :
181 #       fn_get_tar_file_names
182 #
183 # Description :
184 #       find tar file name (without path) that contains given partition binary
185 #
186
187 fn_get_tar_file_names()
188 {
189         BIN_TO_FIND=$1
190
191         cd ${DATA_DIR}/${OLD_TAR_DIR}
192         OLD_TAR_LIST=`ls *.tar *.tar.gz *.tgz *.tar.md5 2>/dev/null`
193         cd ${CUR_DIR}
194
195         cd ${DATA_DIR}/${NEW_TAR_DIR}
196         NEW_TAR_LIST=`ls *.tar *.tar.gz *.tgz *.tar.md5 2>/dev/null`
197         cd ${CUR_DIR}
198
199         #--- find which tar contains the binary ---
200         for tar_file in ${OLD_TAR_LIST}
201         do
202                 result=`tar -tvf ${DATA_DIR}/${OLD_TAR_DIR}/${tar_file} | grep " ${BIN_TO_FIND}$"`
203                 if [ "$?" = "0" ]; then
204                         OLD_TAR_FILE=${tar_file}
205                         break
206                 fi
207         done
208
209         for tar_file in ${NEW_TAR_LIST}
210         do
211                 result=`tar -tvf ${DATA_DIR}/${NEW_TAR_DIR}/${tar_file} | grep " ${BIN_TO_FIND}$"`
212                 if [ "$?" = "0" ]; then
213                         NEW_TAR_FILE=${tar_file}
214                         break
215                 fi
216         done
217
218 }
219
220 #------------------------------------------------------------------------------
221 # Function :
222 #       fn_extract_from_image
223 #
224 # Description :
225 #       extract some files from given image
226 #
227
228 fn_extract_from_image()
229 {
230         CUR_DIR=`pwd`
231         DATA_DIR=./data
232         IMAGE=$1
233         TARGET_FILE=$2
234         MNT_PNT=TMP_MNT
235         mkdir -p ${MNT_PNT}
236
237         fn_get_tar_file_names $IMAGE
238         tar xvf ${DATA_DIR}/${NEW_TAR_DIR}/${NEW_TAR_FILE} ${IMAGE}
239         if [ "$?" != "0" ]; then
240                 return 1;
241         fi
242
243         sudo mount -t ext4 -o loop ${IMAGE} ${MNT_PNT}
244         if [ "$?" != "0" ]; then
245                 return 1;
246         fi
247
248         EXTRACT_FILE="${MNT_PNT}${TARGET_FILE}"
249         if [ -e ${EXTRACT_FILE} ]; then
250                 sudo cp ${EXTRACT_FILE} ${DELTA_DIR}
251         else
252                 echo "There is no ${TARGET_FILE} in ${IMAGE}"
253         fi
254
255         sudo umount ${MNT_PNT}
256         sudo rm -rf ${MNT_PNT}
257         sudo rm -f ${IMAGE}
258 }
259
260 ###############################################################################
261 #==================
262 # Main Start
263 #==================
264
265 COMMON_BINDIR=${PWD}/../common/bin
266
267 fn_set_default_params
268
269 fn_gen_update_cfg ${DELTA_CFG_PATH} ${UPDATE_CFG_PATH}
270
271 ################### Make delta Forward and Backward #####################
272 if [ "z${FW_BW}" = "z" ]; then
273         #FW_BW="FW_DELTA BW_DELTA"
274         FW_BW="FW_DELTA"
275 fi
276
277 START_TIMESTAMP="$(date +%T)"
278
279 for Make_Delta in $FW_BW
280 do
281         #--- archive result directory ---
282         echo "Make $Make_Delta Delta file"
283         RESULT_DIR=result/$MONDATE/$Make_Delta
284         DELTA_DIR=${RESULT_DIR}/DELTA
285         mkdir -p ${DELTA_DIR}
286
287         if [ "$Make_Delta" = "BW_DELTA" ]; then
288                 fn_swap_binary_files
289         fi
290
291
292         #--- make delta for each partition ---
293         for ((part_num=0;part_num<PART_NUM;part_num++))
294         do
295                 part_name=${PART_NAME[${part_num}]}
296                 update_type=${UPDATE_TYPE[${part_num}]}
297                 part_bin=${PART_BIN[${part_num}]}
298                 delta_bin=${DELTA_BIN[${part_num}]}
299
300                 PART_OUT=${part_name}_OUT
301
302                 if [ "${update_type}" = "EXTRA" ]; then
303                         fn_process_extra_delta
304                 else
305                         ${MK_PART_DELTA} ${part_name} ${update_type} ${part_bin} ${delta_bin}
306                         if [ "$?" = "0" ]; then
307                                 if [ "${update_type}" = "DELTA_FS" ]; then
308                                         sudo mv data/${PART_OUT} ${RESULT_DIR}/${part_bin}
309                                         sudo mv ${RESULT_DIR}/${part_bin} ${DELTA_DIR}
310                                 else
311                                         sudo mv data/${PART_OUT} ${RESULT_DIR}/${part_bin}
312                                         sudo mv ${RESULT_DIR}/${part_bin}/${delta_bin} ${DELTA_DIR}
313                                 fi
314                         else
315                                 sudo rm -rf ${RESULT_DIR}/${part_bin}
316                                 echo "Error: Abort Delta Generation"
317                                 exit 1
318                         fi
319                 fi
320                 sudo rm -rf ${RESULT_DIR}/${part_bin}
321         done
322
323         #move update.cfg to delta directory
324         if [ -r ${UPDATE_CFG_PATH} ]; then
325                 sudo cp ${UPDATE_CFG_PATH} ${DELTA_DIR}/update.cfg
326                 sudo rm ${UPDATE_CFG_PATH}
327         fi
328         if [ -r ${LOG_PATH} ]; then
329                 sudo cp ${LOG_PATH} ${RESULT_DIR}/Delta.log
330                 sudo rm ${LOG_PATH}
331         fi
332
333         if [ -r ${BUILD_STRING_PATH} ]; then
334                 sudo cp ${BUILD_STRING_PATH} ${DELTA_DIR}/${BUILD_STRING_FILE}
335                 sudo rm ${BUILD_STRING_PATH}
336         fi
337         if [ -r ${PRE_SCRIPT_PATH} ]; then
338                 sudo cp ${PRE_SCRIPT_PATH} ${DELTA_DIR}/pre.sh
339         fi
340
341         #--- extract files which would be appended to delta.tar ---
342         echo "Extract binaries for update from images"
343         fn_extract_from_image rootfs.img /usr/bin/upgrade-trigger.sh
344         fn_extract_from_image ramdisk-recovery.img /usr/bin/delta.ua
345
346         #--- archive result directory ---
347         cd result/$MONDATE
348         echo "tar result directory"
349         sudo tar cf ${MONDATE}_${Make_Delta}.tar $Make_Delta
350         cd ../..
351
352         echo "Making delta binary is End!! ($Make_Delta)"
353 done
354
355 if [ -r ${UPDATE_CFG_PATH} ]; then
356         sudo rm ${UPDATE_CFG_PATH}
357 fi
358 cd ${DELTA_DIR}
359 sudo cp ${COMMON_BINDIR}/unpack.sh ./
360 sudo tar --overwrite -cf ../delta.tar *
361
362 SIGN_PKCS_FILE=$1
363 SIGN_PKCS_PASSWORD=$2
364 if [ "z${SIGN_PKCS_FILE}" != "z" ]; then
365         if [ "z${SIGN_PKCS_PASSWORD}" != "z" ]; then
366                 SIGNER_OPTIONAL_ARGUMENT="-p ${SIGN_PKCS_PASSWORD}"
367         fi
368         sudo ${COMMON_BINDIR}/sign_img.sh -k ${SIGN_PKCS_FILE} -i ../delta.tar ${SIGNER_OPTIONAL_ARGUMENT}
369 fi
370 cd -
371
372 END_TIMESTAMP="$(date +%T)"
373
374 echo "OVERALL TIMESTAMP : [START] ${START_TIMESTAMP} ~ [END] ${END_TIMESTAMP}"
375