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
49namespace OHOS {
50namespace UpdateEngine {
51constexpr int32_t INIT_DELAY_TIME = 5; // 进程启动延时时间5秒,为了安装重启之后可以看到版本号及时刷新
52constexpr int32_t PROCESS_EXIT_DELAY_TIME = 1; // 进程退出等待时间,单位:秒
53constexpr uint64_t PULLUP_AFTER_TERMINATE_INTERVAL = 5; // 终止升级后SA拉起间隔
54
55FirmwareManager::FirmwareManager() {}
56
57FirmwareManager::~FirmwareManager()
58{
59    DelayedSingleton<FirmwareEventListener>::GetInstance()->UnregisterNetChangedListener();
60}
61
62void 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
82void 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
104void 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
128bool 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
142std::vector<ScheduleTask> FirmwareManager::GetScheduleTasks()
143{
144    ScheduleTask scheduleTask;
145    return {scheduleTask};
146}
147
148bool FirmwareManager::Exit()
149{
150    FIRMWARE_LOGI("FirmwareManager Exit");
151    return true;
152}
153
154void 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
168void 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
188void 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
201void 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
213bool 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
226void 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
244void 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
266void 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
283void 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
298void 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
315void 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调用后正常启动
351void 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
370void 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
398void 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安装中重启,进度回退为下载完成
432void 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
452void FirmwareManager::HandleBootDownloadOnStatusProcess(FirmwareTask &task)
453{
454    // 下载中重启,清除记录和数据
455    FIRMWARE_LOGI("HandleBootDownloadOnStatusProcess ClearFirmwareInfo");
456    FirmwareUpdateHelper::ClearFirmwareInfo();
457}
458
459void FirmwareManager::HandleBootDownloadPauseStatusProcess(FirmwareTask &task)
460{
461    FirmwareUpdateHelper::ClearFirmwareInfo();
462}
463
464void FirmwareManager::HandleResumeDownload(FirmwareTask &task)
465{
466    FIRMWARE_LOGI("HandleResumeDownload");
467}
468
469void FirmwareManager::HandleBootDownloadedStatusProcess(FirmwareTask &task)
470{
471    FIRMWARE_LOGI("HandleBootDownloadedStatusProcess");
472}
473
474void FirmwareManager::DoAutoDownload(const FirmwareTask &task)
475{
476    FIRMWARE_LOGI("DoAutoDownload");
477}
478
479void 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