Rename upg-verifier to img-verifier
[platform/core/system/initrd-fota.git] / scripts / fota-init.sh
1 #!/bin/bash
2 PATH=/bin:/usr/bin:/sbin:/usr/sbin
3
4 FAKE_ROOT=/system
5
6 UPI_NO_DELTA_ERROR=fb15
7 UPI_NO_UA_ERROR=fa17
8
9 STATUS_DIR=${FAKE_ROOT}/opt/data/update
10 STATUS_FILE=${STATUS_DIR}/RW.STATUS
11 DELTA_PATH_FILE=${STATUS_DIR}/DELTA.PATH
12 INT_LOG_DIR=${STATUS_DIR}
13 INT_LOG_FILE=${INT_LOG_DIR}/fota_internal.log
14
15 FOTA_LOG_DIR=/opt/data/update
16 FOTA_RESULT_DIR=${FOTA_LOG_DIR}
17 FOTA_TEMP_DIR=${FOTA_LOG_DIR}
18
19 PART_TBL_FILE="part_tbl.txt"
20 PART_TBL_PATH=${FOTA_TEMP_DIR}/${PART_TBL_FILE}
21
22 CAT="/bin/cat"
23 SYNC="/bin/sync"
24 MKDIR="/bin/mkdir"
25 REBOOT="/sbin/reboot"
26 MOUNT="/bin/mount"
27 UMOUNT="/bin/umount"
28 GREP="/bin/grep"
29 CUT="/usr/bin/cut"
30 TR="/usr/bin/tr"
31 BLKID="/usr/sbin/blkid"
32 SORT="/usr/bin/sort"
33 SED="/usr/bin/sed"
34 WC="/usr/bin/wc"
35 LS="/bin/ls"
36
37 FOTA_GUI="/usr/bin/fota_gui"
38 FOTA_GUI_ENABLE=
39
40 SYSTEM_DATA_MNT=opt
41 USER_MNT=opt/usr
42
43 #------------------------------------------------
44 #       get partition id
45 #------------------------------------------------
46 get_partition_id() {
47         PART_ROOTFS=$("$BLKID" --match-token PARTLABEL=rootfs -o device || "$BLKID" --match-token LABEL=rootfs -o device)
48         PART_SYSTEM_DATA=$("$BLKID" --match-token PARTLABEL=system-data -o device || "$BLKID" --match-token LABEL=system-data -o device)
49         PART_USER=$("$BLKID" --match-token PARTLABEL=user -o device || "$BLKID" --match-token LABEL=user -o device)
50 }
51
52 #------------------------------------------------
53 #       mount_partitions
54 #------------------------------------------------
55 mount_partitions() {
56         get_partition_id
57
58         "$MOUNT" -t ext4 -o ro ${PART_ROOTFS} ${FAKE_ROOT}
59         "$MOUNT" -t ext4 ${PART_SYSTEM_DATA} ${FAKE_ROOT}/${SYSTEM_DATA_MNT}
60
61         if [ ! "z${PART_USER}" = "z" ]; then
62                 "$MOUNT" -t ext4 ${PART_USER} ${FAKE_ROOT}/${USER_MNT}
63         fi
64
65         "$MOUNT" -t proc none ${FAKE_ROOT}/proc
66         "$MOUNT" -t sysfs none ${FAKE_ROOT}/sys
67         "$MOUNT" -t devtmpfs devtmpfs ${FAKE_ROOT}/dev
68         "$MOUNT" -t devpts devpts ${FAKE_ROOT}/dev/pts
69 }
70
71 #------------------------------------------------
72 #       umount_partitions
73 #------------------------------------------------
74 umount_partitions() {
75
76         "$UMOUNT" ${FAKE_ROOT}/dev/pts
77         "$UMOUNT" ${FAKE_ROOT}/dev
78         "$UMOUNT" ${FAKE_ROOT}/sys
79         "$UMOUNT" ${FAKE_ROOT}/proc
80
81         if [ ! "z${PART_USER}" = "z" ]; then
82                 "$UMOUNT" ${FAKE_ROOT}/${USER_MNT}
83         fi
84         "$UMOUNT" ${FAKE_ROOT}/${SYSTEM_DATA_MNT}
85         "$UMOUNT" ${FAKE_ROOT}
86 }
87
88 #------------------------------------------------
89 #       handle_no_delta
90 #------------------------------------------------
91 handle_no_delta() {
92         echo "delta does not exist ..." >> ${INT_LOG_FILE}
93
94         echo "${UPI_NO_DELTA_ERROR}" > ${RESULT_FILE}
95 }
96
97 #------------------------------------------------
98 #       handle_no_ua
99 #------------------------------------------------
100 handle_no_ua() {
101         echo "ua does not exist ..." >> ${INT_LOG_FILE}
102
103         echo "${UPI_NO_UA_ERROR}" > ${RESULT_FILE}
104 }
105
106 #------------------------------------------------
107 #       do_create_part_table
108 #------------------------------------------------
109 do_create_part_table() {
110
111         EMMC_DEVICE="/dev/mmcblk0"
112         PART_LIST=$("$BLKID" -o full | "$GREP" ${EMMC_DEVICE}p |
113                         "$SED" -e 's/\/dev\/mmcblk0p//g' -e 's/\ .*LABEL=\"\(.*\).*$/\1/' |
114                         "$CUT" -d '"' -f 1 | "$SED" 's/\:/\ /' |
115                         "$TR" '[:upper:]' '[:lower:]' |
116                         "$SORT" -k 1 -n)
117         PART_NUM=$(echo "$PART_LIST" | "$WC" -l)
118
119         echo "$PART_NUM" > ${PART_TBL_PATH}
120         echo "$PART_LIST" >> ${PART_TBL_PATH}
121         "$SYNC"
122 }
123
124 #------------------------------------------------
125 #       do_fota_update
126 #------------------------------------------------
127 do_fota_update() {
128         echo "fota update start ..." >> ${INT_LOG_FILE}
129
130         DELTA_DIR=`cat ${DELTA_PATH_FILE}`
131         echo "DELTA_DIR = ${DELTA_DIR}" >> ${INT_LOG_FILE}
132
133         RESULT_FILE=${FAKE_ROOT}${FOTA_RESULT_DIR}/result
134         if [ -e ${RESULT_FILE} ]; then
135                 rm -fr ${RESULT_FILE}
136         fi
137
138         UA=${DELTA_DIR}/delta.ua
139         if [ ! -s ${UA} ]; then
140                 handle_no_ua
141                 return 1
142         fi
143
144         /bin/chmod +x ${UA}
145
146         DELTA=${DELTA_DIR}/delta.tar
147         if [ ! -s ${DELTA} ]; then
148                 handle_no_delta
149                 return 1
150         fi
151
152         do_create_part_table
153         if [ ! -e ${PART_TBL_PATH} ]; then
154                 echo "No partition table" >> ${INT_LOG_FILE}
155                 return 1
156         fi
157
158         VERIFY_TOOL=/usr/sbin/img-verifier
159         if [ -e ${VERIFY_TOOL} ]; then
160                 ${VERIFY_TOOL} ${DELTA}
161                 if [ $? -ne 0 ]; then
162                         echo "signature verification failed!" >> ${INT_LOG_FILE}
163                         return 1
164                 else
165                         echo "update package verification success"
166                 fi
167         else
168                 echo "Warning: No signature verifier... Skip it" >> ${INT_LOG_FILE}
169         fi
170
171         DEBUG_MODE_FILE=${FAKE_ROOT}/opt/usr/.upgdebug_ro
172         if [ -f ${DEBUG_MODE_FILE} ]; then
173                 DEBUG_MODE_FILE_OWNER=$(${LS} -l ${DEBUG_MODE_FILE} | ${CUT} -d " " -f 3)
174                 if [ "${DEBUG_MODE_FILE_OWNER}" = "0" ]; then
175                         echo "Enter RO debug mode"
176                         echo "If you want to continue FOTA, please remove ${DEBUG_MODE_FILE}"
177                         # Wait until debug mode file is removed
178                         while [ -f ${DEBUG_MODE_FILE} ]; do
179                                 sleep 3
180                         done
181                 else
182                         echo "Warning: somebody make non-root debug mode file... ignore it"
183                 fi
184         fi
185
186         if [ "$FOTA_GUI_ENABLE" = "1" ]; then
187                 ${UA} ${DELTA_DIR} ${FOTA_TEMP_DIR} 0
188         else
189                 ${UA} ${DELTA_DIR} ${FOTA_TEMP_DIR} 1
190         fi
191
192         if [ $? -ne 0 ]; then
193                 echo "update agent fail!!!" >> ${INT_LOG_FILE}
194                 return 1
195         else
196                 echo "update agent success"
197                 return 0
198         fi
199
200 }
201
202 #------------------------------------------------
203 #       init_internal_log
204 #------------------------------------------------
205 init_internal_log() {
206
207         if [ -e "${INT_LOG_FILE}" ]; then
208                 /bin/rm -fr ${INT_LOG_FILE}
209         fi
210 }
211
212
213 #------------------------------------------------
214 #       init_fota_dir
215 #------------------------------------------------
216 init_fota_dir() {
217
218         TEST_DIR=${FAKE_ROOT}${FOTA_LOG_DIR}
219         if [ ! -e ${TEST_DIR} ]; then
220                 "$MKDIR" -p ${TEST_DIR}
221                 if [ "$?" = "0" ]; then
222                         echo "success to create ${TEST_DIR}" >> ${INT_LOG_FILE}
223                 fi
224         fi
225
226         TEST_DIR=${FAKE_ROOT}${FOTA_RESULT_DIR}
227         if [ ! -e ${TEST_DIR} ]; then
228                 "$MKDIR" -p ${TEST_DIR}
229                 if [ "$?" = "0" ]; then
230                         echo "success to create ${TEST_DIR}" >> ${INT_LOG_FILE}
231                 fi
232         fi
233
234         TEST_DIR=${FAKE_ROOT}${FOTA_TEMP_DIR}
235         if [ ! -e ${TEST_DIR} ]; then
236                 "$MKDIR" -p ${TEST_DIR}
237                 if [ "$?" = "0" ]; then
238                         echo "success to create ${TEST_DIR}" >> ${INT_LOG_FILE}
239                 fi
240         fi
241
242 }
243
244 #------------------------------------------------
245 #       do_reboot
246 #------------------------------------------------
247 do_reboot() {
248         echo "Reboot"
249         "$SYNC"
250         "$REBOOT"
251         while [ 1 ]
252         do
253                 sleep 1
254                 echo "."
255         done
256 }
257
258 #------------------------------------------------
259 #       check_for_rw_power_fail
260 #------------------------------------------------
261 check_for_rw_power_fail() {
262         # Case : Power fail during RW update after RO update
263         if [ -r ${STATUS_FILE} ]; then
264                 echo "${STATUS_FILE} exists" >> ${INT_LOG_FILE}
265                 /bin/cat ${STATUS_FILE} >> ${INT_LOG_FILE}
266                 "$SYNC"
267                 umount_partitions
268                 exec /sbin/fus_rw-init
269         fi
270 }
271
272 #------------------------------------------------
273 #       check_for_fota_gui
274 #------------------------------------------------
275 check_for_fota_gui() {
276         if [ -r ${FOTA_GUI} ]; then
277                 echo "GUI Enabled" >> ${INT_LOG_FILE}
278                 FOTA_GUI_ENABLE=1
279         fi
280 }
281
282
283 #------------------------------------------------
284 #       Main Routine Start
285 #------------------------------------------------
286
287 mount_partitions
288
289 # For debugging - It should be deleted on Release (TODO : tty like ttyS0, S1 should be selected automatically)
290 /sbin/agetty -l /bin/bash -n --keep-baud 115200,38400,9600 ttyS0 linux &
291
292 init_internal_log
293
294 check_for_rw_power_fail
295
296 "$MOUNT" -o remount,rw ${FAKE_ROOT}
297 init_fota_dir
298
299 check_for_fota_gui
300 if [ "$FOTA_GUI_ENABLE" = "1" ]; then
301         export XDG_RUNTIME_DIR=/run
302         export TBM_DISPLAY_SERVER=1
303
304         /usr/bin/fota_gui &
305         /usr/bin/sleep 2
306 fi
307 do_fota_update
308 fota_result=$?
309 if [ "$fota_result" = "0" ]; then
310         /bin/rm -fr ${DELTA_DIR}/*
311 fi
312 umount_partitions
313
314 if [ "$fota_result" = "0" ]; then
315         exec /sbin/fus_rw-init
316 else
317         echo "Upgrade FAILED"
318         do_reboot
319 fi