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