• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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> &notifyActionVec)
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