1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "updater_main.h"
16 #include <chrono>
17 #include <dirent.h>
18 #include <fcntl.h>
19 #include <getopt.h>
20 #include <libgen.h>
21 #include <string>
22 #include <sys/mount.h>
23 #include <sys/reboot.h>
24 #include <sys/stat.h>
25 #include <sys/statvfs.h>
26 #include <sys/syscall.h>
27 #include <thread>
28 #include <unistd.h>
29 #include <vector>
30 #include "applypatch/partition_record.h"
31 #include "cert_verify.h"
32 #include "flashd/flashd.h"
33 #include "fs_manager/mount.h"
34 #include "include/updater/updater.h"
35 #include "json_node.h"
36 #include "language/language_ui.h"
37 #include "log/dump.h"
38 #include "log/log.h"
39 #include "misc_info/misc_info.h"
40 #include "package/pkg_manager.h"
41 #include "pkg_manager.h"
42 #include "pkg_utils.h"
43 #include "ptable_parse/ptable_process.h"
44 #include "sdcard_update/sdcard_update.h"
45 #include "scope_guard.h"
46 #include "securec.h"
47 #include "updater/updater_const.h"
48 #include "updater/hardware_fault_retry.h"
49 #include "updater/updater_preprocess.h"
50 #include "updater_ui_stub.h"
51 #include "utils.h"
52 #include "factory_reset/factory_reset.h"
53 #include "write_state/write_state.h"
54 #include "slot_info/slot_info.h"
55
56 namespace Updater {
57 using Utils::String2Int;
58 using namespace Hpackage;
59 using namespace Updater::Utils;
60 using namespace std::literals::chrono_literals;
61
62 [[maybe_unused]] constexpr int DISPLAY_TIME = 1000 * 1000;
63 constexpr struct option OPTIONS[] = {
64 { "update_bin", required_argument, nullptr, 0 },
65 { "update_package", required_argument, nullptr, 0 },
66 { "retry_count", required_argument, nullptr, 0 },
67 { "panic_count", required_argument, nullptr, 0 },
68 { "factory_wipe_data", no_argument, nullptr, 0 },
69 { "user_wipe_data", no_argument, nullptr, 0 },
70 { "menu_wipe_data", no_argument, nullptr, 0 },
71 { "sdcard_update", no_argument, nullptr, 0 },
72 { "upgraded_pkg_num", required_argument, nullptr, 0 },
73 { "force_update_action", required_argument, nullptr, 0 },
74 { "night_update", no_argument, nullptr, 0 },
75 { USB_MODE, no_argument, nullptr, 0 },
76 { "UPDATE:MAINIMG", no_argument, nullptr, 0 },
77 { "update_protect", no_argument, nullptr, 0 },
78 { "factory_sd_update", no_argument, nullptr, 0 },
79 { "UPDATE:SD", no_argument, nullptr, 0 },
80 { "UPDATE:SDFROMDEV", no_argument, nullptr, 0 },
81 { "sdcard_intral_update", optional_argument, nullptr, 0},
82 { "shrink_info", required_argument, nullptr, 0 },
83 { "virtual_shrink_info", required_argument, nullptr, 0 },
84 {"wipe_data_factory_lowlevel", no_argument, nullptr, 0},
85 { "wipe_data_at_factoryreset_0", no_argument, nullptr, 0 },
86 { "subpkg_update", no_argument, nullptr, 0 },
87 { nullptr, 0, nullptr, 0 },
88 };
89 constexpr float VERIFY_PERCENT = 0.05;
90 constexpr double FULL_PERCENT = 100.00;
91 constexpr uint32_t BYTE_SHIFT_8 = 8;
92 constexpr uint32_t BYTE_SHIFT_16 = 16;
93 constexpr uint32_t BYTE_SHIFT_24 = 24;
94 constexpr uint32_t SECOND_BUFFER = 2;
95 constexpr uint32_t THIRD_BUFFER = 3;
96 constexpr uint8_t TYPE_ZIP_HEADER = 0xaa;
97
ReadLE16(std::istream & is,uint16_t & value)98 bool ReadLE16(std::istream& is, uint16_t& value)
99 {
100 char buf[2] = {0}; // 2:定义2字节缓冲区,用于读取小端序的16位无符号整数(每字节8位)
101 if (!is.read(buf, sizeof(buf))) {
102 return false;
103 }
104 value = static_cast<uint16_t>(static_cast<unsigned char>(buf[0])) |
105 (static_cast<uint16_t>(static_cast<unsigned char>(buf[1])) << BYTE_SHIFT_8);
106 return true;
107 }
108
ReadLE32(std::istream & is,uint32_t & value)109 bool ReadLE32(std::istream& is, uint32_t& value)
110 {
111 char buf[4] = {0}; // 4:定义4字节缓冲区,用于读取小端序的32位无符号整数(每字节8位)
112 if (!is.read(buf, sizeof(buf))) {
113 return false;
114 }
115 value = static_cast<uint32_t>(static_cast<unsigned char>(buf[0])) |
116 (static_cast<uint32_t>(static_cast<unsigned char>(buf[1])) << BYTE_SHIFT_8) |
117 (static_cast<uint32_t>(static_cast<unsigned char>(buf[SECOND_BUFFER])) << BYTE_SHIFT_16) |
118 (static_cast<uint32_t>(static_cast<unsigned char>(buf[THIRD_BUFFER])) << BYTE_SHIFT_24);
119 return true;
120 }
121
FactoryReset(FactoryResetMode mode,const std::string & path)122 int FactoryReset(FactoryResetMode mode, const std::string &path)
123 {
124 UpdaterInit::GetInstance().InvokeEvent(FACTORY_RESET_INIT_EVENT);
125 auto ret = FactoryResetProcess::GetInstance().DoFactoryReset(mode, path);
126 if (ret == 0) {
127 LOG(INFO) << "restorecon for " << path;
128 RestoreconPath(path); // restore selinux context for /data after factory reset success
129 }
130 return ret;
131 }
132
ReadUpdateStreamzip(const std::string & packagePath)133 static UpdaterStatus ReadUpdateStreamzip(const std::string &packagePath)
134 {
135 std::filesystem::path packageFsPath(packagePath);
136 std::filesystem::path outputPath = packageFsPath.parent_path() / "update_stream.zip";
137 std::string outputPathStr = outputPath.string();
138 LOG(INFO) << "outputPathStr:" << outputPathStr;
139
140 std::ifstream inFile(packagePath, std::ios::binary);
141 if (!inFile) {
142 LOG(ERROR) << "Error: Failed to open " << packagePath;
143 return UPDATE_ERROR;
144 }
145 uint16_t type;
146 if (!ReadLE16(inFile, type)) {
147 LOG(ERROR) << "Failed to read type";
148 return UPDATE_ERROR;
149 }
150 if (type != TYPE_ZIP_HEADER) {
151 LOG(ERROR) << "Invalid type, expected 0xaa but got " << type;
152 return UPDATE_ERROR;
153 }
154
155 uint32_t length;
156 if (!ReadLE32(inFile, length)) {
157 LOG(ERROR) << "Failed to read length";
158 return UPDATE_ERROR;
159 }
160 LOG(INFO) << "header.length = " << length;
161
162 std::vector<char> valueData(length);
163 if (!inFile.read(valueData.data(), length)) {
164 LOG(ERROR) << "Incomplete value data";
165 return UPDATE_ERROR;
166 }
167
168 std::ofstream outFile(outputPathStr, std::ios::binary);
169 if (!outFile.write(valueData.data(), length)) {
170 LOG(ERROR) << "Write failed";
171 return UPDATE_ERROR;
172 }
173 LOG(INFO) << "Successfully restored build_tools.zip to " << outputPathStr;
174 return UPDATE_SUCCESS;
175 }
176
GetFileType(const char * path,struct stat * st)177 const char* GetFileType(const char* path, struct stat* st)
178 {
179 if (lstat(path, st) != 0) {
180 return "Unknown";
181 }
182
183 switch (st->st_mode & S_IFMT) {
184 case S_IFREG: return "File";
185 case S_IFDIR: return "Directory";
186 case S_IFLNK: return "Symlink";
187 case S_IFIFO: return "FIFO";
188 case S_IFSOCK: return "Socket";
189 case S_IFCHR: return "CharDevice";
190 case S_IFBLK: return "BlockDevice";
191 default: return "Unknown";
192 }
193 }
194
GetReadUpdateStreamzipFromBinfile(const std::string & packagePath)195 static UpdaterStatus GetReadUpdateStreamzipFromBinfile(const std::string &packagePath)
196 {
197 UPDATER_INIT_RECORD;
198 // 获取zip内容
199 int32_t status = ReadUpdateStreamzip(packagePath);
200 if (status != UPDATE_SUCCESS) {
201 LOG(ERROR) << "ReadUpdateStreamzip failed";
202 return UPDATE_ERROR;
203 }
204 return UPDATE_SUCCESS;
205 }
206
OtaUpdatePreCheck(PkgManager::PkgManagerPtr pkgManager,const std::string & packagePath)207 int OtaUpdatePreCheck(PkgManager::PkgManagerPtr pkgManager, const std::string &packagePath)
208 {
209 UPDATER_INIT_RECORD;
210 if (pkgManager == nullptr) {
211 LOG(ERROR) << "pkgManager is nullptr";
212 UPDATER_LAST_WORD(PKG_INVALID_FILE, "pkgManager is nullptr");
213 return UPDATE_CORRUPT;
214 }
215 char realPath[PATH_MAX + 1] = {0};
216 if (realpath(packagePath.c_str(), realPath) == nullptr) {
217 LOG(ERROR) << "realpath error";
218 UPDATER_LAST_WORD(PKG_INVALID_FILE, "realpath error");
219 return PKG_INVALID_FILE;
220 }
221 if (access(realPath, F_OK) != 0) {
222 LOG(ERROR) << "package does not exist!";
223 UPDATER_LAST_WORD(PKG_INVALID_FILE, "package does not exist!");
224 return PKG_INVALID_FILE;
225 }
226
227 int32_t ret = pkgManager->VerifyOtaPackage(realPath);
228 if (ret != PKG_SUCCESS) {
229 LOG(INFO) << "VerifyOtaPackage fail ret :" << ret;
230 UPDATER_LAST_WORD("sign", ret);
231 return ret;
232 }
233
234 return UPDATE_SUCCESS;
235 }
236
UpdatePreCheck(UpdaterParams & upParams,const std::string pkgPath)237 static UpdaterStatus UpdatePreCheck(UpdaterParams &upParams, const std::string pkgPath)
238 {
239 UPDATER_INIT_RECORD;
240 int32_t ret = PreProcess::GetInstance().DoUpdateAuth(pkgPath);
241 if (ret != 0) {
242 return UPDATE_ERROR;
243 }
244
245 PkgManager::PkgManagerPtr pkgManager = PkgManager::CreatePackageInstance();
246 if (pkgManager == nullptr) {
247 LOG(ERROR) << "CreatePackageInstance fail";
248 return UPDATE_ERROR;
249 }
250 if (GetUpdatePackageInfo(pkgManager, pkgPath) != PKG_SUCCESS) {
251 PkgManager::ReleasePackageInstance(pkgManager);
252 LOG(ERROR) << "Verify update bin file Fail!";
253 UPDATER_LAST_WORD(UPDATE_ERROR, "Verify update bin file Fail!");
254 return UPDATE_ERROR;
255 }
256 if (PreProcess::GetInstance().DoUpdatePreProcess(upParams, pkgManager) != PKG_SUCCESS) {
257 PkgManager::ReleasePackageInstance(pkgManager);
258 LOG(ERROR) << "Version Check Fail!";
259 UPDATER_LAST_WORD(UPDATE_ERROR, "Version Check Fail!");
260 return UPDATE_ERROR;
261 }
262 if (PreProcess::GetInstance().DoUpdateClear() != 0) {
263 LOG(ERROR) << "DoUpdateClear Fail!";
264 }
265 PkgManager::ReleasePackageInstance(pkgManager);
266 return UPDATE_SUCCESS;
267 }
268
VerifySpecialBin(UpdaterParams & upParams)269 __attribute__((weak)) int32_t VerifySpecialBin([[maybe_unused]]UpdaterParams &upParams)
270 {
271 return PKG_SUCCESS;
272 }
273
274
VerifySpecialPkgs(UpdaterParams & upParams)275 __attribute__((weak)) int32_t VerifySpecialPkgs([[maybe_unused]]UpdaterParams &upParams)
276 {
277 return PKG_SUCCESS;
278 }
279
UpdaterVerifyFailEntry(bool verifyret)280 __attribute__((weak)) void UpdaterVerifyFailEntry(bool verifyret)
281 {
282 LOG(INFO) << "pre verify package info process";
283 return;
284 }
285
NotifyActionResult(UpdaterParams & upParams,UpdaterStatus & status,const std::vector<NotifyAction> & notifyActionVec)286 __attribute__((weak)) UpdaterStatus NotifyActionResult(UpdaterParams &upParams,
287 UpdaterStatus &status, const std::vector<NotifyAction> ¬ifyActionVec)
288 {
289 return UPDATE_SUCCESS;
290 }
291
NotifyReboot(const std::string & rebootTarget,const std::string & rebootReason,const std::string & extData)292 __attribute__((weak)) void NotifyReboot(const std::string& rebootTarget,
293 const std::string &rebootReason, const std::string &extData)
294 {
295 Updater::Utils::UpdaterDoReboot(rebootTarget, rebootReason, extData);
296 }
297
UpdateSubPkg(UpdaterParams & upParams)298 __attribute__((weak)) UpdaterStatus UpdateSubPkg(UpdaterParams &upParams)
299 {
300 return UPDATE_SUCCESS;
301 }
302
NotifyPreCheck(UpdaterStatus & status,UpdaterParams & upParams)303 __attribute__((weak)) void NotifyPreCheck(UpdaterStatus &status, UpdaterParams &upParams)
304 {
305 return;
306 }
307
VerifyBinfiles(UpdaterParams & upParams)308 static UpdaterStatus VerifyBinfiles(UpdaterParams &upParams)
309 {
310 UPDATER_INIT_RECORD;
311 LOG(INFO) << "Verify binfiles start...";
312 UPDATER_UI_INSTANCE.ShowProgressPage();
313 UPDATER_UI_INSTANCE.ShowUpdInfo(TR(UPD_VERIFYPKG));
314
315 if (upParams.callbackProgress == nullptr) {
316 UPDATER_UI_INSTANCE.ShowUpdInfo(TR(UPD_VERIFYPKGFAIL), true);
317 UPDATER_LAST_WORD(UPDATE_CORRUPT, "upParams.callbackProgress is null");
318 return UPDATE_CORRUPT;
319 }
320 upParams.callbackProgress(0.0);
321 upParams.installTime.resize(upParams.updateBin.size(), std::chrono::duration<double>(0));
322 ReadInstallTime(upParams);
323 for (unsigned int i = upParams.pkgLocation; i < upParams.updateBin.size(); i++) {
324 LOG(INFO) << "Verify package:" << upParams.updateBin[i];
325 auto startTime = std::chrono::system_clock::now();
326 PkgManager::PkgManagerPtr manager = PkgManager::CreatePackageInstance();
327 if (manager == nullptr) {
328 LOG(ERROR) << "CreatePackageInstance fail";
329 return UPDATE_ERROR;
330 }
331 // 从update_bin中获取zip
332 int32_t status = GetReadUpdateStreamzipFromBinfile(upParams.updateBin[i]);
333 if (status != UPDATE_SUCCESS) {
334 LOG(ERROR) << "GetReadUpdateStreamzipFromBinfile fail";
335 return UPDATE_ERROR;
336 }
337 // 验证update_stream.zip包
338 int32_t verifyret = OtaUpdatePreCheck(manager, STREAM_ZIP_PATH);
339 PkgManager::ReleasePackageInstance(manager);
340 if (verifyret != UPDATE_SUCCESS) {
341 UpdaterVerifyFailEntry((verifyret == PKG_INVALID_DIGEST) && (upParams.updateMode == HOTA_UPDATE));
342 upParams.pkgLocation = i;
343 UPDATER_UI_INSTANCE.ShowUpdInfo(TR(UPD_VERIFYPKGFAIL), true);
344 auto endTime = std::chrono::system_clock::now();
345 upParams.installTime[i] = endTime - startTime;
346 return UPDATE_CORRUPT;
347 }
348 auto endTime = std::chrono::system_clock::now();
349 upParams.installTime[i] = endTime - startTime;
350 }
351
352 if (VerifySpecialBin(upParams) != PKG_SUCCESS) {
353 UPDATER_LAST_WORD(UPDATE_CORRUPT, "VerifySpecialBin failed");
354 return UPDATE_CORRUPT;
355 }
356 ProgressSmoothHandler(UPDATER_UI_INSTANCE.GetCurrentPercent(),
357 UPDATER_UI_INSTANCE.GetCurrentPercent() + static_cast<int>(VERIFY_PERCENT * FULL_PERCENT_PROGRESS));
358 LOG(INFO) << "Verify binfiles successfull...";
359 return UPDATE_SUCCESS;
360 }
361
362 std::function<void(float, float, UpdaterParams, bool)> g_setPrgrsSmoothFunc = ProgressSmoothHandler;
363
SetPrgrsSmoothHandlerFunc(std::function<void (float,float,UpdaterParams,bool)> func)364 void SetPrgrsSmoothHandlerFunc(std::function<void(float, float, UpdaterParams, bool)> func)
365 {
366 g_setPrgrsSmoothFunc = func;
367 }
368
ProcessPrgrsSmooth(float beginProgress,float endProgress,UpdaterParams upParams,bool isFinish)369 void ProcessPrgrsSmooth(float beginProgress, float endProgress, UpdaterParams upParams, bool isFinish)
370 {
371 if (g_setPrgrsSmoothFunc == nullptr) {
372 LOG(ERROR) << "g_setPrgrsSmoothFunc is nullptr";
373 return;
374 }
375 g_setPrgrsSmoothFunc(beginProgress, endProgress, upParams, isFinish);
376 }
377
VerifyPackages(UpdaterParams & upParams)378 static UpdaterStatus VerifyPackages(UpdaterParams &upParams)
379 {
380 UPDATER_INIT_RECORD;
381 LOG(INFO) << "Verify packages start...";
382 UPDATER_UI_INSTANCE.ShowProgressPage();
383 UPDATER_UI_INSTANCE.ShowUpdInfo(TR(UPD_VERIFYPKG));
384 if (upParams.callbackProgress == nullptr) {
385 UPDATER_UI_INSTANCE.ShowUpdInfo(TR(UPD_VERIFYPKGFAIL), true);
386 UPDATER_LAST_WORD(UPDATE_CORRUPT, "upParams.callbackProgress is null");
387 return UPDATE_CORRUPT;
388 }
389 upParams.callbackProgress(0.0);
390 upParams.installTime.resize(upParams.updatePackage.size(), std::chrono::duration<double>(0));
391 ReadInstallTime(upParams);
392 for (unsigned int i = upParams.pkgLocation; i < upParams.updatePackage.size(); i++) {
393 LOG(INFO) << "Verify package:" << upParams.updatePackage[i];
394 auto startTime = std::chrono::system_clock::now();
395 PkgManager::PkgManagerPtr manager = PkgManager::CreatePackageInstance();
396 if (manager == nullptr) {
397 LOG(ERROR) << "CreatePackageInstance fail";
398 return UPDATE_ERROR;
399 }
400 int32_t verifyret = OtaUpdatePreCheck(manager, upParams.updatePackage[i]);
401 PkgManager::ReleasePackageInstance(manager);
402 if (verifyret == UPDATE_SUCCESS) {
403 verifyret = UpdatePreCheck(upParams, upParams.updatePackage[i]);
404 }
405 if (verifyret != UPDATE_SUCCESS) {
406 UpdaterVerifyFailEntry((verifyret == PKG_INVALID_DIGEST) && (upParams.updateMode == HOTA_UPDATE));
407 upParams.pkgLocation = i;
408 UPDATER_UI_INSTANCE.ShowUpdInfo(TR(UPD_VERIFYPKGFAIL), true);
409 auto endTime = std::chrono::system_clock::now();
410 upParams.installTime[i] = endTime - startTime;
411 return UPDATE_CORRUPT;
412 }
413 auto endTime = std::chrono::system_clock::now();
414 upParams.installTime[i] = endTime - startTime;
415 }
416 if (VerifySpecialPkgs(upParams) != PKG_SUCCESS) {
417 UPDATER_LAST_WORD(UPDATE_CORRUPT, "VerifySpecialPkgs failed");
418 return UPDATE_CORRUPT;
419 }
420 ProcessPrgrsSmooth(UPDATER_UI_INSTANCE.GetCurrentPercent(), UPDATER_UI_INSTANCE.GetCurrentPercent() +
421 static_cast<int>(VERIFY_PERCENT * FULL_PERCENT_PROGRESS), upParams, false);
422 LOG(INFO) << "Verify packages successfull...";
423 return UPDATE_SUCCESS;
424 }
425
GetBatteryCapacity(int & capacity)426 bool GetBatteryCapacity(int &capacity)
427 {
428 const static std::vector<const char *> vec = {
429 "/sys/class/power_supply/battery/capacity",
430 "/sys/class/power_supply/Battery/capacity"
431 };
432 for (auto &it : vec) {
433 std::ifstream ifs { it };
434 if (!ifs.is_open()) {
435 continue;
436 }
437
438 int tmpCapacity = 0;
439 ifs >> tmpCapacity;
440 if ((ifs.fail()) || (ifs.bad())) {
441 continue;
442 }
443
444 capacity = tmpCapacity;
445 return true;
446 }
447
448 return false;
449 }
450
IsSpareBoardBoot(void)451 __attribute__((weak)) bool IsSpareBoardBoot(void)
452 {
453 LOG(INFO) << "no need check spareboardboot";
454 return false;
455 }
456
IsBatteryCapacitySufficient()457 bool IsBatteryCapacitySufficient()
458 {
459 if (Utils::CheckUpdateMode(OTA_MODE)) {
460 LOG(INFO) << "this is OTA update, on need to determine the battery";
461 return true;
462 }
463 if (IsSpareBoardBoot()) {
464 LOG(INFO) << "this is spare board boot, no need to determine the battery";
465 return true;
466 }
467 static constexpr auto levelIdx = "lowBatteryLevel";
468 static constexpr auto jsonPath = "/etc/product_cfg.json";
469
470 int capacity = 0;
471 bool ret = GetBatteryCapacity(capacity);
472 if (!ret) {
473 return true; /* maybe no battery or err value return default true */
474 }
475
476 JsonNode node { Fs::path { jsonPath }};
477 auto item = node[levelIdx].As<int>();
478 if (!item.has_value()) {
479 return true; /* maybe no value return default true */
480 }
481
482 int lowLevel = *item;
483 if (lowLevel > 100 || lowLevel < 0) { /* full percent is 100 */
484 LOG(ERROR) << "load battery level error:" << lowLevel;
485 return false; /* config err not allow to update */
486 }
487
488 LOG(INFO) << "current capacity:" << capacity << ", low level:" << lowLevel;
489
490 return capacity >= lowLevel;
491 }
492
InstallUpdaterBinfile(UpdaterParams & upParams,PkgManager::PkgManagerPtr manager)493 UpdaterStatus InstallUpdaterBinfile(UpdaterParams &upParams, PkgManager::PkgManagerPtr manager)
494 {
495 UPDATER_INIT_RECORD;
496 UpdaterStatus status = UPDATE_UNKNOWN;
497 STAGE(UPDATE_STAGE_BEGIN) << "Install Binfile";
498 status = DoInstallUpdaterBinfile(manager, upParams, HOTA_UPDATE);
499 if (status != UPDATE_SUCCESS) {
500 UPDATER_UI_INSTANCE.Sleep(UI_SHOW_DURATION);
501 UPDATER_UI_INSTANCE.ShowLog(TR(LOG_UPDFAIL));
502 STAGE(UPDATE_STAGE_FAIL) << "Install failed";
503 if (status == UPDATE_RETRY) {
504 HardwareFaultRetry::GetInstance().DoRetryAction();
505 UPDATER_UI_INSTANCE.ShowFailedPage();
506 }
507 } else {
508 LOG(INFO) << "Install binfile success.";
509 STAGE(UPDATE_STAGE_SUCCESS) << "Install binfile";
510 }
511 return status;
512 }
513
InstallUpdaterPackage(UpdaterParams & upParams,PkgManager::PkgManagerPtr manager)514 UpdaterStatus InstallUpdaterPackage(UpdaterParams &upParams, PkgManager::PkgManagerPtr manager)
515 {
516 UPDATER_INIT_RECORD;
517 UpdaterStatus status = UPDATE_UNKNOWN;
518 STAGE(UPDATE_STAGE_BEGIN) << "Install package";
519 if (upParams.retryCount == 0) {
520 // First time enter updater, record retryCount in case of abnormal reset.
521 if (!PartitionRecord::GetInstance().ClearRecordPartitionOffset()) {
522 LOG(ERROR) << "ClearRecordPartitionOffset failed";
523 UPDATER_LAST_WORD(UPDATE_ERROR, "ClearRecordPartitionOffset failed");
524 return UPDATE_ERROR;
525 }
526 SetMessageToMisc(upParams.miscCmd, upParams.retryCount + 1, "retry_count");
527 }
528 if (upParams.updateMode == SDCARD_UPDATE) {
529 status = DoInstallUpdaterPackage(manager, upParams, SDCARD_UPDATE);
530 } else {
531 status = DoInstallUpdaterPackage(manager, upParams, HOTA_UPDATE);
532 }
533 if (status != UPDATE_SUCCESS) {
534 UPDATER_UI_INSTANCE.Sleep(UI_SHOW_DURATION);
535 UPDATER_UI_INSTANCE.ShowLog(TR(LOG_UPDFAIL));
536 STAGE(UPDATE_STAGE_FAIL) << "Install failed";
537 if (status == UPDATE_RETRY) {
538 HardwareFaultRetry::GetInstance().DoRetryAction();
539 UPDATER_UI_INSTANCE.ShowFailedPage();
540 }
541 } else {
542 LOG(INFO) << "Install package success.";
543 STAGE(UPDATE_STAGE_SUCCESS) << "Install package";
544 }
545 return status;
546 }
547
UpdateUpdateFile(const UpdaterParams & upParams,std::vector<double> & pkgStartPosition,double & updateStartPosition,std::vector<std::string> & updateFile)548 static UpdaterStatus UpdateUpdateFile(const UpdaterParams &upParams,
549 std::vector<double> &pkgStartPosition, double &updateStartPosition,
550 std::vector<std::string> &updateFile)
551 {
552 updateFile.clear();
553 if (upParams.updateBin.size() > 0) {
554 if (upParams.pkgLocation == upParams.updateBin.size()) {
555 updateStartPosition = VERIFY_PERCENT;
556 return UPDATE_SUCCESS;
557 }
558 for (const auto& file : upParams.updateBin) {
559 updateFile.push_back(file);
560 }
561 } else if (upParams.updatePackage.size() > 0) {
562 if (upParams.pkgLocation == upParams.updatePackage.size()) {
563 updateStartPosition = VERIFY_PERCENT;
564 return UPDATE_SUCCESS;
565 }
566 for (const auto& file : upParams.updatePackage) {
567 updateFile.push_back(file);
568 }
569 }
570 return UPDATE_SKIP;
571 }
572
CalcProgress(const UpdaterParams & upParams,std::vector<double> & pkgStartPosition,double & updateStartPosition)573 static UpdaterStatus CalcProgress(const UpdaterParams &upParams,
574 std::vector<double> &pkgStartPosition, double &updateStartPosition)
575 {
576 UPDATER_INIT_RECORD;
577 int64_t allPkgSize = 0;
578 std::vector<int64_t> everyPkgSize;
579 std::vector<std::string> updateFile;
580
581 UpdaterStatus status = UpdateUpdateFile(upParams, pkgStartPosition, updateStartPosition, updateFile);
582 if (status == UPDATE_SUCCESS) {
583 return UPDATE_SUCCESS;
584 }
585 for (const auto &path : updateFile) {
586 char realPath[PATH_MAX] = {0};
587 if (realpath(path.c_str(), realPath) == nullptr) {
588 LOG(WARNING) << "Can not find updatePackage : " << path;
589 everyPkgSize.push_back(0);
590 continue;
591 }
592 struct stat st {};
593 if (stat(realPath, &st) == 0) {
594 everyPkgSize.push_back(st.st_size);
595 allPkgSize += st.st_size;
596 LOG(INFO) << "pkg " << path << " size is:" << st.st_size;
597 }
598 }
599 pkgStartPosition.push_back(VERIFY_PERCENT);
600 if (allPkgSize == 0) {
601 LOG(ERROR) << "All packages's size is 0.";
602 UPDATER_LAST_WORD(UPDATE_ERROR, "All packages's size is 0.");
603 return UPDATE_ERROR;
604 }
605 int64_t startSize = 0;
606 for (auto size : everyPkgSize) {
607 startSize += size;
608 float percent = static_cast<double>(startSize) / static_cast<double>(allPkgSize) + VERIFY_PERCENT;
609 percent = (percent > 1.0) ? 1.0 : percent; // 1.0 : 100%
610 LOG(INFO) << "percent is:" << percent;
611 pkgStartPosition.push_back(percent);
612 }
613
614 updateStartPosition = pkgStartPosition[upParams.pkgLocation];
615 return UPDATE_SUCCESS;
616 }
617
CheckMountData()618 static int CheckMountData()
619 {
620 UPDATER_INIT_RECORD;
621 constexpr int retryTime = 3;
622 for (int i = 0; i < retryTime; i++) {
623 if (SetupPartitions(true, Utils::IsVabDevice()) == 0) {
624 return 0;
625 }
626 LOG(INFO) << "retry mount userdata number:" << i;
627 Utils::UsSleep(DISPLAY_TIME);
628 }
629 UPDATER_UI_INSTANCE.ShowUpdInfo(TR(UPD_SETPART_FAIL), true);
630 UPDATER_LAST_WORD(UPDATE_ERROR, "retry mount userdata more than three times");
631 return UPDATE_ERROR;
632 }
633
VerifyCommonFiles(UpdaterParams & upParams)634 static UpdaterStatus VerifyCommonFiles(UpdaterParams &upParams)
635 {
636 if (upParams.updateBin.size() > 0) {
637 if (upParams.pkgLocation == upParams.updateBin.size()) {
638 LOG(WARNING) << "all package has been upgraded, skip pre process";
639 return UPDATE_SUCCESS;
640 }
641 UpdaterInit::GetInstance().InvokeEvent(UPDATER_PRE_VERIFY_PACKAGE_EVENT);
642 // 从bin文件中提取zip文件
643 if (VerifyBinfiles(upParams) != UPDATE_SUCCESS) {
644 LOG(ERROR) << "VerifyBinfiles failed";
645 return UPDATE_CORRUPT; // verify binfiles failed must return UPDATE_CORRUPT, ux need it !!!
646 }
647 } else if (upParams.updatePackage.size() > 0) {
648 if (upParams.pkgLocation == upParams.updatePackage.size()) {
649 LOG(WARNING) << "all package has been upgraded, skip pre process";
650 return UPDATE_SUCCESS;
651 }
652 UpdaterInit::GetInstance().InvokeEvent(UPDATER_PRE_VERIFY_PACKAGE_EVENT);
653 // verify package first
654 if (VerifyPackages(upParams) != UPDATE_SUCCESS) {
655 LOG(ERROR) << "VerifyPackages failed";
656 return UPDATE_CORRUPT; // verify package failed must return UPDATE_CORRUPT, ux need it !!!
657 }
658 }
659 return UPDATE_SUCCESS;
660 }
661
SetUpdateParam(UpdaterParams & upParams,bool isUpdateCurrSlot)662 static UpdaterStatus SetUpdateParam(UpdaterParams &upParams, bool isUpdateCurrSlot)
663 {
664 // set update slot
665 if (SetUpdateSlotParam(upParams, false) != UPDATE_SUCCESS) {
666 LOG(ERROR) << "SetUpdateSlotParam failed";
667 return UPDATE_ERROR;
668 }
669 // set update suffix
670 if (SetUpdateSuffixParam() != UPDATE_SUCCESS) {
671 LOG(ERROR) << "SetUpdateSuffixParam failed";
672 return UPDATE_ERROR;
673 }
674 return UPDATE_SUCCESS;
675 }
676
VerifyUpParams(UpdaterParams & upParams)677 static UpdaterStatus VerifyUpParams(UpdaterParams &upParams)
678 {
679 if (SetUpdateParam(upParams, false) != UPDATE_SUCCESS) {
680 LOG(ERROR) << "SetUpdateParam failed";
681 return UPDATE_ERROR;
682 }
683 // verify package first
684 if (VerifyCommonFiles(upParams) != UPDATE_SUCCESS) {
685 return UPDATE_CORRUPT; // verify package failed must return UPDATE_CORRUPT, ux need it !!!
686 }
687 // Only handle UPATE_ERROR and UPDATE_SUCCESS here.Let package verify handle others.
688 if (upParams.updatePackage.size() > 0) {
689 if (IsSpaceCapacitySufficient(upParams) == UPDATE_ERROR) {
690 UPDATER_LAST_WORD(UPDATE_UNKNOWN, "space nott enough");
691 return UPDATE_UNKNOWN;
692 }
693 }
694 if (upParams.retryCount == 0 && !IsBatteryCapacitySufficient()) {
695 UPDATER_UI_INSTANCE.ShowUpdInfo(TR(LOG_LOWPOWER));
696 UPDATER_UI_INSTANCE.Sleep(UI_SHOW_DURATION);
697 UPDATER_LAST_WORD(UPDATE_ERROR, "Battery is not sufficient for install package.");
698 LOG(ERROR) << "Battery is not sufficient for install package.";
699 return UPDATE_SKIP;
700 }
701 return UPDATE_SUCCESS;
702 }
703
PreUpdatePackages(UpdaterParams & upParams)704 static UpdaterStatus PreUpdatePackages(UpdaterParams &upParams)
705 {
706 UPDATER_INIT_RECORD;
707 LOG(INFO) << "start to update packages, start index:" << upParams.pkgLocation;
708 UpdaterStatus status = UPDATE_UNKNOWN;
709 ON_SCOPE_EXIT(syncresult) {
710 NotifyPreCheck(status, upParams);
711 };
712 if (upParams.updateBin.size() > 0) {
713 upParams.installTime.resize(upParams.updateBin.size(), std::chrono::duration<double>(0));
714 if (CheckMountData() != 0) {
715 return UPDATE_ERROR;
716 }
717 } else if (upParams.updatePackage.size() > 0) {
718 upParams.installTime.resize(upParams.updatePackage.size(), std::chrono::duration<double>(0));
719 if (CheckMountData() != 0) {
720 return UPDATE_ERROR;
721 }
722 }
723 const std::string resultPath = std::string(UPDATER_PATH) + "/" + std::string(UPDATER_RESULT_FILE);
724 if (access(resultPath.c_str(), F_OK) != -1) {
725 (void)DeleteFile(resultPath);
726 LOG(INFO) << "delete last upgrade file";
727 }
728 status = VerifyUpParams(upParams);
729 if (status != UPDATE_SUCCESS) {
730 LOG(ERROR) << "verify updater params fail";
731 return status;
732 }
733 NotifyPreCheck(status, upParams);
734 if (status != UPDATE_SUCCESS) {
735 CANCEL_SCOPE_EXIT_GUARD(syncresult);
736 return UPDATE_CORRUPT;
737 }
738 #ifdef UPDATER_USE_PTABLE
739 if (!PtablePreProcess::GetInstance().DoPtableProcess(upParams)) {
740 LOG(ERROR) << "DoPtableProcess failed";
741 return UPDATE_ERROR;
742 }
743 #endif
744 CANCEL_SCOPE_EXIT_GUARD(syncresult);
745 return UPDATE_SUCCESS;
746 }
747
DoInstallBinfiles(UpdaterParams & upParams,std::vector<double> & pkgStartPosition)748 static UpdaterStatus DoInstallBinfiles(UpdaterParams &upParams, std::vector<double> &pkgStartPosition)
749 {
750 UPDATER_INIT_RECORD;
751 UpdaterStatus status = UPDATE_UNKNOWN;
752 if (upParams.pkgLocation == upParams.updateBin.size()) {
753 LOG(WARNING) << "all Binfiles has been installed, directly return success";
754 upParams.callbackProgress(FULL_PERCENT_PROGRESS);
755 return UPDATE_SUCCESS;
756 }
757 PkgManager::PkgManagerPtr manager = PkgManager::CreatePackageInstance();
758 if (manager == nullptr) {
759 LOG(ERROR) << "CreatePackageInstance fail";
760 return UPDATE_ERROR;
761 }
762 auto startTime = std::chrono::system_clock::now();
763 upParams.initialProgress = ((UPDATER_UI_INSTANCE.GetCurrentPercent() / FULL_PERCENT) >
764 pkgStartPosition[upParams.pkgLocation]) ?
765 (UPDATER_UI_INSTANCE.GetCurrentPercent() / FULL_PERCENT) : pkgStartPosition[upParams.pkgLocation];
766 upParams.currentPercentage = pkgStartPosition[upParams.pkgLocation + 1] - upParams.initialProgress;
767 LOG(INFO) << "InstallUpdaterBin pkg is " << upParams.updateBin[upParams.pkgLocation] <<
768 " percent:" << upParams.initialProgress << "~" << pkgStartPosition[upParams.pkgLocation + 1];
769 // 安装bin文件
770 status = InstallUpdaterBinfile(upParams, manager);
771 auto endTime = std::chrono::system_clock::now();
772 upParams.installTime[upParams.pkgLocation] = upParams.installTime[upParams.pkgLocation] + endTime - startTime;
773 WriteInstallTime(upParams);
774 if (status != UPDATE_SUCCESS) {
775 LOG(ERROR) << "InstallUpdaterBin failed! Pkg is " << upParams.updateBin[upParams.pkgLocation];
776 if (!CheckResultFail()) {
777 UPDATER_LAST_WORD(status, "InstallUpdaterBin failed");
778 }
779 PkgManager::ReleasePackageInstance(manager);
780 return status;
781 }
782 ProgressSmoothHandler(
783 static_cast<int>(upParams.initialProgress * FULL_PERCENT_PROGRESS +
784 upParams.currentPercentage * GetTmpProgressValue()),
785 static_cast<int>(pkgStartPosition[upParams.pkgLocation + 1] * FULL_PERCENT_PROGRESS));
786 SetMessageToMisc(upParams.miscCmd, upParams.pkgLocation + 1, "upgraded_pkg_num");
787 PkgManager::ReleasePackageInstance(manager);
788 return status;
789 }
790
DoInstallPackages(UpdaterParams & upParams,std::vector<double> & pkgStartPosition)791 static UpdaterStatus DoInstallPackages(UpdaterParams &upParams, std::vector<double> &pkgStartPosition)
792 {
793 UPDATER_INIT_RECORD;
794 UpdaterStatus status = UPDATE_UNKNOWN;
795 if (upParams.pkgLocation == upParams.updatePackage.size()) {
796 LOG(WARNING) << "all packages has been installed, directly return success";
797 upParams.callbackProgress(FULL_PERCENT_PROGRESS);
798 return UPDATE_SUCCESS;
799 }
800 for (; upParams.pkgLocation < upParams.updatePackage.size(); upParams.pkgLocation++) {
801 PkgManager::PkgManagerPtr manager = PkgManager::CreatePackageInstance();
802 if (manager == nullptr) {
803 LOG(ERROR) << "CreatePackageInstance fail";
804 return UPDATE_ERROR;
805 }
806 auto startTime = std::chrono::system_clock::now();
807 upParams.initialProgress = ((UPDATER_UI_INSTANCE.GetCurrentPercent() / FULL_PERCENT) >
808 pkgStartPosition[upParams.pkgLocation]) ?
809 (UPDATER_UI_INSTANCE.GetCurrentPercent() / FULL_PERCENT) : pkgStartPosition[upParams.pkgLocation];
810 upParams.currentPercentage = pkgStartPosition[upParams.pkgLocation + 1] - upParams.initialProgress;
811 LOG(INFO) << "InstallUpdaterPackage pkg is " << upParams.updatePackage[upParams.pkgLocation] <<
812 " percent:" << upParams.initialProgress << "~" << pkgStartPosition[upParams.pkgLocation + 1];
813
814 status = InstallUpdaterPackage(upParams, manager);
815 auto endTime = std::chrono::system_clock::now();
816 upParams.installTime[upParams.pkgLocation] = upParams.installTime[upParams.pkgLocation] + endTime - startTime;
817 WriteInstallTime(upParams);
818 if (status != UPDATE_SUCCESS) {
819 LOG(ERROR) << "InstallUpdaterPackage failed! Pkg is " << upParams.updatePackage[upParams.pkgLocation];
820 if (!CheckResultFail()) {
821 UPDATER_LAST_WORD(status, "InstallUpdaterPackage failed");
822 }
823 PkgManager::ReleasePackageInstance(manager);
824 return status;
825 }
826 ProcessPrgrsSmooth(
827 static_cast<int>(upParams.initialProgress * FULL_PERCENT_PROGRESS +
828 upParams.currentPercentage * GetTmpProgressValue()),
829 static_cast<int>(pkgStartPosition[upParams.pkgLocation + 1] * FULL_PERCENT_PROGRESS),
830 upParams, upParams.pkgLocation == upParams.updatePackage.size() - 1);
831 SetMessageToMisc(upParams.miscCmd, upParams.pkgLocation + 1, "upgraded_pkg_num");
832 PkgManager::ReleasePackageInstance(manager);
833 }
834 return status;
835 }
836
DoUpdateBinfiles(UpdaterParams & upParams)837 UpdaterStatus DoUpdateBinfiles(UpdaterParams &upParams)
838 {
839 UPDATER_INIT_RECORD;
840 UpdaterStatus status = UPDATE_UNKNOWN;
841 std::vector<double> pkgStartPosition {};
842 double updateStartPosition = 0.0;
843 status = CalcProgress(upParams, pkgStartPosition, updateStartPosition);
844 if (status != UPDATE_SUCCESS) {
845 UPDATER_LAST_WORD(status, "CalcProgress failed");
846 return status;
847 }
848 for (unsigned int i = 0; i < upParams.updateBin.size(); i++) {
849 LOG(INFO) << "package " << i << ":" << upParams.updateBin[i] <<
850 " percent:" << upParams.currentPercentage;
851 }
852 if (upParams.callbackProgress == nullptr) {
853 LOG(ERROR) << "CallbackProgress is nullptr";
854 return UPDATE_CORRUPT;
855 }
856 float value = (UPDATER_UI_INSTANCE.GetCurrentPercent() > (updateStartPosition * FULL_PERCENT_PROGRESS)) ?
857 UPDATER_UI_INSTANCE.GetCurrentPercent() : (updateStartPosition * FULL_PERCENT_PROGRESS);
858 upParams.callbackProgress(value);
859 // 执行安装
860 status = DoInstallBinfiles(upParams, pkgStartPosition);
861 if (NotifyActionResult(upParams, status, {GET_UPDATE_STATUS}) != UPDATE_SUCCESS) {
862 LOG(ERROR) << "get status fail";
863 return UPDATE_CORRUPT;
864 }
865 if (status != UPDATE_SUCCESS) {
866 UPDATER_LAST_WORD(status, "DoInstallBinfiles failed");
867 return status;
868 }
869 if (upParams.forceUpdate) {
870 UPDATER_UI_INSTANCE.ShowLogRes(TR(LABEL_UPD_OK_SHUTDOWN));
871 }
872 if (NotifyActionResult(upParams, status, {GET_UPDATE_STATUS}) != UPDATE_SUCCESS) {
873 LOG(ERROR) << "get status fail";
874 return UPDATE_CORRUPT;
875 }
876 UPDATER_UI_INSTANCE.ShowSuccessPage();
877 return status;
878 }
879
DoUpdatePackages(UpdaterParams & upParams)880 UpdaterStatus DoUpdatePackages(UpdaterParams &upParams)
881 {
882 UPDATER_INIT_RECORD;
883 UpdaterStatus status = UPDATE_UNKNOWN;
884 std::vector<double> pkgStartPosition {};
885 double updateStartPosition = 0.0;
886 status = CalcProgress(upParams, pkgStartPosition, updateStartPosition);
887 if (status != UPDATE_SUCCESS) {
888 UPDATER_LAST_WORD(status, "CalcProgress failed");
889 return status;
890 }
891 for (unsigned int i = 0; i < upParams.updatePackage.size(); i++) {
892 LOG(INFO) << "package " << i << ":" << upParams.updatePackage[i] <<
893 " percent:" << upParams.currentPercentage;
894 }
895 if (upParams.callbackProgress == nullptr) {
896 LOG(ERROR) << "CallbackProgress is nullptr";
897 return UPDATE_CORRUPT;
898 }
899 float value = (UPDATER_UI_INSTANCE.GetCurrentPercent() > (updateStartPosition * FULL_PERCENT_PROGRESS)) ?
900 UPDATER_UI_INSTANCE.GetCurrentPercent() : (updateStartPosition * FULL_PERCENT_PROGRESS);
901 upParams.callbackProgress(GetTotalProgressRatio() * value);
902 status = DoInstallPackages(upParams, pkgStartPosition);
903 if (NotifyActionResult(upParams, status, {SET_UPDATE_STATUS}) != UPDATE_SUCCESS) {
904 LOG(ERROR) << "set status fail";
905 return UPDATE_CORRUPT;
906 }
907 if (status != UPDATE_SUCCESS) {
908 UPDATER_LAST_WORD(status, "DoInstallPackages failed");
909 return status;
910 }
911 return status;
912 }
913
ShowSuccessUi(UpdaterParams & upParams,UpdaterStatus & status)914 static void ShowSuccessUi(UpdaterParams &upParams, UpdaterStatus &status)
915 {
916 if (status != UPDATE_SUCCESS) {
917 LOG(ERROR) << "update not succ";
918 return;
919 }
920 if (upParams.forceUpdate) {
921 UPDATER_UI_INSTANCE.ShowLogRes(TR(LABEL_UPD_OK_SHUTDOWN));
922 }
923 if (NotifyActionResult(upParams, status, {GET_UPDATE_STATUS}) != UPDATE_SUCCESS) {
924 LOG(ERROR) << "get status fail";
925 status = UPDATE_CORRUPT;
926 return;
927 }
928 UPDATER_UI_INSTANCE.ShowSuccessPage();
929 }
930
CheckAndSetSlot(UpdaterParams & upParams)931 __attribute__((weak)) UpdaterStatus CheckAndSetSlot([[maybe_unused]]UpdaterParams &upParams)
932 {
933 LOG(INFO) << "not need check and set slot";
934 #ifndef UPDATER_UT
935 SetActiveSlot(); // UPDATER_AB_SUPPORT
936 #endif
937 return UPDATE_SUCCESS;
938 }
939
PostUpdateSyncProcess(bool isOtaUpdate,const UpdaterParams & upParams,UpdaterStatus & status)940 __attribute__((weak)) bool PostUpdateSyncProcess([[maybe_unused]] bool isOtaUpdate,
941 [[maybe_unused]] const UpdaterParams &upParams, [[maybe_unused]] UpdaterStatus &status)
942 {
943 LOG(INFO) << "not need sync process";
944 return true;
945 }
946
PostUpdate(UpdaterParams & upParams,UpdaterStatus & status,const std::vector<std::string> & updateList,const std::string & type)947 static void PostUpdate(UpdaterParams &upParams, UpdaterStatus &status,
948 const std::vector<std::string>& updateList, const std::string& type)
949 {
950 if (status == UPDATE_SUCCESS) {
951 status = CheckAndSetSlot(upParams);
952 }
953 ClearUpdateSlotParam();
954 ClearUpdateSuffixParam();
955 ShowSuccessUi(upParams, status);
956 bool updateResult = (status == UPDATE_SUCCESS);
957
958 std::string writeBuffer;
959 std::string buf;
960 std::string time;
961 if (!updateResult) {
962 const std::string resultPath = std::string(UPDATER_PATH) + "/" + std::string(UPDATER_RESULT_FILE);
963 std::ifstream fin {resultPath};
964 if (!fin.is_open() || !std::getline(fin, buf)) {
965 LOG(ERROR) << "read result file error " << resultPath;
966 buf = "fail|";
967 }
968 } else {
969 buf = "pass|";
970 upParams.pkgLocation = upParams.pkgLocation == 0 ? upParams.pkgLocation : (upParams.pkgLocation - 1);
971 }
972
973 for (unsigned int i = 0; i < upParams.pkgLocation; i++) {
974 time = DurationToString(upParams.installTime, i);
975 writeBuffer += (i < updateList.size() ? updateList[i] : "");
976 writeBuffer += "|pass||install_time=" + time + "|\n";
977 }
978 time = DurationToString(upParams.installTime, upParams.pkgLocation);
979
980 writeBuffer += (upParams.pkgLocation < updateList.size() ? updateList[upParams.pkgLocation] : "");
981 writeBuffer += "|" + buf + "|install_time=" + time + "|\n";
982 for (unsigned int i = upParams.pkgLocation + 1; i < updateList.size(); i++) {
983 writeBuffer += updateList[i] + "\n";
984 }
985 if (!writeBuffer.empty()) {
986 writeBuffer.pop_back();
987 }
988 LOG(INFO) << "post over, writeBuffer = " << writeBuffer;
989 WriteDumpResult(writeBuffer, UPDATER_RESULT_FILE);
990 DeleteInstallTimeFile();
991 }
992
PostUpdateBinfiles(UpdaterParams & upParams,UpdaterStatus & status)993 static void PostUpdateBinfiles(UpdaterParams &upParams, UpdaterStatus &status)
994 {
995 PostUpdate(upParams, status, upParams.updateBin, "Binfiles");
996 }
997
PostUpdatePackages(UpdaterParams & upParams,UpdaterStatus & status)998 static void PostUpdatePackages(UpdaterParams &upParams, UpdaterStatus &status)
999 {
1000 PostUpdate(upParams, status, upParams.updatePackage, "Packages");
1001 }
1002
PreSdcardUpdatePackages(UpdaterParams & upParams)1003 static UpdaterStatus PreSdcardUpdatePackages(UpdaterParams &upParams)
1004 {
1005 UpdaterStatus status = UPDATE_UNKNOWN;
1006 ON_SCOPE_EXIT(syncresult) {
1007 NotifyPreCheck(status, upParams);
1008 };
1009 upParams.installTime.resize(upParams.updatePackage.size(), std::chrono::duration<double>(0));
1010 // verify packages first
1011 if (upParams.retryCount == 0 && !IsBatteryCapacitySufficient()) {
1012 UPDATER_UI_INSTANCE.ShowUpdInfo(TR(LOG_LOWPOWER));
1013 UPDATER_UI_INSTANCE.Sleep(UI_SHOW_DURATION);
1014 LOG(ERROR) << "Battery is not sufficient for install package.";
1015 return UPDATE_SKIP;
1016 }
1017 if (SetUpdateParam(upParams, true) != UPDATE_SUCCESS) {
1018 LOG(ERROR) << "SetUpdateParam failed";
1019 return UPDATE_ERROR;
1020 }
1021 status = VerifyPackages(upParams);
1022 NotifyPreCheck(status, upParams);
1023 CANCEL_SCOPE_EXIT_GUARD(syncresult);
1024 if (status != UPDATE_SUCCESS) {
1025 return UPDATE_CORRUPT; // verify package failed must return UPDATE_CORRUPT, ux need it !!!
1026 }
1027 #ifdef UPDATER_USE_PTABLE
1028 if (!PtablePreProcess::GetInstance().DoPtableProcess(upParams)) {
1029 LOG(ERROR) << "DoPtableProcess failed";
1030 return UPDATE_ERROR;
1031 }
1032 #endif
1033 return UPDATE_SUCCESS;
1034 }
1035
PostSdcardUpdatePackages(UpdaterParams & upParams,UpdaterStatus & status)1036 static void PostSdcardUpdatePackages(UpdaterParams &upParams, UpdaterStatus &status)
1037 {
1038 (void)PostUpdateSyncProcess(false, upParams, status);
1039 ClearUpdateSlotParam();
1040 ClearUpdateSuffixParam();
1041 if (Utils::CheckUpdateMode(Updater::SDCARD_INTRAL_MODE)) {
1042 PostUpdatePackages(upParams, status);
1043 } else if (status == UPDATE_SUCCESS) {
1044 if (NotifyActionResult(upParams, status, {GET_UPDATE_STATUS}) != UPDATE_SUCCESS) {
1045 LOG(ERROR) << "get status fail";
1046 status = UPDATE_CORRUPT;
1047 return;
1048 }
1049 UPDATER_UI_INSTANCE.ShowSuccessPage();
1050 }
1051 }
1052
UpdaterFromSdcard(UpdaterParams & upParams)1053 UpdaterStatus UpdaterFromSdcard(UpdaterParams &upParams)
1054 {
1055 UPDATER_INIT_RECORD;
1056 upParams.callbackProgress = [] (float value) { UPDATER_UI_INSTANCE.ShowProgress(value); };
1057 SetMessageToMisc(upParams.miscCmd, 0, "sdcard_update");
1058 UpdaterStatus status = UPDATE_SUCCESS;
1059 if (NotifyActionResult(upParams, status, {TRIGGER_SDUPDATE}) != UPDATE_SUCCESS) {
1060 LOG(ERROR) << "trigger sd update fail";
1061 return UPDATE_ERROR;
1062 }
1063 status = CheckSdcardPkgs(upParams);
1064 if (status != UPDATE_SUCCESS) {
1065 LOG(ERROR) << "can not find sdcard packages";
1066 if (NotifyActionResult(upParams, status, {SET_UPDATE_STATUS, GET_UPDATE_STATUS}) != UPDATE_SUCCESS) {
1067 LOG(ERROR) << "notify action fail";
1068 }
1069 return UPDATE_ERROR;
1070 }
1071 status = PreSdcardUpdatePackages(upParams);
1072 if (status == UPDATE_SUCCESS) {
1073 upParams.initialProgress += VERIFY_PERCENT;
1074 upParams.currentPercentage -= VERIFY_PERCENT;
1075
1076 STAGE(UPDATE_STAGE_BEGIN) << "UpdaterFromSdcard";
1077 LOG(INFO) << "UpdaterFromSdcard start, sdcard updaterPath : " << upParams.updatePackage[upParams.pkgLocation];
1078 UPDATER_UI_INSTANCE.ShowLog(TR(LOG_SDCARD_NOTMOVE));
1079 status = DoUpdatePackages(upParams);
1080 }
1081 PostSdcardUpdatePackages(upParams, status);
1082 return status;
1083 }
1084
InstallUpdaterBinfiles(UpdaterParams & upParams)1085 UpdaterStatus InstallUpdaterBinfiles(UpdaterParams &upParams)
1086 {
1087 UpdaterInit::GetInstance().InvokeEvent(UPDATER_PRE_UPDATE_PACKAGE_EVENT);
1088 UpdaterStatus status = PreUpdatePackages(upParams);
1089 if (status == UPDATE_SUCCESS) {
1090 status = DoUpdateBinfiles(upParams);
1091 }
1092 PostUpdateBinfiles(upParams, status);
1093 UpdaterInit::GetInstance().InvokeEvent(UPDATER_POST_UPDATE_PACKAGE_EVENT);
1094 return status;
1095 }
1096
InstallUpdaterPackages(UpdaterParams & upParams)1097 UpdaterStatus InstallUpdaterPackages(UpdaterParams &upParams)
1098 {
1099 UpdaterInit::GetInstance().InvokeEvent(UPDATER_PRE_UPDATE_PACKAGE_EVENT);
1100 UpdaterStatus status = PreUpdatePackages(upParams);
1101 if (status == UPDATE_SUCCESS) {
1102 status = DoUpdatePackages(upParams);
1103 }
1104 PostUpdatePackages(upParams, status);
1105 (void)PostUpdateSyncProcess(true, upParams, status);
1106 UpdaterInit::GetInstance().InvokeEvent(UPDATER_POST_UPDATE_PACKAGE_EVENT);
1107 return status;
1108 }
1109
StartUpdaterEntry(UpdaterParams & upParams)1110 UpdaterStatus StartUpdaterEntry(UpdaterParams &upParams)
1111 {
1112 UpdaterStatus status = UPDATE_UNKNOWN;
1113 status = PreStartUpdaterEntry(upParams, status);
1114 if (status != UPDATE_SUCCESS) {
1115 LOG(ERROR) << "PreStartUpdaterEntry failed";
1116 return status;
1117 }
1118 status = DoUpdaterEntry(upParams);
1119 if (status != UPDATE_SUCCESS) {
1120 LOG(WARNING) << "DoUpdaterEntry failed";
1121 }
1122 status = PostStartUpdaterEntry(upParams, status);
1123 if (status != UPDATE_SUCCESS) {
1124 LOG(ERROR) << "PostStartUpdaterEntry failed";
1125 }
1126 return status;
1127 }
1128
DoFactoryRstEntry(UpdaterParams & upParams)1129 UpdaterStatus DoFactoryRstEntry(UpdaterParams &upParams)
1130 {
1131 UpdaterStatus status = UPDATE_UNKNOWN;
1132 if (upParams.factoryResetMode == "factory_wipe_data") {
1133 UPDATER_UI_INSTANCE.ShowProgressPage();
1134 LOG(INFO) << "Factory level FactoryReset begin";
1135 status = UPDATE_SUCCESS;
1136 #if !defined(UPDATER_UT) && defined(UPDATER_UI_SUPPORT)
1137 DoProgress();
1138 #endif
1139 if (FactoryReset(FACTORY_WIPE_DATA, "/data") != 0) {
1140 LOG(ERROR) << "FactoryReset factory level failed";
1141 status = UPDATE_ERROR;
1142 }
1143 UPDATER_UI_INSTANCE.ShowLogRes(
1144 (status != UPDATE_SUCCESS) ? TR(LOGRES_FACTORY_FAIL) : TR(LOGRES_FACTORY_DONE));
1145 } else if (upParams.factoryResetMode == "user_wipe_data" || upParams.factoryResetMode == "menu_wipe_data") {
1146 UPDATER_UI_INSTANCE.ShowProgressPage();
1147 LOG(INFO) << "User level FactoryReset begin";
1148 status = UPDATE_SUCCESS;
1149 #if !defined(UPDATER_UT) && defined(UPDATER_UI_SUPPORT)
1150 DoProgress();
1151 #endif
1152 if (FactoryReset(upParams.factoryResetMode == "user_wipe_data" ?
1153 USER_WIPE_DATA : MENU_WIPE_DATA, "/data") != 0) {
1154 LOG(ERROR) << "FactoryReset user level failed";
1155 status = UPDATE_ERROR;
1156 }
1157 if (status != UPDATE_SUCCESS) {
1158 UPDATER_UI_INSTANCE.ShowLogRes(TR(LOGRES_WIPE_FAIL));
1159 } else {
1160 UPDATER_UI_INSTANCE.ShowSuccessPage();
1161 UPDATER_UI_INSTANCE.ShowLogRes(TR(LOGRES_WIPE_FINISH));
1162 ClearUpdaterParaMisc();
1163 std::this_thread::sleep_for(std::chrono::milliseconds(UI_SHOW_DURATION));
1164 }
1165 }
1166 return status;
1167 }
1168
DoUpdaterEntry(UpdaterParams & upParams)1169 UpdaterStatus DoUpdaterEntry(UpdaterParams &upParams)
1170 {
1171 UpdaterStatus status = UPDATE_UNKNOWN;
1172 if (upParams.updateBin.size() > 0) {
1173 LOG(INFO) << "start bin update";
1174 UPDATER_UI_INSTANCE.ShowProgressPage();
1175 status = InstallUpdaterBinfiles(upParams);
1176 } else if (upParams.updateMode == SDCARD_UPDATE) {
1177 LOG(INFO) << "start sdcard update";
1178 UPDATER_UI_INSTANCE.ShowProgressPage();
1179 status = UpdaterFromSdcard(upParams);
1180 return status;
1181 } else if (upParams.updatePackage.size() > 0) {
1182 UPDATER_UI_INSTANCE.ShowProgressPage();
1183 status = InstallUpdaterPackages(upParams);
1184 } else if (upParams.updateMode == SUBPKG_UPDATE) {
1185 UPDATER_UI_INSTANCE.ShowProgressPage();
1186 if (CheckMountData() != 0) {
1187 LOG(ERROR) << "subpkg update mount data fail";
1188 return UPDATE_ERROR;
1189 }
1190 status = UpdateSubPkg(upParams);
1191 if (status == UPDATE_SUCCESS) {
1192 UPDATER_UI_INSTANCE.ShowSuccessPage();
1193 }
1194 } else {
1195 status = DoFactoryRstEntry(upParams);
1196 }
1197 return status;
1198 }
1199
InitOptionsFuncTab(char * & optarg,PackageUpdateMode & mode,UpdaterParams & upParams)1200 std::unordered_map<std::string, std::function<void ()>> InitOptionsFuncTab(char* &optarg,
1201 PackageUpdateMode &mode, UpdaterParams &upParams)
1202 {
1203 std::unordered_map<std::string, std::function<void ()>> optionsFuncTab {
1204 {"update_bin", [&]() -> void
1205 {
1206 upParams.updateBin.push_back(optarg);
1207 (void)UPDATER_UI_INSTANCE.SetMode(UPDATERMODE_OTA);
1208 mode = HOTA_UPDATE;
1209 }},
1210 {"update_package", [&]() -> void
1211 {
1212 upParams.updatePackage.push_back(optarg);
1213 (void)UPDATER_UI_INSTANCE.SetMode(UPDATERMODE_OTA);
1214 mode = HOTA_UPDATE;
1215 }},
1216 {"retry_count", [&]() -> void
1217 {
1218 upParams.retryCount = atoi(optarg);
1219 HardwareFaultRetry::GetInstance().SetRetryCount(upParams.retryCount);
1220 }},
1221 {"panic_count", [&]() -> void
1222 {
1223 upParams.panicCount = atoi(optarg);
1224 }},
1225 {"factory_wipe_data", [&]() -> void
1226 {
1227 (void)UPDATER_UI_INSTANCE.SetMode(UPDATERMODE_REBOOTFACTORYRST);
1228 upParams.factoryResetMode = "factory_wipe_data";
1229 }},
1230 {"wipe_data_at_factoryreset_0", [&]() -> void
1231 {
1232 (void)UPDATER_UI_INSTANCE.SetMode(UPDATERMODE_ATFACTORYRST);
1233 upParams.factoryResetMode = "factory_wipe_data";
1234 }},
1235 {"user_wipe_data", [&]() -> void
1236 {
1237 (void)UPDATER_UI_INSTANCE.SetMode(UPDATERMODE_REBOOTFACTORYRST);
1238 upParams.factoryResetMode = "user_wipe_data";
1239 }},
1240 {"wipe_data_factory_lowlevel", [&]() -> void
1241 {
1242 (void)UPDATER_UI_INSTANCE.SetMode(UPDATERMODE_REBOOTFACTORYRST);
1243 upParams.factoryResetMode = "user_wipe_data";
1244 }},
1245 {"menu_wipe_data", [&]() -> void
1246 {
1247 (void)UPDATER_UI_INSTANCE.SetMode(UPDATERMODE_REBOOTFACTORYRST);
1248 upParams.factoryResetMode = "menu_wipe_data";
1249 }},
1250 {"upgraded_pkg_num", [&]() -> void
1251 {
1252 upParams.pkgLocation = static_cast<unsigned int>(atoi(optarg));
1253 }},
1254 {"sdcard_update", [&]() -> void
1255 {
1256 upParams.updateMode = SDCARD_UPDATE;
1257 upParams.sdExtMode = SDCARD_NORMAL_UPDATE;
1258 }},
1259 {"UPDATE:MAINIMG", [&]() -> void
1260 {
1261 upParams.updateMode = SDCARD_UPDATE;
1262 upParams.sdExtMode = SDCARD_MAINIMG;
1263 }},
1264 {"factory_sd_update", [&]() -> void
1265 {
1266 upParams.updateMode = SDCARD_UPDATE;
1267 upParams.sdExtMode = SDCARD_NORMAL_UPDATE;
1268 }},
1269 {"UPDATE:SD", [&]() -> void
1270 {
1271 upParams.updateMode = SDCARD_UPDATE;
1272 upParams.sdExtMode = SDCARD_NORMAL_UPDATE;
1273 }},
1274 {"UPDATE:SDFROMDEV", [&]() -> void
1275 {
1276 upParams.updateMode = SDCARD_UPDATE;
1277 upParams.sdExtMode = SDCARD_UPDATE_FROM_DEV;
1278 }},
1279 {"force_update_action", [&]() -> void
1280 {
1281 if (std::string(optarg) == POWEROFF) {
1282 upParams.forceUpdate = true;
1283 }
1284 }},
1285 {"night_update", [&]() -> void
1286 {
1287 (void)UPDATER_UI_INSTANCE.SetMode(UPDATERMODE_NIGHTUPDATE);
1288 upParams.forceReboot = true;
1289 }},
1290 {"sdcard_intral_update", [&]() -> void
1291 {
1292 upParams.updateMode = SDCARD_UPDATE;
1293 }},
1294 {"shrink_info", [&]() -> void
1295 {
1296 upParams.shrinkInfo = std::string(optarg);
1297 }},
1298 {"virtual_shrink_info", [&]() -> void
1299 {
1300 upParams.virtualShrinkInfo = std::string(optarg);
1301 }},
1302 {"subpkg_update", [&]() -> void
1303 {
1304 (void)UPDATER_UI_INSTANCE.SetMode(UPDATERMODE_OTA);
1305 upParams.updateMode = SUBPKG_UPDATE;
1306 mode = HOTA_UPDATE;
1307 }}
1308 };
1309 return optionsFuncTab;
1310 }
1311
IsSupportOption(const std::string & option)1312 __attribute__((weak)) bool IsSupportOption([[maybe_unused]] const std::string &option)
1313 {
1314 LOG(INFO) << "option: " << option;
1315 return false;
1316 }
1317
ProcessOtherOption(const std::string & option,UpdaterParams & upParams,PackageUpdateMode & mode)1318 __attribute__((weak)) UpdaterStatus ProcessOtherOption([[maybe_unused]] const std::string &option,
1319 [[maybe_unused]] UpdaterParams &upParams, PackageUpdateMode &mode)
1320 {
1321 return UPDATE_UNKNOWN;
1322 }
1323
StartUpdater(const std::vector<std::string> & args,char ** argv,PackageUpdateMode & mode,UpdaterParams & upParams)1324 static UpdaterStatus StartUpdater(const std::vector<std::string> &args,
1325 char **argv, PackageUpdateMode &mode, UpdaterParams &upParams)
1326 {
1327 std::vector<char *> extractedArgs;
1328 int rc;
1329 int optionIndex;
1330 auto optionsFuncTab = InitOptionsFuncTab(optarg, mode, upParams);
1331
1332 for (const auto &arg : args) {
1333 extractedArgs.push_back(const_cast<char *>(arg.c_str()));
1334 STAGE(UPDATE_STAGE_OUT) << "option:" << arg;
1335 LOG(INFO) << "option:" << arg;
1336 }
1337 extractedArgs.push_back(nullptr);
1338 extractedArgs.insert(extractedArgs.begin(), argv[0]);
1339 while ((rc = getopt_long(extractedArgs.size() - 1, extractedArgs.data(), "", OPTIONS, &optionIndex)) != -1) {
1340 switch (rc) {
1341 case 0: {
1342 std::string option = OPTIONS[optionIndex].name;
1343 if (optionsFuncTab.find(option) != optionsFuncTab.end()) {
1344 auto optionsFunc = optionsFuncTab.at(option);
1345 optionsFunc();
1346 } else if (IsSupportOption(option)) {
1347 return ProcessOtherOption(option, upParams, mode);
1348 }
1349 break;
1350 }
1351 default:
1352 LOG(ERROR) << "Invalid argument.";
1353 break;
1354 }
1355 }
1356 optind = 1;
1357 if (upParams.pkgLocation == 0) {
1358 DeleteInstallTimeFile();
1359 }
1360 // Sanity checks
1361 if (upParams.updateMode == SDCARD_UPDATE) {
1362 (void)UPDATER_UI_INSTANCE.SetMode(UPDATERMODE_SDCARD);
1363 mode = SDCARD_UPDATE;
1364 }
1365 return StartUpdaterEntry(upParams);
1366 }
1367
1368 // add updater mode
1369 REGISTER_MODE(Updater, "updater.hdc.configfs");
1370
IsNeedWipe()1371 __attribute__((weak)) bool IsNeedWipe()
1372 {
1373 return false;
1374 }
1375
NotifySdUpdateReboot(const UpdaterParams & upParams)1376 __attribute__((weak)) bool NotifySdUpdateReboot(const UpdaterParams &upParams)
1377 {
1378 if (upParams.sdExtMode == SDCARD_UPDATE_FROM_DEV) {
1379 NotifyReboot("updater", "Updater wipe data after upgrade success", "--user_wipe_data");
1380 return true;
1381 }
1382 if (upParams.sdExtMode == SDCARD_UPDATE_FROM_DATA) {
1383 std::string extData = "--user_wipe_data\n--";
1384 extData += ERASE_LOG_OEMINFO;
1385 NotifyReboot("updater", "Updater wipe data after upgrade success", extData);
1386 return true;
1387 }
1388 return false;
1389 }
1390
NotifyAutoReboot(PackageUpdateMode & mode)1391 __attribute__((weak)) void NotifyAutoReboot(PackageUpdateMode &mode)
1392 {
1393 return;
1394 }
1395
RebootAfterUpdateSuccess(const UpdaterParams & upParams,const std::vector<std::string> & args)1396 void RebootAfterUpdateSuccess(const UpdaterParams &upParams, const std::vector<std::string> &args)
1397 {
1398 std::string extData;
1399 if (IsNeedUpdateNode(args, extData)) {
1400 LOG(INFO) << "Need reboot to updater again.";
1401 NotifyReboot("updater", "Updater update dev node after upgrade success when ptable change", extData);
1402 }
1403 if (IsNeedWipe()) {
1404 NotifyReboot("updater", "Updater wipe data after upgrade success", "--user_wipe_data");
1405 return;
1406 }
1407 if (NotifySdUpdateReboot(upParams)) {
1408 LOG(INFO) << "sd update and wipe data";
1409 return;
1410 }
1411 upParams.forceUpdate ? Utils::DoShutdown("Updater update success go shut down") :
1412 NotifyReboot("", "Updater update success");
1413 }
1414
UpdaterMain(int argc,char ** argv)1415 int UpdaterMain(int argc, char **argv)
1416 {
1417 [[maybe_unused]] UpdaterStatus status = UPDATE_UNKNOWN;
1418 UpdaterParams upParams;
1419 upParams.callbackProgress = [] (float value) { UPDATER_UI_INSTANCE.ShowProgress(value); };
1420 UpdaterInit::GetInstance().InvokeEvent(UPDATER_PRE_INIT_EVENT);
1421 std::vector<std::string> args = ParseParams(argc, argv);
1422 LOG(INFO) << "Ready to start";
1423 #if !defined(UPDATER_UT) && defined(UPDATER_UI_SUPPORT)
1424 UPDATER_UI_INSTANCE.InitEnv();
1425 #endif
1426 UpdaterInit::GetInstance().InvokeEvent(UPDATER_INIT_EVENT);
1427 PackageUpdateMode mode = UNKNOWN_UPDATE;
1428 status = StartUpdater(args, argv, mode, upParams);
1429 #if !defined(UPDATER_UT) && defined(UPDATER_UI_SUPPORT)
1430 UPDATER_UI_INSTANCE.Sleep(UI_SHOW_DURATION);
1431 if (status != UPDATE_SUCCESS && status != UPDATE_SKIP) {
1432 if (mode == HOTA_UPDATE) {
1433 UpdaterInit::GetInstance().InvokeEvent(UPDATER_POST_INIT_EVENT);
1434 UPDATER_UI_INSTANCE.ShowFailedPage();
1435 if (upParams.forceReboot) {
1436 Utils::UsSleep(5 * DISPLAY_TIME); // 5 : 5s
1437 PostUpdater(true);
1438 NotifyReboot("", "Updater night update fail");
1439 return 0;
1440 }
1441 } else if (mode == SDCARD_UPDATE) {
1442 UPDATER_UI_INSTANCE.ShowLogRes(
1443 status == UPDATE_CORRUPT ? TR(LOGRES_VERIFY_FAILED) : TR(LOGRES_UPDATE_FAILED));
1444 UPDATER_UI_INSTANCE.ShowFailedPage();
1445 } else if (upParams.factoryResetMode == "user_wipe_data" ||
1446 upParams.factoryResetMode == "menu_wipe_data" || upParams.factoryResetMode == "factory_wipe_data") {
1447 UPDATER_UI_INSTANCE.ShowFailedPage();
1448 } else if (CheckUpdateMode(USB_UPDATE_FAIL)) {
1449 (void)UPDATER_UI_INSTANCE.SetMode(UPDATERMODE_USBUPDATE);
1450 UPDATER_UI_INSTANCE.ShowFailedPage();
1451 } else {
1452 UPDATER_UI_INSTANCE.ShowMainpage();
1453 UPDATER_UI_INSTANCE.SaveScreen();
1454 }
1455 // Wait for user input
1456 NotifyAutoReboot(mode);
1457 while (true) {
1458 Utils::UsSleep(DISPLAY_TIME);
1459 }
1460 return 0;
1461 }
1462 #endif
1463 PostUpdater(true);
1464 RebootAfterUpdateSuccess(upParams, args);
1465 return 0;
1466 }
1467 } // Updater
1468