No more check the number of partition from fstab
[platform/core/system/initrd-fota.git] / scripts / fota-init.sh
1 #!/bin/bash
2
3 WITH_USR_PART=
4
5 FAKE_ROOT=/system
6
7 UPI_NO_DELTA_ERROR=fb15
8 UPI_NO_UA_ERROR=fa17
9
10 STATUS_DIR=${FAKE_ROOT}/opt/data/update
11 STATUS_FILE=${STATUS_DIR}/RW.STATUS
12 DELTA_PATH_FILE=${STATUS_DIR}/DELTA.PATH
13 INT_LOG_DIR=${STATUS_DIR}
14 INT_LOG_FILE=${INT_LOG_DIR}/fota_internal.log
15
16 FOTA_LOG_DIR=/opt/data/update
17 FOTA_RESULT_DIR=${FOTA_LOG_DIR}
18 FOTA_TEMP_DIR=${FOTA_LOG_DIR}
19
20 PART_TBL_FILE="part_tbl.txt"
21 PART_TBL_PATH=${FOTA_TEMP_DIR}/${PART_TBL_FILE}
22
23 CAT="/bin/cat"
24 SYNC="/bin/sync"
25 MKDIR="/bin/mkdir"
26 REBOOT="/sbin/reboot"
27 MOUNT="/bin/mount"
28 UMOUNT="/bin/umount"
29 GREP="/bin/grep"
30 CUT="/usr/bin/cut"
31 TR="/usr/bin/tr"
32 BLKID="/usr/sbin/blkid"
33 SORT="/usr/bin/sort"
34 SED="/usr/bin/sed"
35 WC="/usr/bin/wc"
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/upg-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         if [ "$FOTA_GUI_ENABLE" = "1" ]; then
172                 ${UA} ${DELTA_DIR} ${FOTA_TEMP_DIR} 0
173         else
174                 ${UA} ${DELTA_DIR} ${FOTA_TEMP_DIR} 1
175         fi
176
177         if [ $? -ne 0 ]; then
178                 echo "update agent fail!!!" >> ${INT_LOG_FILE}
179                 return 1
180         else
181                 echo "update agent success"
182                 return 0
183         fi
184
185 }
186
187 #------------------------------------------------
188 #       init_internal_log
189 #------------------------------------------------
190 init_internal_log() {
191
192         if [ -e "${INT_LOG_FILE}" ]; then
193                 /bin/rm -fr ${INT_LOG_FILE}
194         fi
195 }
196
197
198 #------------------------------------------------
199 #       init_fota_dir
200 #------------------------------------------------
201 init_fota_dir() {
202
203         TEST_DIR=${FAKE_ROOT}${FOTA_LOG_DIR}
204         if [ ! -e ${TEST_DIR} ]; then
205                 "$MKDIR" -p ${TEST_DIR}
206                 if [ "$?" = "0" ]; then
207                         echo "success to create ${TEST_DIR}" >> ${INT_LOG_FILE}
208                 fi
209         fi
210
211         TEST_DIR=${FAKE_ROOT}${FOTA_RESULT_DIR}
212         if [ ! -e ${TEST_DIR} ]; then
213                 "$MKDIR" -p ${TEST_DIR}
214                 if [ "$?" = "0" ]; then
215                         echo "success to create ${TEST_DIR}" >> ${INT_LOG_FILE}
216                 fi
217         fi
218
219         TEST_DIR=${FAKE_ROOT}${FOTA_TEMP_DIR}
220         if [ ! -e ${TEST_DIR} ]; then
221                 "$MKDIR" -p ${TEST_DIR}
222                 if [ "$?" = "0" ]; then
223                         echo "success to create ${TEST_DIR}" >> ${INT_LOG_FILE}
224                 fi
225         fi
226
227 }
228
229 #------------------------------------------------
230 #       do_reboot
231 #------------------------------------------------
232 do_reboot() {
233         echo "Reboot"
234         "$SYNC"
235         "$REBOOT"
236         while [ 1 ]
237         do
238                 sleep 1
239                 echo "."
240         done
241 }
242
243 #------------------------------------------------
244 #       check_for_rw_power_fail
245 #------------------------------------------------
246 check_for_rw_power_fail() {
247         # Case : Power fail during RW update after RO update
248         if [ -r ${STATUS_FILE} ]; then
249                 echo "${STATUS_FILE} exists" >> ${INT_LOG_FILE}
250                 /bin/cat ${STATUS_FILE} >> ${INT_LOG_FILE}
251                 "$SYNC"
252                 umount_partitions
253                 exec /sbin/fus_rw-init
254         fi
255 }
256
257 #------------------------------------------------
258 #       check_for_fota_gui
259 #------------------------------------------------
260 check_for_fota_gui() {
261         if [ -r ${FOTA_GUI} ]; then
262                 echo "GUI Enabled" >> ${INT_LOG_FILE}
263                 FOTA_GUI_ENABLE=1
264         fi
265 }
266
267
268 #------------------------------------------------
269 #       Main Routine Start
270 #------------------------------------------------
271
272 mount_partitions
273
274 # For debugging - It should be deleted on Release (TODO : tty like ttyS0, S1 should be selected automatically)
275 /sbin/agetty -l /bin/bash -n --keep-baud 115200,38400,9600 ttyS0 linux &
276
277 init_internal_log
278
279 check_for_rw_power_fail
280
281 "$MOUNT" -o remount,rw ${FAKE_ROOT}
282 init_fota_dir
283
284 check_for_fota_gui
285 if [ "$FOTA_GUI_ENABLE" = "1" ]; then
286         export XDG_RUNTIME_DIR=/run
287         export TBM_DISPLAY_SERVER=1
288
289         /usr/bin/fota_gui &
290         /usr/bin/sleep 2
291 fi
292 do_fota_update
293 fota_result=$?
294 if [ "$FOTA_GUI_ENABLE" = "1" ]; then
295         /usr/bin/fota_gui_test -1
296 fi
297 if [ "$fota_result" = "0" ]; then
298         /bin/rm -fr ${DELTA_DIR}
299 fi
300 umount_partitions
301
302 if [ "$fota_result" = "0" ]; then
303         exec /sbin/fus_rw-init
304 else
305         echo "Upgrade FAILED"
306         do_reboot
307 fi