1 /*
2  * Copyright (c) 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 
16 #include "firmware_manager.h"
17 
18 #include <cstdlib>
19 #include <thread>
20 
21 #include "config_parse.h"
22 #include "dupdate_errno.h"
23 #include "dupdate_upgrade_helper.h"
24 #ifdef NETMANAGER_BASE_ENABLE
25 #include "dupdate_net_manager.h"
26 #endif
27 #include "file_utils.h"
28 #include "firmware_callback_utils.h"
29 #include "firmware_changelog_utils.h"
30 #include "firmware_common.h"
31 #include "firmware_constant.h"
32 #include "firmware_database.h"
33 #include "firmware_event_listener.h"
34 #include "firmware_flow_manager.h"
35 #include "firmware_iexecute_mode.h"
36 #include "firmware_log.h"
37 #include "firmware_manual_check_mode.h"
38 #include "firmware_download_mode.h"
39 #include "firmware_install_apply_mode.h"
40 #include "firmware_status_cache.h"
41 #include "firmware_task_operator.h"
42 #include "firmware_update_helper.h"
43 #include "progress_thread.h"
44 #include "schedule_task.h"
45 #include "startup_schedule.h"
46 #include "string_utils.h"
47 #include "time_utils.h"
48 
49 namespace OHOS {
50 namespace UpdateEngine {
51 constexpr int32_t INIT_DELAY_TIME = 5; // 进程启动延时时间5秒,为了安装重启之后可以看到版本号及时刷新
52 constexpr int32_t PROCESS_EXIT_DELAY_TIME = 1; // 进程退出等待时间,单位:秒
53 constexpr uint64_t PULLUP_AFTER_TERMINATE_INTERVAL = 5; // 终止升级后SA拉起间隔
54 
FirmwareManager()55 FirmwareManager::FirmwareManager() {}
56 
~FirmwareManager()57 FirmwareManager::~FirmwareManager()
58 {
59     DelayedSingleton<FirmwareEventListener>::GetInstance()->UnregisterNetChangedListener();
60 }
61 
Init(StartupReason startupReason)62 void FirmwareManager::Init(StartupReason startupReason)
63 {
64     DelayedSingleton<ConfigParse>::GetInstance()->LoadConfigInfo(); // 启动读取配置信息
65     FIRMWARE_LOGI("FirmwareManager Init");
66 
67     // 当StartupReason为PROCESS_ENV_RESET时, 会进行以下处理:
68     // 1. 删除Firmware目录(FIRMWARE_DIR_INFOS)中的所有允许删除的目录中的所有文件及子目录
69     // 2. 清空Firmware SP(FirmwarePreferencesUtil)中所有记录
70     // 3. 删除数据库(FirmwareDatabase/DownloadDatabase
71     if (startupReason == StartupReason::PROCESS_ENV_RESET) {
72         FileUtils::DestroyBaseDirectory(FIRMWARE_DIR_INFOS);
73         preferencesUtil_->RemoveAll();
74         DelayedSingleton<FirmwareDatabase>::GetInstance()->DeleteDbStore();
75     }
76     FileUtils::InitAndCreateBaseDirs(FIRMWARE_DIR_INFOS);
77 
78     std::thread initThread([this, startupReason] { this->DelayInit(startupReason); });
79     initThread.detach();
80 }
81 
DelayInit(StartupReason startupReason)82 void FirmwareManager::DelayInit(StartupReason startupReason)
83 {
84     FIRMWARE_LOGI("FirmwareManager DelayInit startupReason %{public}d", startupReason);
85     RestoreUpdate();
86     DelayedSingleton<FirmwareEventListener>::GetInstance()->RegisterNetChangedListener();
87 
88     auto eventType = CommonEventType::PROCESS_INIT;
89     if (startupReason == StartupReason::DEVICE_REBOOT) {
90         // 重启启动,延时5秒,等待系统初始化完再恢复周期提醒alarm | 执行升级结果判断  避免出现通知hap拉不起的问题
91         sleep(INIT_DELAY_TIME);
92         eventType = CommonEventType::BOOT_COMPLETE;
93     }
94 
95     // 以下两种情况会向OUC发送初始启动消息:
96     // 1. DUE启动原因为StartupReason::PROCESS_ENV_RESET,DUE缓存数据清空
97     // 2. DUE首次启动,还未向OUC发送过初始启动消息
98     NotifyInitEvent();
99 
100     // 处理 设备重启/进程初始化 事件
101     HandleEvent(eventType);
102 }
103 
RestoreUpdate()104 void FirmwareManager::RestoreUpdate()
105 {
106     FirmwareTask firmwareTask;
107     FirmwareTaskOperator().QueryTask(firmwareTask);
108     FIRMWARE_LOGI("RestoreUpdate status: %{public}d", firmwareTask.status);
109     if (firmwareTask.status == UpgradeStatus::DOWNLOAD_PAUSE) {
110         HandleBootDownloadPauseStatusProcess(firmwareTask);
111         return;
112     }
113     if (firmwareTask.status == UpgradeStatus::DOWNLOADING) {
114         HandleBootDownloadOnStatusProcess(firmwareTask);
115         return;
116     }
117     if (firmwareTask.status == UpgradeStatus::DOWNLOAD_SUCCESS) {
118         HandleBootDownloadedStatusProcess(firmwareTask);
119         return;
120     }
121 
122     if (firmwareTask.status == UpgradeStatus::INSTALLING) {
123         HandleBootInstallOnStatusProcess(firmwareTask);
124         return;
125     }
126 }
127 
IsIdle()128 bool FirmwareManager::IsIdle()
129 {
130     if (DelayedSingleton<FirmwareStatusCache>::GetInstance()->IsChecking()) {
131         FIRMWARE_LOGI("FirmwareManager IsIdle checking");
132         return false;
133     }
134 
135     FirmwareTask task;
136     FirmwareTaskOperator().QueryTask(task);
137     bool isIdle = !task.isExistTask;
138     FIRMWARE_LOGI("FirmwareManager IsIdle:%{public}s", StringUtils::GetBoolStr(isIdle).c_str());
139     return isIdle;
140 }
141 
GetScheduleTasks()142 std::vector<ScheduleTask> FirmwareManager::GetScheduleTasks()
143 {
144     ScheduleTask scheduleTask;
145     return {scheduleTask};
146 }
147 
Exit()148 bool FirmwareManager::Exit()
149 {
150     FIRMWARE_LOGI("FirmwareManager Exit");
151     return true;
152 }
153 
DoCancelDownload(BusinessError & businessError)154 void FirmwareManager::DoCancelDownload(BusinessError &businessError)
155 {
156     FirmwareTask task;
157     FirmwareTaskOperator().QueryTask(task);
158     if (!task.isExistTask) {
159         FIRMWARE_LOGI("DoCancelDownload no task");
160         businessError.Build(CallResult::FAIL, "no download task to cancel!");
161         businessError.AddErrorMessage(CAST_INT(DUPDATE_ERR_DOWNLOAD_COMMON_ERROR), "no download task to cancel!");
162         return;
163     }
164     ProgressThread::isCancel_ = true;
165     return;
166 }
167 
DoTerminateUpgrade(BusinessError & businessError)168 void FirmwareManager::DoTerminateUpgrade(BusinessError &businessError)
169 {
170     ScheduleTask scheduleTask;
171     scheduleTask.startupReason = StartupReason::PROCESS_ENV_RESET;
172     scheduleTask.minDelayTime = PULLUP_AFTER_TERMINATE_INTERVAL;
173     if (!DelayedSingleton<StartupSchedule>::GetInstance()->Schedule(scheduleTask)) {
174         FIRMWARE_LOGE("DoTerminateUpgrade fail");
175         businessError.AddErrorMessage(CAST_INT(DUPDATE_ERR_INTERNAL_ERROR), "terminate upgrade error!");
176         return;
177     }
178 
179     // 主线程拉起子线程之后向OUC返回回调结果,子线程sleep 1秒之后,DUE进程退出
180     auto execFunc = []() {
181         sleep(PROCESS_EXIT_DELAY_TIME);
182         _Exit(0);
183     };
184     std::thread th = std::thread(execFunc);
185     th.detach();
186 }
187 
DoCheck(OnCheckComplete onCheckComplete)188 void FirmwareManager::DoCheck(OnCheckComplete onCheckComplete)
189 {
190     auto *flowManager = new FirmwareFlowManager();
191     std::shared_ptr<FirmwareIExecuteMode> executeMode =
192         std::make_shared<FirmwareManualCheckMode>([=](BusinessError &businessError, CheckResult &checkResult) {
193             FIRMWARE_LOGI("FirmwareManager DoCheck newVersionInfoResult");
194             onCheckComplete(businessError, checkResult);
195             delete flowManager;
196         });
197     flowManager->SetExecuteMode(executeMode);
198     flowManager->Start();
199 }
200 
DoDownload(const DownloadOptions & downloadOptions,BusinessError & businessError)201 void FirmwareManager::DoDownload(const DownloadOptions &downloadOptions, BusinessError &businessError)
202 {
203     auto *flowManager = new FirmwareFlowManager();
204     std::shared_ptr<FirmwareIExecuteMode> executeMode =
205         std::make_shared<FirmwareDownloadMode>(downloadOptions, businessError, [=]() {
206             FIRMWARE_LOGI("FirmwareManager DoDownload finish");
207             delete flowManager;
208         });
209     flowManager->SetExecuteMode(executeMode);
210     flowManager->Start();
211 }
212 
CanInstall(void)213 bool FirmwareManager::CanInstall(void)
214 {
215     FirmwareTask task;
216     FirmwareTaskOperator firmwareTaskOperator;
217     firmwareTaskOperator.QueryTask(task);
218     FIRMWARE_LOGI("check can install task.status:%{public}d", CAST_INT(task.status));
219     if (FirmwareUpdateHelper::GetInstallType() == InstallType::SYS_INSTALLER) {
220         return task.status == UpgradeStatus::DOWNLOAD_SUCCESS || task.status == UpgradeStatus::INSTALL_SUCCESS;
221     } else {
222         return task.status == UpgradeStatus::DOWNLOAD_SUCCESS;
223     }
224 }
225 
DoInstall(const UpgradeOptions & upgradeOptions,BusinessError & businessError,InstallType installType)226 void FirmwareManager::DoInstall(const UpgradeOptions &upgradeOptions, BusinessError &businessError,
227     InstallType installType)
228 {
229     FIRMWARE_LOGI("FirmwareManager DoInstall upgradeOptions order:%{public}d, installType = %{public}d",
230         CAST_INT(upgradeOptions.order), CAST_INT(installType));
231     if (!CanInstall()) {
232         FIRMWARE_LOGI("status can not Install");
233         return;
234     }
235     FirmwareFlowManager *flowManager = new FirmwareFlowManager();
236     std::shared_ptr<FirmwareIExecuteMode> executeMode =
237         std::make_shared<FirmwareInstallApplyMode>(upgradeOptions, businessError, installType, [=]() {
238             FIRMWARE_LOGI("FirmwareManager DoInstall finish");
239         });
240     flowManager->SetExecuteMode(executeMode);
241     flowManager->Start();
242 }
243 
DoAutoDownloadSwitchChanged(bool isDownloadSwitchOn)244 void FirmwareManager::DoAutoDownloadSwitchChanged(bool isDownloadSwitchOn)
245 {
246     FIRMWARE_LOGI("DoAutoDownloadSwitchChanged isDownloadSwitchOn %{public}s", isDownloadSwitchOn ? "on" : "off");
247     preferencesUtil_->SaveBool(Firmware::AUTO_DOWNLOAD_SWITCH, isDownloadSwitchOn);
248     FirmwareTask task;
249     FirmwareTaskOperator().QueryTask(task);
250     if (!task.isExistTask) {
251         FIRMWARE_LOGI("DoAutoDownloadSwitchChanged no task");
252         return;
253     }
254     FIRMWARE_LOGI("DoAutoDownloadSwitchChanged current task status %{public}d", task.status);
255     // 当前是否有搜索完待下载的包
256     if (task.status != UpgradeStatus::CHECK_VERSION_SUCCESS) {
257         return;
258     }
259     if (!isDownloadSwitchOn) {
260         // 开关关,发送新版本通知
261         DelayedSingleton<FirmwareCallbackUtils>::GetInstance()->NotifyEvent(
262             task.taskId, EventId::EVENT_DOWNLOAD_WAIT, UpgradeStatus::CHECK_VERSION_SUCCESS);
263     }
264 }
265 
DoClearError(BusinessError & businessError)266 void FirmwareManager::DoClearError(BusinessError &businessError)
267 {
268     FirmwareTask task;
269     FirmwareTaskOperator().QueryTask(task);
270     if (!task.isExistTask) {
271         FIRMWARE_LOGI("DoClearError has no task");
272         return;
273     }
274     if (!FirmwareUpdateHelper::IsUpgradeFailed(task.status)) {
275         businessError.Build(CallResult::FAIL, "please check status before clear error");
276         businessError.AddErrorMessage(CAST_INT(DUPDATE_ERR_UPDATE_COMMON_ERROR),
277             "please check status before clear error");
278         return;
279     }
280     FirmwareUpdateHelper::ClearFirmwareInfo();
281 }
282 
HandleEvent(CommonEventType event)283 void FirmwareManager::HandleEvent(CommonEventType event)
284 {
285     FIRMWARE_LOGI("handleEvent event %{public}d", static_cast<uint32_t>(event));
286     switch (event) {
287         case CommonEventType::NET_CHANGED:
288             HandleNetChanged();
289             break;
290         case CommonEventType::BOOT_COMPLETE:
291             HandleBootComplete();
292             break;
293         default:
294             break;
295     }
296 }
297 
HandleBootComplete()298 void FirmwareManager::HandleBootComplete()
299 {
300     FIRMWARE_LOGI("HandleBootComplete");
301     FirmwareTask task;
302     FirmwareTaskOperator().QueryTask(task);
303     if (!task.isExistTask) {
304         FIRMWARE_LOGI("HandleBootComplete has no task");
305         return;
306     }
307 
308     FIRMWARE_LOGI("HandleBootComplete status %{public}d", CAST_INT(task.status));
309     if (task.status == UpgradeStatus::UPDATING) {
310         HandleBootUpdateOnStatusProcess(task);
311         return;
312     }
313 }
314 
HandleNetChanged()315 void FirmwareManager::HandleNetChanged()
316 {
317     FIRMWARE_LOGI("HandleNetChanged");
318     #ifdef NETMANAGER_BASE_ENABLE
319     if (!DelayedSingleton<NetManager>::GetInstance()->IsNetAvailable()) {
320         FIRMWARE_LOGE("HandleNetChanged network not available.");
321         ProgressThread::isNoNet_ = true;
322         return;
323     }
324 
325     ProgressThread::isNoNet_ = false;
326     FirmwareTask task;
327     FirmwareTaskOperator().QueryTask(task);
328     FIRMWARE_LOGI("HandleNetChanged status %{public}d", task.status);
329 
330     if (!DelayedSingleton<NetManager>::GetInstance()->IsNetAvailable(NetType::NOT_METERED_WIFI)) {
331         return;
332     }
333 
334     if (task.status == UpgradeStatus::DOWNLOAD_PAUSE) {
335         HandleResumeDownload(task);
336         return;
337     }
338 
339     if (task.status == UpgradeStatus::CHECK_VERSION_SUCCESS) {
340         bool isDownloadSwitchOn = preferencesUtil_->ObtainBool(Firmware::AUTO_DOWNLOAD_SWITCH, false);
341         FIRMWARE_LOGI("HandleNetChanged isDownloadSwitchOn %{public}s",
342             StringUtils::GetBoolStr(isDownloadSwitchOn).c_str());
343         if (isDownloadSwitchOn) {
344             DoAutoDownload(task);
345         }
346     }
347     #endif
348 }
349 
350 // updater调用后正常启动
HandleBootUpdateOnStatusProcess(const FirmwareTask & task)351 void FirmwareManager::HandleBootUpdateOnStatusProcess(const FirmwareTask &task)
352 {
353     FIRMWARE_LOGI("HandleBootUpdateOnStatusProcess");
354     FirmwareResultProcess resultProcess;
355     std::map<std::string, UpdateResult> resultMap;
356     std::vector<FirmwareComponent> components;
357     FirmwareComponentOperator().QueryAll(components);
358     switch (resultProcess.GetUpdaterResult(components, resultMap)) {
359         case UpdateResultCode::SUCCESS:
360             HandleBootUpdateSuccess(task, resultMap);
361             break;
362         case UpdateResultCode::FAILURE:
363             HandleBootUpdateFail(task, resultMap);
364             break;
365         default:
366             break;
367     }
368 }
369 
HandleBootUpdateSuccess(const FirmwareTask & task,const std::map<std::string,UpdateResult> & resultMap)370 void FirmwareManager::HandleBootUpdateSuccess(const FirmwareTask &task,
371     const std::map<std::string, UpdateResult> &resultMap)
372 {
373     preferencesUtil_->SaveString(Firmware::UPDATE_ACTION, "upgrade");
374     std::vector<FirmwareComponent> components;
375     FirmwareComponentOperator().QueryAll(components);
376     std::vector<VersionComponent> versionComponents;
377     for (const auto &component : components) {
378         VersionComponent versionComponent;
379         versionComponent.componentType = CAST_INT(ComponentType::OTA);
380         versionComponent.componentId = component.componentId;
381         versionComponent.upgradeAction = UpgradeAction::UPGRADE;
382         versionComponent.displayVersion = component.targetBlDisplayVersionNumber;
383         versionComponent.innerVersion = component.targetBlVersionNumber;
384         versionComponent.componentExtra = JsonBuilder().Append("{}").ToJson();
385         versionComponents.push_back(versionComponent);
386     }
387 
388     DelayedSingleton<FirmwareChangelogUtils>::GetInstance()->SaveHotaCurrentVersionComponentId();
389     if (task.combinationType == CombinationType::HOTA) {
390         FIRMWARE_LOGI("notify upgrade success");
391         DelayedSingleton<FirmwareCallbackUtils>::GetInstance()->NotifyEvent(task.taskId, EventId::EVENT_UPGRADE_SUCCESS,
392             UpgradeStatus::UPDATE_SUCCESS, ErrorMessage{}, versionComponents);
393         FirmwareUpdateHelper::ClearFirmwareInfo();
394         return;
395     }
396 }
397 
HandleBootUpdateFail(const FirmwareTask & task,const std::map<std::string,UpdateResult> & resultMap)398 void FirmwareManager::HandleBootUpdateFail(const FirmwareTask &task,
399     const std::map<std::string, UpdateResult> &resultMap)
400 {
401     preferencesUtil_->SaveString(Firmware::UPDATE_ACTION, "recovery");
402     std::vector<FirmwareComponent> components;
403     FirmwareComponentOperator().QueryAll(components);
404     std::vector<VersionComponent> versionComponents;
405     for (const auto &component : components) {
406         VersionComponent versionComponent;
407         versionComponent.componentType = CAST_INT(ComponentType::OTA);
408         versionComponent.componentId = component.componentId;
409         versionComponent.upgradeAction = UpgradeAction::UPGRADE;
410         versionComponent.displayVersion = component.targetBlDisplayVersionNumber;
411         versionComponent.innerVersion = component.targetBlVersionNumber;
412         versionComponent.componentExtra = JsonBuilder().Append("{}").ToJson();
413         versionComponents.push_back(versionComponent);
414     }
415 
416     ErrorMessage errorMessage;
417     for (const auto &result : resultMap) {
418         if (result.second.result == UPDATER_RESULT_FAILURE) {
419             errorMessage.errorCode = CAST_INT(result.second.GetUpdateResultCode());
420             errorMessage.errorMessage = result.second.reason;
421             break;
422         }
423     }
424 
425     DelayedSingleton<FirmwareCallbackUtils>::GetInstance()->NotifyEvent(task.taskId, EventId::EVENT_UPGRADE_FAIL,
426         UpgradeStatus::UPDATE_FAIL, errorMessage, versionComponents);
427     FIRMWARE_LOGI("upgrade fail");
428     FirmwareUpdateHelper::ClearFirmwareInfo();
429 }
430 
431 // sysInstaller安装中重启,进度回退为下载完成
HandleBootInstallOnStatusProcess(FirmwareTask & task)432 void FirmwareManager::HandleBootInstallOnStatusProcess(FirmwareTask &task)
433 {
434     FIRMWARE_LOGI("HandleBootInstallOnStatusProcess");
435     FirmwareTaskOperator().UpdateProgressByTaskId(
436         task.taskId, UpgradeStatus::DOWNLOAD_SUCCESS, Firmware::ONE_HUNDRED);
437     std::vector<FirmwareComponent> firmwareComponentList;
438     FirmwareComponentOperator firmwareComponentOperator;
439     firmwareComponentOperator.QueryAll(firmwareComponentList);
440     for (const FirmwareComponent &component : firmwareComponentList) {
441         if (component.status == UpgradeStatus::INSTALLING) {
442             firmwareComponentOperator.UpdateProgressByUrl(
443                 component.url, UpgradeStatus::DOWNLOAD_SUCCESS, Firmware::ONE_HUNDRED);
444         }
445     }
446     BusinessError businessError;
447     UpgradeOptions upgradeOptions;
448     upgradeOptions.order = Order::INSTALL_AND_APPLY;
449     DoInstall(upgradeOptions, businessError, InstallType::SYS_INSTALLER);
450 }
451 
HandleBootDownloadOnStatusProcess(FirmwareTask & task)452 void FirmwareManager::HandleBootDownloadOnStatusProcess(FirmwareTask &task)
453 {
454     // 下载中重启,清除记录和数据
455     FIRMWARE_LOGI("HandleBootDownloadOnStatusProcess ClearFirmwareInfo");
456     FirmwareUpdateHelper::ClearFirmwareInfo();
457 }
458 
HandleBootDownloadPauseStatusProcess(FirmwareTask & task)459 void FirmwareManager::HandleBootDownloadPauseStatusProcess(FirmwareTask &task)
460 {
461     FirmwareUpdateHelper::ClearFirmwareInfo();
462 }
463 
HandleResumeDownload(FirmwareTask & task)464 void FirmwareManager::HandleResumeDownload(FirmwareTask &task)
465 {
466     FIRMWARE_LOGI("HandleResumeDownload");
467 }
468 
HandleBootDownloadedStatusProcess(FirmwareTask & task)469 void FirmwareManager::HandleBootDownloadedStatusProcess(FirmwareTask &task)
470 {
471     FIRMWARE_LOGI("HandleBootDownloadedStatusProcess");
472 }
473 
DoAutoDownload(const FirmwareTask & task)474 void FirmwareManager::DoAutoDownload(const FirmwareTask &task)
475 {
476     FIRMWARE_LOGI("DoAutoDownload");
477 }
478 
NotifyInitEvent()479 void FirmwareManager::NotifyInitEvent()
480 {
481     bool dueInitFlag = preferencesUtil_->ObtainBool(Constant::DUE_INIT_FLAG, false);
482     FIRMWARE_LOGI("DUE_INIT_FLAG is %{public}s", StringUtils::GetBoolStr(dueInitFlag).c_str());
483     if (!dueInitFlag) {
484         preferencesUtil_->SaveBool(Constant::DUE_INIT_FLAG, true);
485         DelayedSingleton<FirmwareCallbackUtils>::GetInstance()->NotifyEvent("", EventId::EVENT_INITIALIZE,
486             UpgradeStatus::INIT);
487     }
488 }
489 } // namespace UpdateEngine
490 } // namespace OHOS
491