fota-init.sh: improve logging:
[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 VERITYCTL="/usr/bin/verityctl"
37 VERITY_HANDLER="/usr/bin/verity_handler"
38
39 FOTA_GUI="/usr/bin/fota_gui"
40 FOTA_GUI_ENABLE=
41
42 SYSTEM_DATA_MNT=opt
43 USER_MNT=opt/usr
44
45 SCRIPT_NAME="fota-init.sh"
46 #------------------------------------------------
47 #       log msg [file]
48 #------------------------------------------------
49 log() {
50         # log format: [script_name][tag]actual_log
51         LOG="[${SCRIPT_NAME}]$1"
52         if [ "$2" != "" ]; then
53                 echo "$LOG" >> "$2"
54         fi
55         echo "$LOG"
56 }
57
58 #------------------------------------------------
59 #       get partition id
60 #------------------------------------------------
61 get_partition_id() {
62         PART_ROOTFS=$("$BLKID" --match-token PARTLABEL=rootfs -o device || "$BLKID" --match-token LABEL=rootfs -o device)
63         PART_SYSTEM_DATA=$("$BLKID" --match-token PARTLABEL=system-data -o device || "$BLKID" --match-token LABEL=system-data -o device)
64         PART_USER=$("$BLKID" --match-token PARTLABEL=user -o device || "$BLKID" --match-token LABEL=user -o device)
65 }
66
67 #------------------------------------------------
68 #       mount_partitions
69 #------------------------------------------------
70 mount_partitions() {
71         get_partition_id
72
73         "$MOUNT" -o ro "${PART_ROOTFS}" "${FAKE_ROOT}"
74         "$MOUNT" "${PART_SYSTEM_DATA}" "${FAKE_ROOT}/${SYSTEM_DATA_MNT}"
75
76         if [ ! "z${PART_USER}" = "z" ]; then
77                 "$MOUNT" "${PART_USER}" "${FAKE_ROOT}/${USER_MNT}"
78         fi
79
80         "$MOUNT" -t proc none "${FAKE_ROOT}/proc"
81         "$MOUNT" -t sysfs none "${FAKE_ROOT}/sys"
82         "$MOUNT" -t devtmpfs devtmpfs "${FAKE_ROOT}/dev"
83         "$MOUNT" -t devpts devpts "${FAKE_ROOT}/dev/pts"
84 }
85
86 #------------------------------------------------
87 #       umount_partitions
88 #------------------------------------------------
89 umount_partitions() {
90
91         "$UMOUNT" "${FAKE_ROOT}/dev/pts"
92         "$UMOUNT" "${FAKE_ROOT}/dev"
93         "$UMOUNT" "${FAKE_ROOT}/sys"
94         "$UMOUNT" "${FAKE_ROOT}/proc"
95
96         if [ ! "z${PART_USER}" = "z" ]; then
97                 "$UMOUNT" "${FAKE_ROOT}/${USER_MNT}"
98         fi
99         "$UMOUNT" "${FAKE_ROOT}/${SYSTEM_DATA_MNT}"
100         "$UMOUNT" "${FAKE_ROOT}"
101 }
102
103 #------------------------------------------------
104 #       handle_no_delta
105 #------------------------------------------------
106 handle_no_delta() {
107         log "[Error] delta does not exist ..." "${INT_LOG_FILE}"
108
109         echo "${UPI_NO_DELTA_ERROR}" > "${RESULT_FILE}"
110 }
111
112 #------------------------------------------------
113 #       handle_no_ua
114 #------------------------------------------------
115 handle_no_ua() {
116         log "[Error] ua does not exist ..." "${INT_LOG_FILE}"
117
118         echo "${UPI_NO_UA_ERROR}" > "${RESULT_FILE}"
119 }
120
121 #------------------------------------------------
122 #       do_create_part_table
123 #------------------------------------------------
124 do_create_part_table() {
125
126         EMMC_DEVICE="/dev/mmcblk0"
127         PART_LIST=$("$BLKID" -o full | "$GREP" "${EMMC_DEVICE}p" |
128                         "$SED" -e 's/\/dev\/mmcblk0p//g' -e 's/\ .*LABEL=\"\(.*\).*$/\1/' |
129                         "$CUT" -d '"' -f 1 | "$SED" 's/\:/\ /' |
130                         "$TR" '[:upper:]' '[:lower:]' |
131                         "$SORT" -k 1 -n)
132         PART_NUM=$(echo "$PART_LIST" | "$WC" -l)
133
134         echo "$PART_NUM" > "${PART_TBL_PATH}"
135         echo "$PART_LIST" >> "${PART_TBL_PATH}"
136         "$SYNC"
137 }
138
139 #------------------------------------------------
140 #       do_fota_update
141 #------------------------------------------------
142 do_fota_update() {
143         log "[Info] fota update start ..." "${INT_LOG_FILE}"
144
145         DELTA_DIR=$("$CAT" "${DELTA_PATH_FILE}")
146         log "[Info] DELTA_DIR = ${DELTA_DIR}" "${INT_LOG_FILE}"
147
148         RESULT_FILE=${FAKE_ROOT}${FOTA_RESULT_DIR}/result
149         if [ -e "${RESULT_FILE}" ]; then
150                 rm -fr "${RESULT_FILE}"
151         fi
152
153         UA=${DELTA_DIR}/delta.ua
154         if [ ! -s "${UA}" ]; then
155                 handle_no_ua
156                 return 1
157         fi
158
159         /bin/chmod +x "${UA}"
160
161         DELTA=${DELTA_DIR}/delta.tar
162         if [ ! -s "${DELTA}" ]; then
163                 handle_no_delta
164                 return 1
165         fi
166
167         do_create_part_table
168         if [ ! -e "${PART_TBL_PATH}" ]; then
169                 log "[Error] No partition table" "${INT_LOG_FILE}"
170                 return 1
171         fi
172
173         VERIFY_TOOL=/usr/sbin/img-verifier
174         if [ -e "${VERIFY_TOOL}" ]; then
175                 if ! "${VERIFY_TOOL}" -i "${DELTA}" -l "/opt/var/log/last_iv.log"; then
176                         log "[Error] signature verification failed!" "${INT_LOG_FILE}"
177                         return 1
178                 else
179                         log "[Info] update package verification success"
180                 fi
181         else
182                 log "[Error] Warning: No signature verifier... Skip it" "${INT_LOG_FILE}"
183         fi
184
185         FOTA_ARG="1"
186         if [ "$FOTA_GUI_ENABLE" = "1" ]; then
187                 FOTA_ARG="0"
188         fi
189         if ! "${UA}" "${DELTA_DIR}" "${FOTA_TEMP_DIR}" "$FOTA_ARG"; then
190                 log "[Error] update agent fail!!!" "${INT_LOG_FILE}"
191                 return 1
192         else
193                 log "[Info] update agent success"
194                 return 0
195         fi
196
197 }
198
199 #------------------------------------------------
200 #       init_internal_log
201 #------------------------------------------------
202 init_internal_log() {
203
204         if [ -e "${INT_LOG_FILE}" ]; then
205                 /bin/rm -fr "${INT_LOG_FILE}"
206         fi
207 }
208
209
210 #------------------------------------------------
211 #       init_fota_dir
212 #------------------------------------------------
213 init_fota_dir() {
214
215         TEST_DIRS=("${FAKE_ROOT}${FOTA_LOG_DIR}" "${FAKE_ROOT}${FOTA_RESULT_DIR}" "${FAKE_ROOT}${FOTA_TEMP_DIR}")
216         for TEST_DIR in "${TEST_DIRS[@]}"; do
217                 if [ ! -e "${TEST_DIR}" ]; then
218                         if "$MKDIR" -p "${TEST_DIR}"; then
219                                 log "[Info] Successfully created <${TEST_DIR}>" "${INT_LOG_FILE}"
220                         else
221                                 log "[Error] Unable to create <${TEST_DIR}>"
222                         fi
223                 fi
224         done
225 }
226
227 #------------------------------------------------
228 #       do_reboot
229 #------------------------------------------------
230 do_reboot() {
231         log "Reboot"
232         "$SYNC"
233         "$REBOOT"
234         while true
235         do
236                 sleep 1
237                 echo "."
238         done
239 }
240
241 #------------------------------------------------
242 #       check_for_rw_power_fail
243 #------------------------------------------------
244 check_for_rw_power_fail() {
245         # Case : Power fail during RW update after RO update
246         if [ -r "${STATUS_FILE}" ]; then
247                 log "[Info] ${STATUS_FILE} exists" "${INT_LOG_FILE}"
248                 log "[Info] Status file: $("$CAT" "${STATUS_FILE}")" "${INT_LOG_FILE}"
249                 "$SYNC"
250                 umount_partitions
251                 exec /sbin/fus_rw-init
252         fi
253 }
254
255 #------------------------------------------------
256 #       check_for_fota_gui
257 #------------------------------------------------
258 check_for_fota_gui() {
259         if [ -r "${FOTA_GUI}" ]; then
260                 log "[Info] GUI Enabled" "${INT_LOG_FILE}"
261                 FOTA_GUI_ENABLE=1
262         fi
263 }
264
265 #------------------------------------------------
266 #       check_debug_mode
267 #------------------------------------------------
268 check_debug_mode() {
269         DEBUG_MODE_FILE=${FAKE_ROOT}/opt/usr/.upgdebug_ro
270         if [ -f "${DEBUG_MODE_FILE}" ]; then
271                 DEBUG_MODE_FILE_OWNER=$("${LS}" -l "${DEBUG_MODE_FILE}" | "${CUT}" -d " " -f 3)
272                 if [ "${DEBUG_MODE_FILE_OWNER}" = "0" ]; then
273                         log "[Info] Enter RO debug mode"
274                         log "[Info] If you want to continue FOTA, please remove ${DEBUG_MODE_FILE}"
275                         # Wait until debug mode file is removed
276                         while [ -f "${DEBUG_MODE_FILE}" ]; do
277                                 sleep 3
278                         done
279                         log "[Info] Debug mode file is removed. Resume FOTA"
280                 else
281                         log "[Info] Warning: somebody made non-root debug mode file... ignore it"
282                 fi
283         fi
284 }
285
286 #------------------------------------------------
287 #       remake_hash_table
288 #------------------------------------------------
289 remake_hash_table() {
290         if [ -f "${VERITYCTL}" ]; then
291                 if [ -f "${VERITY_HANDLER}" ]; then
292                         "$MOUNT" -o remount,ro "${FAKE_ROOT}"
293
294                         if ! "${VERITY_HANDLER}" "${PART_ROOTFS}"; then
295                                 log "[Error] verity-handler fail!!!"
296                                 return 1
297                         else
298                                 log "[Info] verity-handler success"
299                                 return 0
300                         fi
301                 else
302                         log "[Error] Warning: ${VERITYCTL} exists but ${VERITY_HANDLER} does not exists"
303                         return 2
304                 fi
305         else
306                 log "[Info] verityctl does not exist. Skip hash remaking"
307                 return 0
308         fi
309 }
310
311 #------------------------------------------------
312 #       Main Routine Start
313 #------------------------------------------------
314
315 mount_partitions
316
317 # For debugging - It should be deleted on Release
318 /sbin/agetty -l /bin/bash -n --keep-baud 115200,38400,9600 console linux &
319
320 check_debug_mode
321
322 init_internal_log
323
324 check_for_rw_power_fail
325
326 "$MOUNT" -o remount,rw "${FAKE_ROOT}"
327 init_fota_dir
328
329 check_for_fota_gui
330 if [ "$FOTA_GUI_ENABLE" = "1" ]; then
331         export XDG_RUNTIME_DIR=/run
332         export TBM_DISPLAY_SERVER=1
333
334         /usr/bin/fota_gui &
335         /usr/bin/sleep 2
336 fi
337 do_fota_update
338 fota_result=$?
339 if [ "$fota_result" = "0" ]; then
340         /bin/rm -fr "${DELTA_DIR:?}"/*
341 fi
342
343 remake_hash_table
344 remake_result=$?
345
346 RO_PROGRESS_FILE=/tmp/upgrade/ro_progress
347 if [ -f "${RO_PROGRESS_FILE}" ]; then
348         echo -1 > "${RO_PROGRESS_FILE}"
349 fi
350 umount_partitions
351
352 if [ "$fota_result" = "0" ] && [ "$remake_result" = "0" ]; then
353         exec /sbin/fus_rw-init
354 else
355         log "[Error] Upgrade FAILED"
356         do_reboot
357 fi