f4758dd13f69f4f6ecbb641020ace9c9d743a944
[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 AWK="/usr/bin/awk"
32 PARTX="/usr/sbin/partx"
33 BLKID="/usr/sbin/blkid"
34 SORT="/usr/bin/sort"
35
36 SYSTEM_DATA_MNT=opt
37 USER_MNT=opt/usr
38
39 #------------------------------------------------
40 #       get partition id
41 #------------------------------------------------
42 get_partition_id() {
43         EMMC_DEVICE="/dev/mmcblk0"
44         RET_PARTX=$("$PARTX" -s ${EMMC_DEVICE})
45         TEST=$(IFS=; echo $RET_PARTX | "$AWK" 'NR>1' | "$AWK" '{print $6}')
46         if [ "z$TEST" == "z" ]; then
47                 PART_ROOTFS=$("$BLKID" -L "rootfs" -o device)
48                 PART_SYSTEM_DATA=$("$BLKID" -L "system-data" -o device)
49                 PART_USER=$("$BLKID" -L "user" -o device)
50         else
51                 PART_ROOTFS=${EMMC_DEVICE}p$(IFS=; echo $RET_PARTX | "$AWK" 'tolower($6) == "rootfs" {print $1}')
52                 PART_SYSTEM_DATA=${EMMC_DEVICE}p$(IFS=; echo $RET_PARTX | "$AWK" 'tolower($6) == "system-data" {print $1}')
53                 PART_USER=${EMMC_DEVICE}p$(IFS=; echo $RET_PARTX | "$AWK" 'tolower($6) == "user" {print $1}')
54         fi
55 }
56
57 #------------------------------------------------
58 #       mount_partitions
59 #------------------------------------------------
60 mount_partitions() {
61         get_partition_id
62
63         "$MOUNT" -t ext4 -o ro ${PART_ROOTFS} ${FAKE_ROOT}
64         "$MOUNT" -t ext4 ${PART_SYSTEM_DATA} ${FAKE_ROOT}/${SYSTEM_DATA_MNT}
65         "$MOUNT" -t ext4 ${PART_USER} ${FAKE_ROOT}/${USER_MNT}
66
67         "$MOUNT" -t proc none ${FAKE_ROOT}/proc
68         "$MOUNT" -t sysfs none ${FAKE_ROOT}/sys
69         "$MOUNT" -t devtmpfs devtmpfs ${FAKE_ROOT}/dev
70         "$MOUNT" -t devpts devpts ${FAKE_ROOT}/dev/pts
71 }
72
73 #------------------------------------------------
74 #       umount_partitions
75 #------------------------------------------------
76 umount_partitions() {
77
78         "$UMOUNT" ${FAKE_ROOT}/dev/pts
79         "$UMOUNT" ${FAKE_ROOT}/dev
80         "$UMOUNT" ${FAKE_ROOT}/sys
81         "$UMOUNT" ${FAKE_ROOT}/proc
82
83         "$UMOUNT" ${FAKE_ROOT}/${USER_MNT}
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         RET_PARTX=$("$PARTX" -s ${EMMC_DEVICE})
113         TEST=$(IFS=; echo $RET_PARTX | "$AWK" 'NR>1' | "$AWK" '{print $6}')
114         if [ "z$TEST" == "z" ]; then
115                 RET_PARTX=$("$BLKID" -o full | "$GREP" ${EMMC_DEVICE}p | "$SED" 's/\/dev\/mmcblk0p//g' |
116                                 "$AWK" '{for (n=1;n<=NF;n++) if($n ~ "LABEL") print $1 " " toupper($n)}' |
117                                 "$SED" 's/LABEL=//g' | "$SED" 's/[\"\:]//g' | "$SORT" -k 1 -n)
118         else
119                 RET_PARTX=$("$PARTX" -s ${EMMC_DEVICE} | "$AWK" 'NR>1' | "$AWK" '{print $1 " " toupper($6)}')
120         fi
121         PART_NUM=$(echo "$RET_PARTX" | "$AWK" 'END{print FNR}')
122
123         echo "$PART_NUM" > ${PART_TBL_PATH}
124         echo "$RET_PARTX" >> ${PART_TBL_PATH}
125         "$SYNC"
126 }
127
128 #------------------------------------------------
129 #       do_fota_update
130 #------------------------------------------------
131 do_fota_update() {
132         echo "fota update start ..." >> ${INT_LOG_FILE}
133
134         DELTA_DIR=`cat ${DELTA_PATH_FILE}`
135         echo "DELTA_DIR = ${DELTA_DIR}" >> ${INT_LOG_FILE}
136
137         RESULT_FILE=${FAKE_ROOT}${FOTA_RESULT_DIR}/result
138         if [ -e ${RESULT_FILE} ]; then
139                 rm -fr ${RESULT_FILE}
140         fi
141
142         UA=${DELTA_DIR}/delta.ua
143         if [ ! -s ${UA} ]; then
144                 handle_no_ua
145                 return 1
146         fi
147
148         /bin/chmod +x ${UA}
149
150         DELTA=${DELTA_DIR}/delta.tar
151         if [ ! -s ${DELTA} ]; then
152                 handle_no_delta
153                 return 1
154         fi
155
156         do_create_part_table
157         if [ ! -e ${PART_TBL_PATH} ]; then
158                 echo "No partition table" >> ${INT_LOG_FILE}
159                 return 1
160         fi
161
162         ${UA} ${DELTA_DIR} ${FOTA_TEMP_DIR} 0
163         if [ $? -ne 0 ]; then
164                 echo "update agent fail!!!" >> ${INT_LOG_FILE}
165                 return 1
166         else
167                 echo "update agent success"
168                 return 0
169         fi
170
171 }
172
173 #------------------------------------------------
174 #       init_internal_log
175 #------------------------------------------------
176 init_internal_log() {
177
178         if [ -e "${INT_LOG_FILE}" ]; then
179                 /bin/rm -fr ${INT_LOG_FILE}
180         fi
181 }
182
183
184 #------------------------------------------------
185 #       init_fota_dir
186 #------------------------------------------------
187 init_fota_dir() {
188
189         TEST_DIR=${FAKE_ROOT}${FOTA_LOG_DIR}
190         if [ ! -e ${TEST_DIR} ]; then
191                 "$MKDIR" -p ${TEST_DIR}
192                 if [ "$?" = "0" ]; then
193                         echo "success to create ${TEST_DIR}" >> ${INT_LOG_FILE}
194                 fi
195         fi
196
197         TEST_DIR=${FAKE_ROOT}${FOTA_RESULT_DIR}
198         if [ ! -e ${TEST_DIR} ]; then
199                 "$MKDIR" -p ${TEST_DIR}
200                 if [ "$?" = "0" ]; then
201                         echo "success to create ${TEST_DIR}" >> ${INT_LOG_FILE}
202                 fi
203         fi
204
205         TEST_DIR=${FAKE_ROOT}${FOTA_TEMP_DIR}
206         if [ ! -e ${TEST_DIR} ]; then
207                 "$MKDIR" -p ${TEST_DIR}
208                 if [ "$?" = "0" ]; then
209                         echo "success to create ${TEST_DIR}" >> ${INT_LOG_FILE}
210                 fi
211         fi
212
213 }
214
215 #------------------------------------------------
216 #       do_reboot
217 #------------------------------------------------
218 do_reboot() {
219         echo "Reboot"
220         "$SYNC"
221         "$REBOOT"
222         while [ 1 ]
223         do
224                 sleep 1
225                 echo "."
226         done
227 }
228
229 #------------------------------------------------
230 #       check_for_rw_power_fail
231 #------------------------------------------------
232 check_for_rw_power_fail() {
233         # Case : Power fail during RW update after RO update
234         if [ -r ${STATUS_FILE} ]; then
235                 echo "${STATUS_FILE} exists" >> ${INT_LOG_FILE}
236                 /bin/cat ${STATUS_FILE} >> ${INT_LOG_FILE}
237                 "$SYNC"
238                 umount_partitions
239                 exec /sbin/fus_rw-init
240         fi
241 }
242
243 #------------------------------------------------
244 #       Main Routine Start
245 #------------------------------------------------
246
247 mount_partitions
248
249 # For debugging - It should be deleted on Release (TODO : tty like ttyS0, S1 should be selected automatically)
250 /sbin/agetty -l /bin/bash -n --keep-baud 115200,38400,9600 ttyS0 linux &
251
252 init_internal_log
253
254 check_for_rw_power_fail
255
256 "$MOUNT" -o remount,rw ${FAKE_ROOT}
257 init_fota_dir
258
259 do_fota_update
260 fota_result=$?
261 umount_partitions
262
263 if [ "$fota_result" = "0" ]; then
264         exec /sbin/fus_rw-init
265 else
266         #do_reboot
267         # For debugging - It should be deleted on Release
268         echo "Upgrade FAILED"
269         while [ 1 ]
270         do
271                 sleep 10
272         done
273 fi