Run systemd directly
[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=/run/upgrade-sysroot
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 DMSETUP="dmsetup"
40 FSTRIM="fstrim"
41 STAT="stat"
42
43 FOTA_GUI="/usr/bin/fota_gui"
44 FOTA_GUI_ENABLE=
45
46 SYSTEM_DATA_MNT=opt
47 USER_MNT=opt/usr
48 HAL_MNT=hal
49
50 SCRIPT_NAME="fota-init.sh"
51 UPGRADE_SUCCESS=0
52 P_SLOT=""
53 SYSROOT_DIR="sysroot"
54 #------------------------------------------------
55 #       log msg [file]
56 #------------------------------------------------
57 log() {
58         # log format: [script_name][tag]actual_log
59         LOG="[${SCRIPT_NAME}]$1"
60         if [ "$2" != "" ]; then
61                 echo "$LOG" >> "$2"
62         fi
63         echo "$LOG"
64 }
65
66 #------------------------------------------------
67 #       get partition id
68 #------------------------------------------------
69 get_partition_id() {
70     P_SLOT=$([[ $(</proc/cmdline) =~ partition_ab=([ab]) ]]; echo ${BASH_REMATCH[1]})
71     P_SUFFIX=""
72
73     if [ "${P_SLOT}" != "" ]; then
74         P_SUFFIX="_${P_SLOT}"
75         echo "Using A/B slot: ${P_SLOT}"
76     fi
77
78     PART_ROOTFS=`/sbin/blkid -t PARTLABEL=rootfs${P_SUFFIX} -o device`
79     if [ x$PART_ROOTFS = "x" ]
80     then
81         PART_ROOTFS=`/sbin/blkid -L rootfs`
82     fi
83
84     PART_SYSTEM_DATA=`/sbin/blkid -t PARTLABEL=system-data -o device`
85     if [ x$PART_SYSTEM_DATA = "x" ]
86     then
87         PART_SYSTEM_DATA=`/sbin/blkid -L system-data`
88     fi
89
90     PART_RAMDISK=`/sbin/blkid -t PARTLABEL=ramdisk${P_SUFFIX} -o device`
91     if [ x$PART_RAMDISK = "x" ]
92     then
93         PART_RAMDISK=`/sbin/blkid -L ramdisk`
94     fi
95
96     PART_HAL=`/sbin/blkid -t PARTLABEL=hal${P_SUFFIX} -o device`
97     if [ x$PART_HAL = "x" ]
98     then
99         PART_HAL=`/sbin/blkid -L hal`
100     fi
101
102     PART_USER=$("$BLKID" --match-token PARTLABEL=user -o device || "$BLKID" --match-token LABEL=user -o device)
103 }
104
105 mount_bow_partition() {
106         LABEL=${1}
107         PARTITION=${2}
108         DIRECTORY=${3}
109         BOWDEV_NAME=bowdev_${LABEL}
110         BOWDEV_PATH=/dev/mapper/${BOWDEV_NAME}
111         SECTORS=$(</sys/class/block/$(lsblk -no NAME ${PARTITION})/size)
112
113         if ! "${DMSETUP}" create "${BOWDEV_NAME}" --table "0 ${SECTORS} bow ${PARTITION}" ; then
114                 log "[Error] Cannot create ${BOWDEV_NAME}"
115                 return 1
116         fi
117
118         if ! "${MOUNT}" "${BOWDEV_PATH}" "${DIRECTORY}" ; then
119                 log "[Error] Cannot mount ${BOWDEV_PATH} into ${DIRECTORY}"
120                 return 1
121         fi
122
123         "${FSTRIM}" -v "${DIRECTORY}"
124
125         DM_NUMBER=$(($("${STAT}" -c "0x%T" $(readlink -f "${BOWDEV_PATH}"))))
126         echo 1 > /sys/block/dm-${DM_NUMBER}/bow/state
127         log "[Debug] Mounted ${PARTITION} as DM-BOW" "${INT_LOG_FILE}"
128 }
129
130 mount_f2fs_partition() {
131         LABEL=${1}
132         PARTITION=${2}
133         DIRECTORY=${3}
134         if ! "${MOUNT}" -o checkpoint=disable "${PARTITION}" "${DIRECTORY}" ; then
135                 log "[Error] Cannot mount ${PARTITION} into ${DIRECTORY}"
136                 return 1
137         fi
138         log "[Debug] Mounted ${PARTITION} as F2FS checkpoint=disable" "${INT_LOG_FILE}"
139 }
140
141 mount_checkpoint_partition() {
142         LABEL=${1}
143         PARTITION=${2}
144         DIRECTORY=${3}
145         FSTYPE=$(lsblk -o FSTYPE -n "${PARTITION}")
146
147         if [ "${FSTYPE}" = "ext4" ]; then
148                 if ! mount_bow_partition "${LABEL}" "${PARTITION}" "${DIRECTORY}" ; then
149                         return 1
150                 fi
151         elif [ "${FSTYPE}" = "f2fs" ]; then
152                 if ! mount_f2fs_partition "${LABEL}" "${PARTITION}" "${DIRECTORY}" ; then
153                         return 1
154                 fi
155         else
156                 "${MOUNT}" "${PARTITION}" "${DIRECTORY}"
157                 log "[Info] Unsupported filesystem ${FSTYPE} on ${PARTITION}" "${INT_LOG_FILE}"
158         fi
159 }
160
161 commit_bow_partition()
162 {
163         LABEL=${1}
164
165         BOWDEV_NAME=bowdev_${LABEL}
166         BOWDEV_PATH=/dev/mapper/${BOWDEV_NAME}
167         DM_NUMBER=$(($("${STAT}" -c "0x%T" $(readlink -f "${BOWDEV_PATH}"))))
168         echo 2 > /sys/block/dm-${DM_NUMBER}/bow/state
169         log "[Info] Changes on partition ${LABEL} commited (dm-bow)" "${INT_LOG_FILE}"
170 }
171
172 commit_f2fs_partition()
173 {
174         LABEL=${1}
175         PART_SYSTEM_DATA=$(blkid --match-token PARTLABEL="${LABEL}" -o device || blkid --match-token LABEL="${LABEL}" -o device)
176         "${MOUNT}" -o remount,checkpoint=enable "${PART_SYSTEM_DATA}"
177         log "[Info] Changes on partition ${LABEL} commited (f2fs)" "${INT_LOG_FILE}"
178 }
179
180 commit_partition()
181 {
182         LABEL=${1}
183         MNT_POINT=${2}
184         TYPE=$(blkid --match-token LABEL="${LABEL}" -o value -s TYPE | tail -n 1)
185         if [ "${TYPE}" = "ext4" ]; then
186                 commit_bow_partition "${LABEL}"
187         elif [ "${TYPE}" = "f2fs" ]; then
188                 commit_f2fs_partition "${LABEL}"
189         else
190                 log "[Info] Cannot commit ${LABEL}: Unsupported filesystem ${TYPE}" "${INT_LOG_FILE}"
191         fi
192 }
193
194 mount_rootfs()
195 {
196         /usr/bin/verityctl create rootfs "${PART_ROOTFS}" "${FAKE_ROOT}"
197         case $? in
198             0)
199                 echo "verifyboot: disabled"
200                 # do nothing
201                 ;;
202             1)
203                 echo "verityboot: enabled";
204                 return
205                 ;;
206             2)
207                 echo "verifyboot: enabled but corrupted"
208                 # should deal with the error like reboot.
209                 ;;
210             3)
211                 echo "verifyboot: disabling"
212                 ;;
213         esac
214         "$MOUNT" -o ro "${PART_ROOTFS}" "${FAKE_ROOT}"
215 }
216
217 #------------------------------------------------
218 #       mount_partitions
219 #------------------------------------------------
220 mount_partitions() {
221
222         if [[ "${P_SLOT}" != "" ]]
223         then
224                 # For A/B Update rootfs should be updated before the system boots in fota mode.
225                 # Therefore rootfs should be mounted as RO.
226                 # We cannot mount rootfs as RW because mount timestamp would
227                 # change and dmverity data would become incorrect
228                 mount_rootfs
229         else
230                 if ! mount_checkpoint_partition rootfs "${PART_ROOTFS}" "${FAKE_ROOT}"; then
231                         return 1
232                 fi
233         fi
234
235         if ! mount_checkpoint_partition system-data "${PART_SYSTEM_DATA}" "${FAKE_ROOT}/${SYSTEM_DATA_MNT}"; then
236                 return 1
237         fi
238
239         if [ ! "z${PART_USER}" = "z" ]; then
240                 if ! mount_checkpoint_partition user "${PART_USER}" "${FAKE_ROOT}/${USER_MNT}"; then
241                         return 1
242                 fi
243         fi
244         if [ "${P_SUFFIX}" == "" ]; then
245                 if [ ! "z${PART_HAL}" = "z" ]; then
246                         if ! mount_checkpoint_partition hal "${PART_HAL}" "${FAKE_ROOT}/${HAL_MNT}"; then
247                                 return 1
248                         fi
249                 fi
250         else
251                 "$MOUNT" "${PART_HAL}" "${FAKE_ROOT}/${HAL_MNT}"
252         fi
253
254         "$MOUNT" -t proc none "${FAKE_ROOT}/proc"
255         "$MOUNT" -t sysfs none "${FAKE_ROOT}/sys"
256         "$MOUNT" -t devtmpfs devtmpfs "${FAKE_ROOT}/dev"
257         "$MOUNT" -t devpts devpts "${FAKE_ROOT}/dev/pts"
258 }
259
260 umount_bow_partition()
261 {
262         LABEL=${1}
263         PART=${2}
264
265         "$UMOUNT" "${PART}"
266
267         BOWDEV_NAME=bowdev_${LABEL}
268         "${DMSETUP}" remove ${BOWDEV_NAME}
269 }
270
271 umount_partition()
272 {
273         LABEL=${1}
274         DIRECTORY=${2}
275
276         TYPE=$(blkid --match-token LABEL="${LABEL}" -o value -s TYPE | tail -n 1)
277         if [ "${TYPE}" = "ext4" ]; then
278                 umount_bow_partition "${LABEL}" "${DIRECTORY}"
279         else
280                 "$UMOUNT" "${DIRECTORY}"
281         fi
282 }
283
284 #------------------------------------------------
285 #       umount_partitions
286 #------------------------------------------------
287 umount_partitions() {
288
289         "$UMOUNT" "${FAKE_ROOT}/dev/pts"
290         "$UMOUNT" "${FAKE_ROOT}/dev"
291         "$UMOUNT" "${FAKE_ROOT}/sys"
292         "$UMOUNT" "${FAKE_ROOT}/proc"
293
294         if [ "${P_SUFFIX}" == "" ]; then
295                 if [ ! "z${PART_HAL}" = "z" ]; then
296                         if [ "${UPGRADE_SUCCESS}" = "1" ]; then
297                                         commit_partition hal "${FAKE_ROOT}/${HAL_MNT}"
298                         fi
299                         umount_partition hal "${FAKE_ROOT}/${HAL_MNT}"
300                 fi
301         else
302                 "$UMOUNT" "${FAKE_ROOT}/${HAL_MNT}"
303         fi
304
305         if [ ! "z${PART_USER}" = "z" ]; then
306                 if [ "${UPGRADE_SUCCESS}" = "1" ]; then
307                         commit_partition user "${FAKE_ROOT}/${USER_MNT}"
308                 fi
309                 umount_partition user "${FAKE_ROOT}/${USER_MNT}"
310         fi
311
312         if [ "${UPGRADE_SUCCESS}" = "1" ]; then
313                 commit_partition system-data "${FAKE_ROOT}/${SYSTEM_DATA_MNT}"
314         fi
315         umount_partition system-data "${FAKE_ROOT}/${SYSTEM_DATA_MNT}"
316
317         if [[ "${P_SLOT}" != "" ]]
318         then
319                 "$UMOUNT" "${FAKE_ROOT}"
320         else
321                 if [ "${UPGRADE_SUCCESS}" = "1" ]; then
322                         commit_partition rootfs "${FAKE_ROOT}"
323                 fi
324                 umount_partition rootfs "${FAKE_ROOT}"
325         fi
326 }
327
328 #------------------------------------------------
329 #       handle_no_delta
330 #------------------------------------------------
331 handle_no_delta() {
332         log "[Error] delta does not exist ..." "${INT_LOG_FILE}"
333
334         echo "${UPI_NO_DELTA_ERROR}" > "${RESULT_FILE}"
335 }
336
337 #------------------------------------------------
338 #       handle_no_ua
339 #------------------------------------------------
340 handle_no_ua() {
341         log "[Error] ua does not exist ..." "${INT_LOG_FILE}"
342
343         echo "${UPI_NO_UA_ERROR}" > "${RESULT_FILE}"
344 }
345
346 #------------------------------------------------
347 #       do_create_part_table
348 #------------------------------------------------
349 do_create_part_table() {
350
351         EMMC_DEVICE="/dev/mmcblk0"
352         PART_LIST=$("$BLKID" -o full | "$GREP" "${EMMC_DEVICE}p" |
353                         "$SED" -e 's/\/dev\/mmcblk0p//g' -e 's/\ .*LABEL=\"\(.*\).*$/\1/' |
354                         "$CUT" -d '"' -f 1 | "$SED" 's/\:/\ /' |
355                         "$TR" '[:upper:]' '[:lower:]' |
356                         "$SORT" -k 1 -n)
357         PART_NUM=$(echo "$PART_LIST" | "$WC" -l)
358
359         echo "$PART_NUM" > "${PART_TBL_PATH}"
360         echo "$PART_LIST" >> "${PART_TBL_PATH}"
361         "$SYNC"
362 }
363
364 #------------------------------------------------
365 #       do_fota_update
366 #------------------------------------------------
367 do_fota_update() {
368         log "[Info] fota update start ..." "${INT_LOG_FILE}"
369
370         DELTA_DIR=$("$CAT" "${DELTA_PATH_FILE}")
371         log "[Info] DELTA_DIR = ${DELTA_DIR}" "${INT_LOG_FILE}"
372
373         RESULT_FILE=${FAKE_ROOT}${FOTA_RESULT_DIR}/result
374         if [ -e "${RESULT_FILE}" ]; then
375                 rm -fr "${RESULT_FILE}"
376         fi
377
378         UA=${DELTA_DIR}/delta.ua
379         if [ ! -s "${UA}" ]; then
380                 handle_no_ua
381                 return 1
382         fi
383
384         /bin/chmod +x "${UA}"
385
386         DELTA=${DELTA_DIR}/delta.tar
387         if [ ! -s "${DELTA}" ]; then
388                 handle_no_delta
389                 return 1
390         fi
391
392         do_create_part_table
393         if [ ! -e "${PART_TBL_PATH}" ]; then
394                 log "[Error] No partition table" "${INT_LOG_FILE}"
395                 return 1
396         fi
397
398         VERIFY_TOOL=/usr/sbin/img-verifier
399         if [ -e "${VERIFY_TOOL}" ]; then
400                 if ! "${VERIFY_TOOL}" -i "${DELTA}" -l "/opt/var/log/last_iv.log"; then
401                         log "[Error] signature verification failed!" "${INT_LOG_FILE}"
402                         return 1
403                 else
404                         log "[Info] update package verification success"
405                 fi
406         else
407                 log "[Error] Warning: No signature verifier... Skip it" "${INT_LOG_FILE}"
408         fi
409
410         FOTA_ARG="1"
411         if [ "$FOTA_GUI_ENABLE" = "1" ]; then
412                 FOTA_ARG="0"
413         fi
414         if ! "${UA}" "${DELTA_DIR}" "${FOTA_TEMP_DIR}" "$FOTA_ARG"; then
415                 log "[Error] update agent fail!!!" "${INT_LOG_FILE}"
416                 return 1
417         else
418                 log "[Info] update agent success"
419                 return 0
420         fi
421
422 }
423
424 #------------------------------------------------
425 #       clear_internal_log
426 #------------------------------------------------
427 clear_internal_log() {
428
429         if [ -e "${INT_LOG_FILE}" ]; then
430                 /bin/rm -fr "${INT_LOG_FILE}"
431         fi
432 }
433
434
435 #------------------------------------------------
436 #       init_fota_dir
437 #------------------------------------------------
438 init_fota_dir() {
439
440         TEST_DIRS=("${FAKE_ROOT}${FOTA_LOG_DIR}" "${FAKE_ROOT}${FOTA_RESULT_DIR}" "${FAKE_ROOT}${FOTA_TEMP_DIR}")
441         for TEST_DIR in "${TEST_DIRS[@]}"; do
442                 if [ ! -e "${TEST_DIR}" ]; then
443                         if "$MKDIR" -p "${TEST_DIR}"; then
444                                 log "[Info] Successfully created <${TEST_DIR}>" "${INT_LOG_FILE}"
445                         else
446                                 log "[Error] Unable to create <${TEST_DIR}>"
447                         fi
448                 fi
449         done
450 }
451
452 #------------------------------------------------
453 #       do_reboot
454 #------------------------------------------------
455 do_reboot() {
456         log "Reboot"
457         "$SYNC"
458         "$REBOOT"
459         while true
460         do
461                 sleep 1
462                 echo "."
463         done
464 }
465
466 #------------------------------------------------
467 #       check_for_rw_power_fail
468 #------------------------------------------------
469 check_for_rw_power_fail() {
470         # Case : Power fail during RW update after RO update
471         if [ -r "${STATUS_FILE}" ]; then
472                 log "[Info] ${STATUS_FILE} exists" "${INT_LOG_FILE}"
473                 log "[Info] Status file: $("$CAT" "${STATUS_FILE}")" "${INT_LOG_FILE}"
474                 UPGRADE_SUCCESS=1
475                 "$SYNC"
476                 umount_partitions
477                 exec /sbin/fus_rw-init
478         fi
479 }
480
481 #------------------------------------------------
482 #       check_for_fota_gui
483 #------------------------------------------------
484 check_for_fota_gui() {
485         if [ -r "${FOTA_GUI}" ]; then
486                 log "[Info] GUI Enabled" "${INT_LOG_FILE}"
487                 FOTA_GUI_ENABLE=1
488         fi
489 }
490
491 #------------------------------------------------
492 #       check_debug_mode
493 #------------------------------------------------
494 check_debug_mode() {
495         DEBUG_MODE_FILE=${FAKE_ROOT}/opt/usr/.upgdebug_ro
496         if [ -f "${DEBUG_MODE_FILE}" ]; then
497                 DEBUG_MODE_FILE_OWNER=$("${LS}" -l "${DEBUG_MODE_FILE}" | "${CUT}" -d " " -f 3)
498                 if [ "${DEBUG_MODE_FILE_OWNER}" = "0" ]; then
499                         log "[Info] Enter RO debug mode"
500                         log "[Info] If you want to continue FOTA, please remove ${DEBUG_MODE_FILE}"
501                         # Wait until debug mode file is removed
502                         while [ -f "${DEBUG_MODE_FILE}" ]; do
503                                 sleep 3
504                         done
505                         log "[Info] Debug mode file is removed. Resume FOTA"
506                 else
507                         log "[Info] Warning: somebody made non-root debug mode file... ignore it"
508                 fi
509         fi
510 }
511
512 #------------------------------------------------
513 #       remake_hash_table
514 #------------------------------------------------
515 remake_hash_table() {
516         if [ -f "${VERITYCTL}" ]; then
517                 if [ -f "${VERITY_HANDLER}" ]; then
518                         "$MOUNT" -o remount,ro "${FAKE_ROOT}"
519
520                         if ! "${VERITY_HANDLER}" "${PART_ROOTFS}"; then
521                                 log "[Error] verity-handler fail!!!"
522                                 return 1
523                         else
524                                 log "[Info] verity-handler success"
525                                 return 0
526                         fi
527                 else
528                         log "[Error] Warning: ${VERITYCTL} exists but ${VERITY_HANDLER} does not exists"
529                         return 2
530                 fi
531         else
532                 log "[Info] verityctl does not exist. Skip hash remaking"
533                 return 0
534         fi
535 }
536
537 #------------------------------------------------
538 #       mark_rw_update
539 #------------------------------------------------
540 mark_rw_update() {
541         echo "start" > ${STATUS_FILE}
542 }
543
544 #------------------------------------------------
545 #       jump_to_ramdisk
546 #------------------------------------------------
547 jump_to_ramdisk() {
548         "${MOUNT}" "${PART_RAMDISK}" "${FAKE_ROOT}"
549         cd "${FAKE_ROOT}"
550         mkdir -p "${SYSROOT_DIR}"
551         ./sbin/pivot_root . ./${SYSROOT_DIR}
552         ./bin/mount -M ./${SYSROOT_DIR}/dev /dev
553         ./bin/mount -M ./${SYSROOT_DIR}/sys /sys
554         ./bin/mount -M ./${SYSROOT_DIR}/proc /proc
555         ./bin/umount -l ./${SYSROOT_DIR}
556         ./bin/umount -l /dev
557         ./bin/umount -l /sys
558         ./bin/umount -l /proc
559         exec chroot . /sbin/init
560         # WARNING! never rearch
561         log "[Error] jump_to_ramdisk() failed"
562         exec /bin/sh
563 }
564
565 #------------------------------------------------
566 #       prepare_fakeroot
567 #------------------------------------------------
568 prepare_fakeroot() {
569     mkdir -p ${FAKE_ROOT}
570 }
571
572 #------------------------------------------------
573 #       log boot info
574 #------------------------------------------------
575 function log_boot_info() {
576     CMDLINE_ROOT=$([[ $(</proc/cmdline) =~ (root=[^ ]*) ]]; echo ${BASH_REMATCH[1]})
577     CMDLINE_PARTITION_AB=$([[ $(</proc/cmdline) =~ (partition_ab=[ab]) ]]; echo ${BASH_REMATCH[1]})
578     CMDLINE_BOOTMODE=$([[ $(</proc/cmdline) =~ (bootmode=[^ ]*) ]]; echo ${BASH_REMATCH[1]})
579     log "[Info] Initrd-fota booting (/proc/cmdline $CMDLINE_BOOTMODE $CMDLINE_PARTITION_AB $CMDLINE_ROOT)"
580 }
581
582 #------------------------------------------------
583 #       Main Routine Start
584 #------------------------------------------------
585
586 get_partition_id
587 prepare_fakeroot
588
589 if ! mount_partitions ; then
590         umount_partitions
591         log "[Error] Upgrade failed"
592         do_reboot
593 fi
594
595 log_boot_info
596
597 if [ "${P_SLOT}" != "" ]
598 then
599         log "[Info] FOTA with A/B detected - skip RO update"
600
601         UPGRADE_SUCCESS=1
602         umount_partitions
603         exec /sbin/fus_rw-init
604 fi
605
606 # For debugging - It should be deleted on Release
607 /sbin/agetty -l /bin/bash -n --keep-baud 115200,38400,9600 console linux &
608
609 check_debug_mode
610
611 clear_internal_log
612
613 check_for_rw_power_fail
614
615 "$MOUNT" -o remount,rw "${FAKE_ROOT}"
616 init_fota_dir
617
618 check_for_fota_gui
619 if [ "$FOTA_GUI_ENABLE" = "1" ]; then
620         export XDG_RUNTIME_DIR=/run
621         export TBM_DISPLAY_SERVER=1
622
623         /usr/bin/fota_gui &
624         /usr/bin/sleep 2
625 fi
626 /sbin/progress_restart RO &
627 do_fota_update
628 fota_result=$?
629 if [ "$fota_result" = "0" ]; then
630         /bin/rm -fr "${DELTA_DIR:?}"/*
631 fi
632
633 remake_hash_table
634 remake_result=$?
635
636 RO_PROGRESS_FILE=/tmp/upgrade/ro_progress
637 if [ -f "${RO_PROGRESS_FILE}" ]; then
638         echo -1 > "${RO_PROGRESS_FILE}"
639 fi
640
641 if [ "$fota_result" = "0" ] && [ "$remake_result" = "0" ]; then
642         UPGRADE_SUCCESS=1
643         mark_rw_update
644         umount_partitions
645         exec /sbin/fus_rw-init
646 else
647         umount_partitions
648         log "[Error] Upgrade FAILED"
649         do_reboot
650 fi