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 * Unless required by applicable law or agreed to in writing, software
8 * distributed under the License is distributed on an "AS IS" BASIS,
9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 * See the License for the specific lan
11 * guage governing permissions and
12 * limitations under the License.
13 */
14
15#include <cstring>
16
17#include "isys_installer_callback_func.h"
18#include "isys_installer_callback.h"
19#include "module_update_kits.h"
20#include "module_error_code.h"
21
22using namespace OHOS;
23using namespace OHOS::SysInstaller;
24
25static const int32_t MIN_PARAM_NUM = 2;
26static const int32_t MAX_PARAM_NUM = 3;
27
28static const std::string HELP_MSG =
29    "usage: module_update_tool\n"
30    "example: ./module_update_tool install /data/tmp/xxx.hmp \n"
31    "command list:\n"
32    "  install         : upgrade some SA via hmp package\n"
33    "  uninstall       : degrade some SA via hmp name\n"
34    "  update          : upgrade SA via hmp package\n"
35    "  get_hmp_version : get hmp package version\n"
36    "  get_result      : get hmp upgrade result\n"
37    "  show hmpname    : show upgrade sa info, if hmp name is null, show all\n";
38
39static const std::string INSTALL_PARAM = "install";
40static const std::string UNINSTALL_PARAM = "uninstall";
41static const std::string SHOW_INFO = "show";
42static const std::string UPDATE_PARAM = "update";
43static const std::string GET_HMP_VERSION = "get_hmp_version";
44static const std::string GET_RESULT = "get_result";
45static const int32_t RET_FAILED = -1;
46
47static bool CheckParam(int argc)
48{
49    if (argc < MIN_PARAM_NUM || argc > MAX_PARAM_NUM) {
50        printf("Invalid module update command\n");
51        printf("%s", HELP_MSG.c_str());
52        return false;
53    }
54    return true;
55}
56
57static std::string GetFailReasonByErrCode(int32_t err)
58{
59    switch (err) {
60        case 0:
61            return "success";
62        case OHOS::SysInstaller::ERR_SERVICE_NOT_FOUND:
63            return "ERR_SERVICE_NOT_FOUND";
64        case OHOS::SysInstaller::ERR_INVALID_PATH:
65            return "ERR_INVALID_PATH";
66        case OHOS::SysInstaller::ERR_LOWER_VERSION:
67            return "ERR_LOWER_VERSION";
68        case OHOS::SysInstaller::ERR_VERIFY_SIGN_FAIL:
69            return "ERR_VERIFY_SIGN_FAIL";
70        case OHOS::SysInstaller::ERR_INSTALL_FAIL:
71            return "ERR_INSTALL_FAIL";
72        case OHOS::SysInstaller::ERR_UNINSTALL_FAIL:
73            return "ERR_UNINSTALL_FAIL";
74        case OHOS::SysInstaller::ERR_REPORT_STATUS_FAIL:
75            return "ERR_REPORT_STATUS_FAIL";
76        default:
77            return "Unknown Error";
78    }
79}
80
81static void PrintErrMsg(const std::string &errMsg)
82{
83    printf("%s\n", errMsg.c_str());
84}
85
86static void PrintUpgradeInfo(std::list<OHOS::SysInstaller::ModulePackageInfo> &modulePackageInfos)
87{
88    std::list<OHOS::SysInstaller::ModulePackageInfo>::iterator it;
89    printf("Got %zu upgraded modules info\n", modulePackageInfos.size());
90    for (it = modulePackageInfos.begin(); it != modulePackageInfos.end(); it++) {
91        OHOS::SysInstaller::ModulePackageInfo moduleInfo = *it;
92        printf("%s\n", moduleInfo.hmpName.c_str());
93        std::list<OHOS::SysInstaller::SaInfo>::iterator saIt;
94        for (saIt = moduleInfo.saInfoList.begin(); saIt != moduleInfo.saInfoList.end(); saIt++) {
95            std::string verStr = (*saIt).version;
96            printf(" {saName:%s saId:%d version:%s}\n", (*saIt).saName.c_str(), (*saIt).saId, verStr.c_str());
97        }
98        printf(" \n");
99    }
100}
101
102class ProcessCallback : public ISysInstallerCallbackFunc {
103public:
104    ProcessCallback() = default;
105    ~ProcessCallback() = default;
106    void OnUpgradeProgress(UpdateStatus updateStatus, int percent, const std::string &resultMsg) override
107    {
108        printf("ProgressCallback progress %d percent %d msg %s\n", updateStatus, percent, resultMsg.c_str());
109    }
110};
111
112static int UpdateModulePackage(const std::string &path)
113{
114    printf("try to update an upgrade package\n");
115    sptr<ISysInstallerCallbackFunc> callback = new ProcessCallback;
116    if (callback == nullptr) {
117        printf("callback new failed\n");
118        return -1;
119    }
120
121    int ret = ModuleUpdateKits::GetInstance().StartUpdateHmpPackage(path, callback);
122    PrintErrMsg(GetFailReasonByErrCode(ret));
123    return ret;
124}
125
126static int GetHmpVersion()
127{
128    printf("try to get hmp version\n");
129
130    std::vector<HmpVersionInfo> versioInfo = ModuleUpdateKits::GetInstance().GetHmpVersionInfo();
131    for (auto &info : versioInfo) {
132        printf("name:%s laneCode:%s compatibleVersion:%s version:%s\n",
133            info.name.c_str(), info.laneCode.c_str(), info.compatibleVersion.c_str(), info.version.c_str());
134    }
135    return 0;
136}
137
138static int GetResult()
139{
140    printf("try to get hmp result\n");
141
142    std::vector<HmpUpdateInfo> updateInfo = ModuleUpdateKits::GetInstance().GetHmpUpdateResult();
143    for (auto &info : updateInfo) {
144        printf("path:%s result:%d resultMsg:%s\n", info.path.c_str(), info.result, info.resultMsg.c_str());
145    }
146    return 0;
147}
148
149static int ShowInfo(const std::string &hmpStr)
150{
151    printf("try to show module update info\n");
152    std::list<OHOS::SysInstaller::ModulePackageInfo> modulePackageInfos;
153    int ret = OHOS::SysInstaller::ModuleUpdateKits::GetInstance().GetModulePackageInfo(hmpStr, modulePackageInfos);
154    PrintUpgradeInfo(modulePackageInfos);
155    PrintErrMsg(GetFailReasonByErrCode(ret));
156    return ret;
157}
158
159int main(int argc, char **argv)
160{
161    if (!CheckParam(argc)) {
162        return RET_FAILED;
163    }
164
165    int ret = 0;
166    OHOS::SysInstaller::ModuleUpdateKits& moduleUpdateKits = OHOS::SysInstaller::ModuleUpdateKits::GetInstance();
167    ret = moduleUpdateKits.InitModuleUpdate();
168    if (ret != 0) {
169        PrintErrMsg(GetFailReasonByErrCode(ret));
170        return ret;
171    }
172
173    if (INSTALL_PARAM.compare(argv[1]) == 0 && argc == MAX_PARAM_NUM) {
174        printf("try to update a module\n");
175        ret = moduleUpdateKits.InstallModulePackage(argv[MIN_PARAM_NUM]);
176        PrintErrMsg(GetFailReasonByErrCode(ret));
177        return ret;
178    }
179    if (UNINSTALL_PARAM.compare(argv[1]) == 0 && argc == MAX_PARAM_NUM) {
180        printf("try to uninstall an upgrade package\n");
181        ret = moduleUpdateKits.UninstallModulePackage(argv[MIN_PARAM_NUM]);
182        PrintErrMsg(GetFailReasonByErrCode(ret));
183        return ret;
184    }
185    if (UPDATE_PARAM.compare(argv[1]) == 0 && argc == MAX_PARAM_NUM) {
186        return UpdateModulePackage(argv[MIN_PARAM_NUM]);
187    }
188    if (GET_HMP_VERSION.compare(argv[1]) == 0) {
189        return GetHmpVersion();
190    }
191    if (GET_RESULT.compare(argv[1]) == 0) {
192        return GetResult();
193    }
194    if (SHOW_INFO.compare(argv[1]) == 0) {
195        return ShowInfo((argc != MIN_PARAM_NUM) ? argv[MIN_PARAM_NUM] : "");
196    }
197
198    printf("invalid command. \n");
199    printf("%s", HELP_MSG.c_str());
200    return ret;
201}