d3ed298165c66ae8443581ab949e00088ab8e2ec
[platform/core/system/upgrade.git] / scripts / rw-upgrade / update.sh.in
1 #!/bin/bash
2 #
3 # System RW Update Script
4 #
5 STATUS_FILE="/opt/data/update/RW.STATUS"
6 COLOR_ERROR='\033[01;31m'
7 COLOR_DEBUG='\033[01;34m'
8 COLOR_NOTIFY='\033[01;33m'
9 COLOR_RESET='\033[00;00m'
10 PATH=/bin:/usr/bin:/sbin:/usr/sbin
11 SHELL=/bin/bash
12
13 UPDATE_SCRIPT_DIR=@UPGRADE_PKGSCRIPTS_DIR@
14 UPDATE_DATA_DIR=/opt/data/update
15 SDB_RULE=${UPDATE_DATA_DIR}/99-sdb-switch.rules
16 HAL_SET_UPGRADE_STATUS=/usr/bin/device_board_set_upgrade_status
17 HAL_PROGRESS_MIN=80
18 HAL_PROGRESS_MAX=99
19
20 RW_MACRO=@UPGRADE_SCRIPTS_DIR@/rw-update-macro.inc
21 RW_UPDATE_FLAG=/opt/.do_rw_update
22
23 SCRIPT_NAME=$(basename $0)
24
25 DEBUG()
26 {
27         LOG_TEXT=$1
28         echo -e "${COLOR_DEBUG}${LOG_TEXT}${COLOR_RESET}"
29 }
30
31 ERROR()
32 {
33         LOG_TEXT=$1
34         echo -e "${COLOR_ERROR}${LOG_TEXT}${COLOR_RESET}"
35 }
36
37 NOTIFY()
38 {
39         LOG_TEXT=$1
40         echo -e "${COLOR_NOTIFY}${LOG_TEXT}${COLOR_RESET}"
41 }
42
43 CRITICAL_LOG()
44 {
45         LOG="[$SCRIPT_NAME]$1"
46         dlogsend -k "$LOG"
47         if [ "$2" != "" ]; then
48                 echo "$LOG" >> "$2"
49         fi
50         echo "$LOG"
51 }
52
53 PROGRESS_DIR=/tmp/upgrade
54 PROGRESS_INIT()
55 {
56         mkdir -p ${PROGRESS_DIR}
57         echo "$1" > ${PROGRESS_DIR}/total
58         echo "0" > ${PROGRESS_DIR}/progress
59         chsmack -a _ ${PROGRESS_DIR}
60         chsmack -a _ ${PROGRESS_DIR}/total
61         chsmack -a _ ${PROGRESS_DIR}/progress
62
63         # if GUI is available, run the GUI
64         if [ -e "/usr/bin/rw-update-ani" ]; then
65                 export XDG_RUNTIME_DIR=/run
66                 export TBM_DISPLAY_SERVER=1
67                 /usr/bin/rw-update-ani --wait &
68         fi
69 }
70
71 PROGRESS()
72 {
73         echo "$1" > ${PROGRESS_DIR}/progress
74 }
75
76 VERSION_COMPARE() {
77         local IFS='.'
78         ver_a=($1)
79         ver_b=($2)
80
81         local n
82         if [[ ${#ver_a[@]} > ${#ver_b[@]} ]]; then
83                 n=${#ver_a[@]}
84         else
85                 n=${#ver_b[@]}
86         fi
87         for ((i=0; i < n; i++)); do
88                 if [[ $i -ge ${#ver_a[@]} ]]; then
89                         ver_a[$i]=0
90                 fi
91                 if [[ $i -ge ${#ver_b[@]} ]]; then
92                         ver_b[$i]=0
93                 fi
94         done
95         for ((i=0; i < ${#ver_a[@]}; i++)); do
96                 if (( ver_a[i] > ver_b[i] )); then
97                         return 1
98                 elif (( ver_a[i] < ver_b[i] )); then
99                         return 2
100                 fi
101         done
102         return 0
103 }
104
105 REMOVE_ISU_PKG()
106 {
107         local PKG_NAME=$1
108         rm -rf "/opt/isu/$PKG_NAME"
109 }
110
111 REMOVE_UNNECESSARY_ISU_PKGS()
112 {
113         local OS_RELEASE_NAME
114         local UPGRADE_CFG_PATH=/etc/isu/upgrade.cfg
115         OS__tz_build_release_name=$(grep TZ_BUILD_RELEASE_NAME /etc/tizen-build.conf | awk -F '"' '{print $2}')
116         OS__tz_build_arch=$(grep TZ_BUILD_ARCH /etc/tizen-build.conf | awk -F '=' '{print $2}')
117         OS__model_name=$(sed -n  -e '/.*model_name.*/s!.*<key[^>]*>\(.*\)</key>!\1!gp' /etc/config/model-config.xml)
118         OS__manufacturer=$(sed -n  -e '/.*manufacturer.*/s!.*<key[^>]*>\(.*\)</key>!\1!gp' /etc/config/model-config.xml)
119         OS__device_type=$(sed -n  -e '/.*device_type.*/s!.*<key[^>]*>\(.*\)</key>!\1!gp' /etc/config/model-config.xml)
120
121         local platform_major_version_fields="tz_build_release_name tz_build_arch model_name device_type"
122         if [ -f "${UPGRADE_CFG_PATH}" ]; then
123                 fields_from_file=$(grep -e ^platform_major_version_fields "${UPGRADE_CFG_PATH}" | cut -f2 -d= | sed -e 's/,/ /g')
124                 if [ -n "${fields_from_file}" ]; then
125                         platform_major_version_fields="$fields_from_file"
126                 fi
127         fi
128
129         for ISUCFG in $(find /etc/isu/ -type f -name isu.cfg); do
130                 PKG_NAME=$(basename "$(dirname "$ISUCFG")")
131                 if [ ! -d "/opt/isu/$PKG_NAME" ]; then
132                         continue
133                 fi
134                 CUR_IMG_VERSION=$(grep -e "^version" "/etc/isu/$PKG_NAME/isu.cfg" | awk -F "=" '{ gsub(/[ ]+/, ""); print $2}')
135                 INSTALLED_VERSION=$(grep -e "^version" "/opt/isu/$PKG_NAME/isu.cfg" | awk -F "=" '{ gsub(/[ ]+/, ""); print $2}')
136                 ISU__tz_build_release_name=$(grep -e "^tz_build_release_name" "/opt/isu/$PKG_NAME/isu.cfg" | awk -F "=" '{ gsub(/[ ]+/, ""); print $2}')
137                 ISU__tz_build_arch=$(grep -e "^tz_build_arch" "/opt/isu/$PKG_NAME/isu.cfg" | awk -F "=" '{ gsub(/[ ]+/, ""); print $2}')
138                 ISU__model_name=$(grep -e "^model_name" "/opt/isu/$PKG_NAME/isu.cfg" | awk -F "=" '{ gsub(/[ ]+/, ""); print $2}')
139                 ISU__manufacturer=$(grep -e "^manufacturer" "/opt/isu/$PKG_NAME/isu.cfg" | awk -F "=" '{ gsub(/[ ]+/, ""); print $2}')
140                 ISU__device_type=$(grep -e "^device_type" "/opt/isu/$PKG_NAME/isu.cfg" | awk -F "=" '{ gsub(/[ ]+/, ""); print $2}')
141
142
143                 for field in $platform_major_version_fields; do
144                         os_value=OS__$field
145                         isu_value=ISU__$field
146                         if [ "${!os_value}" != "${!isu_value}" ]; then
147                                 # One of the values defined in /opt/isu/upgrade.cfg is different.
148                                 # In that case we remove the ISU package because it may
149                                 # not be compatible with this version of the system.
150                                 NOTIFY "${field} value is different for OS and ISU - removing incompatible ${PKG_NAME} ISU package"
151                                 REMOVE_ISU_PKG "$PKG_NAME"
152                                 continue 2
153                         fi
154
155                 done
156
157                 VERSION_COMPARE "$CUR_IMG_VERSION" "$INSTALLED_VERSION"
158
159                 if [[ $? != 2 ]]; then
160                         # Package from the current image is newer than the one installed
161                         # so we can remove the installed one
162                         REMOVE_ISU_PKG "$PKG_NAME"
163                 fi
164         done
165 }
166
167 # This result file will be used for Platform Update Control API to get update result.
168 UPDATE_RESULT_FILE=${UPDATE_DATA_DIR}/result
169 UPI_RW_UPDATE_ERROR_NONE=00
170 UPI_RW_UPDATE_ERROR_PREFIX=FA
171 UPI_RW_UPDATE_ERROR_FAIL=${UPI_RW_UPDATE_ERROR_PREFIX}1A
172 SET_UPDATE_RESULT()
173 {
174         echo "$1" > ${UPDATE_RESULT_FILE}
175 }
176
177 SET_UPGRADE_STATUS()
178 {
179         ${HAL_SET_UPGRADE_STATUS} "$1"
180         if [ $? -eq 0 ]; then
181                 CRITICAL_LOG "set_upgrade_status success: ${1}"
182         else
183                 CRITICAL_LOG "set_upgrade_status failed: ${1}"
184         fi
185 }
186
187 if [[ $(</proc/cmdline) =~ partition_ab= ]] && [ ! -f ${RW_UPDATE_FLAG} ]
188 then
189         NOTIFY "${RW_UPDATE_FLAG} file does not exist. Cancel RW Upgrade."
190         SET_UPGRADE_STATUS -1
191         exit
192 fi
193
194 NOTIFY "----------------------------------------------------------------------"
195 NOTIFY "Remove deprecated ISU Packages"
196
197 REMOVE_UNNECESSARY_ISU_PKGS
198
199 NOTIFY "----------------------------------------------------------------------"
200 NOTIFY "System RW update: rw update started"
201
202 UPDATE_PREPARE_ERR=0
203 UPDATE_PROGRESS_ERR=0
204
205 if [ -f $RW_MACRO ];
206 then
207         source $RW_MACRO
208 else
209         ERROR "FAIL: Upgrade macro does not exist"
210         UPDATE_PREPARE_ERR=1
211 fi
212
213 if [ ! -d ${UPDATE_SCRIPT_DIR} ]
214 then
215         ERROR "FAIL: Upgrade directory does not exist"
216         UPDATE_PREPARE_ERR=1
217 fi
218
219 # Execute update scripts
220 if [ ${UPDATE_PREPARE_ERR} = "1" ]
221 then
222         ERROR "FAIL: Update preparation was failed"
223         SET_UPDATE_RESULT ${UPI_RW_UPDATE_ERROR_FAIL}
224         SET_UPGRADE_STATUS -1
225 else
226         get_version_info
227         DEBUG "Version OLD: ${OLD_VER}, NEW: ${NEW_VER}"
228
229         TOTAL_TASKS=`ls -l ${UPDATE_SCRIPT_DIR} | grep -c '^-'`
230         PROGRESS_INIT ${TOTAL_TASKS}
231
232         UPDATE_SCRIPTS=`/bin/ls ${UPDATE_SCRIPT_DIR}`
233         NOTIFY "TOTAL TASKS: ${TOTAL_TASKS}"
234         for UPSCRIPT in ${UPDATE_SCRIPTS}; do
235                 NOTIFY "CURRENT TASK: ${CURRENT_TASK} ${UPSCRIPT}"
236                 ${SHELL} ${UPDATE_SCRIPT_DIR}/${UPSCRIPT}
237                 if [ $? -ne 0 ]; then
238                         ERROR "[FAIL] ${UPSCRIPT}"
239                         UPDATE_PROGRESS_ERR=1
240                 else
241                         DEBUG "[DONE] ${UPSCRIPT}"
242                 fi
243                 PROGRESS ${CURRENT_TASK}
244                 SET_UPGRADE_STATUS $((HAL_PROGRESS_MIN + ((HAL_PROGRESS_MAX - HAL_PROGRESS_MIN)*CURRENT_TASK)/TOTAL_TASKS ))
245                 CURRENT_TASK=$(( ${CURRENT_TASK} + 1 ))
246         done
247
248         write_version_info
249
250         if [ ${UPDATE_PROGRESS_ERR} = "1" ]
251         then
252                 NOTIFY "SUCCESS: Upgrade finished, but some scripts are failed"
253                 SET_UPDATE_RESULT ${UPI_RW_UPDATE_ERROR_FAIL}
254         else
255                 NOTIFY "SUCCESS: Upgrade successfully finished"
256                 SET_UPDATE_RESULT ${UPI_RW_UPDATE_ERROR_NONE}
257         fi
258 fi
259
260 if [ -e ${SDB_RULE} ]; then
261         rm ${SDB_RULE}
262 fi
263
264 rm ${RW_UPDATE_FLAG}
265
266 /bin/sync
267 NOTIFY "----------------------------------------------------------------------"
268
269 if [[ ! $(</proc/cmdline) =~ partition_ab= ]]
270 then
271         rm ${STATUS_FILE}
272         COMMIT_CHANGES
273 fi
274 #Reboot by update-finalize.service