2 PATH=/bin:/usr/bin:/sbin:/usr/sbin
6 UPI_NO_DELTA_ERROR=fb15
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
15 FOTA_LOG_DIR=/opt/data/update
16 FOTA_RESULT_DIR=${FOTA_LOG_DIR}
17 FOTA_TEMP_DIR=${FOTA_LOG_DIR}
19 PART_TBL_FILE="part_tbl.txt"
20 PART_TBL_PATH=${FOTA_TEMP_DIR}/${PART_TBL_FILE}
31 BLKID="/usr/sbin/blkid"
36 VERITYCTL="/usr/bin/verityctl"
37 VERITY_HANDLER="/usr/bin/verity_handler"
39 FOTA_GUI="/usr/bin/fota_gui"
45 SCRIPT_NAME="fota-init.sh"
46 #------------------------------------------------
48 #------------------------------------------------
50 # log format: [script_name][tag]actual_log
51 LOG="[${SCRIPT_NAME}]$1"
52 if [ "$2" != "" ]; then
58 #------------------------------------------------
60 #------------------------------------------------
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)
67 #------------------------------------------------
69 #------------------------------------------------
73 "$MOUNT" -o ro "${PART_ROOTFS}" "${FAKE_ROOT}"
74 "$MOUNT" "${PART_SYSTEM_DATA}" "${FAKE_ROOT}/${SYSTEM_DATA_MNT}"
76 if [ ! "z${PART_USER}" = "z" ]; then
77 "$MOUNT" "${PART_USER}" "${FAKE_ROOT}/${USER_MNT}"
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"
86 #------------------------------------------------
88 #------------------------------------------------
91 "$UMOUNT" "${FAKE_ROOT}/dev/pts"
92 "$UMOUNT" "${FAKE_ROOT}/dev"
93 "$UMOUNT" "${FAKE_ROOT}/sys"
94 "$UMOUNT" "${FAKE_ROOT}/proc"
96 if [ ! "z${PART_USER}" = "z" ]; then
97 "$UMOUNT" "${FAKE_ROOT}/${USER_MNT}"
99 "$UMOUNT" "${FAKE_ROOT}/${SYSTEM_DATA_MNT}"
100 "$UMOUNT" "${FAKE_ROOT}"
103 #------------------------------------------------
105 #------------------------------------------------
107 log "[Error] delta does not exist ..." "${INT_LOG_FILE}"
109 echo "${UPI_NO_DELTA_ERROR}" > "${RESULT_FILE}"
112 #------------------------------------------------
114 #------------------------------------------------
116 log "[Error] ua does not exist ..." "${INT_LOG_FILE}"
118 echo "${UPI_NO_UA_ERROR}" > "${RESULT_FILE}"
121 #------------------------------------------------
122 # do_create_part_table
123 #------------------------------------------------
124 do_create_part_table() {
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:]' |
132 PART_NUM=$(echo "$PART_LIST" | "$WC" -l)
134 echo "$PART_NUM" > "${PART_TBL_PATH}"
135 echo "$PART_LIST" >> "${PART_TBL_PATH}"
139 #------------------------------------------------
141 #------------------------------------------------
143 log "[Info] fota update start ..." "${INT_LOG_FILE}"
145 DELTA_DIR=$("$CAT" "${DELTA_PATH_FILE}")
146 log "[Info] DELTA_DIR = ${DELTA_DIR}" "${INT_LOG_FILE}"
148 RESULT_FILE=${FAKE_ROOT}${FOTA_RESULT_DIR}/result
149 if [ -e "${RESULT_FILE}" ]; then
150 rm -fr "${RESULT_FILE}"
153 UA=${DELTA_DIR}/delta.ua
154 if [ ! -s "${UA}" ]; then
159 /bin/chmod +x "${UA}"
161 DELTA=${DELTA_DIR}/delta.tar
162 if [ ! -s "${DELTA}" ]; then
168 if [ ! -e "${PART_TBL_PATH}" ]; then
169 log "[Error] No partition table" "${INT_LOG_FILE}"
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}"
179 log "[Info] update package verification success"
182 log "[Error] Warning: No signature verifier... Skip it" "${INT_LOG_FILE}"
186 if [ "$FOTA_GUI_ENABLE" = "1" ]; then
189 if ! "${UA}" "${DELTA_DIR}" "${FOTA_TEMP_DIR}" "$FOTA_ARG"; then
190 log "[Error] update agent fail!!!" "${INT_LOG_FILE}"
193 log "[Info] update agent success"
199 #------------------------------------------------
201 #------------------------------------------------
202 init_internal_log() {
204 if [ -e "${INT_LOG_FILE}" ]; then
205 /bin/rm -fr "${INT_LOG_FILE}"
210 #------------------------------------------------
212 #------------------------------------------------
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}"
221 log "[Error] Unable to create <${TEST_DIR}>"
227 #------------------------------------------------
229 #------------------------------------------------
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}"
251 exec /sbin/fus_rw-init
255 #------------------------------------------------
257 #------------------------------------------------
258 check_for_fota_gui() {
259 if [ -r "${FOTA_GUI}" ]; then
260 log "[Info] GUI Enabled" "${INT_LOG_FILE}"
265 #------------------------------------------------
267 #------------------------------------------------
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
279 log "[Info] Debug mode file is removed. Resume FOTA"
281 log "[Info] Warning: somebody made non-root debug mode file... ignore it"
286 #------------------------------------------------
288 #------------------------------------------------
289 remake_hash_table() {
290 if [ -f "${VERITYCTL}" ]; then
291 if [ -f "${VERITY_HANDLER}" ]; then
292 "$MOUNT" -o remount,ro "${FAKE_ROOT}"
294 if ! "${VERITY_HANDLER}" "${PART_ROOTFS}"; then
295 log "[Error] verity-handler fail!!!"
298 log "[Info] verity-handler success"
302 log "[Error] Warning: ${VERITYCTL} exists but ${VERITY_HANDLER} does not exists"
306 log "[Info] verityctl does not exist. Skip hash remaking"
311 #------------------------------------------------
313 #------------------------------------------------
317 # For debugging - It should be deleted on Release
318 /sbin/agetty -l /bin/bash -n --keep-baud 115200,38400,9600 console linux &
324 check_for_rw_power_fail
326 "$MOUNT" -o remount,rw "${FAKE_ROOT}"
330 if [ "$FOTA_GUI_ENABLE" = "1" ]; then
331 export XDG_RUNTIME_DIR=/run
332 export TBM_DISPLAY_SERVER=1
339 if [ "$fota_result" = "0" ]; then
340 /bin/rm -fr "${DELTA_DIR:?}"/*
346 RO_PROGRESS_FILE=/tmp/upgrade/ro_progress
347 if [ -f "${RO_PROGRESS_FILE}" ]; then
348 echo -1 > "${RO_PROGRESS_FILE}"
352 if [ "$fota_result" = "0" ] && [ "$remake_result" = "0" ]; then
353 exec /sbin/fus_rw-init
355 log "[Error] Upgrade FAILED"