• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 "sys_installer_server.h"
17 
18 #include "accesstoken_kit.h"
19 #include "iservice_registry.h"
20 #include "log/log.h"
21 #include "securec.h"
22 #include "system_ability_definition.h"
23 #include "utils.h"
24 #include "buffer_info_parcel.h"
25 
26 namespace OHOS {
27 namespace SysInstaller {
28 REGISTER_SYSTEM_ABILITY_BY_ID(SysInstallerServer, SYS_INSTALLER_DISTRIBUTED_SERVICE_ID, false)
29 
30 using namespace Updater;
31 
InitSysLogger(const std::string & tag)32 void __attribute__((weak)) InitSysLogger(const std::string &tag)
33 {
34     InitUpdaterLogger(tag, SYS_LOG_FILE, SYS_STAGE_FILE, SYS_ERROR_FILE);
35 }
36 
SysInstallerServer(int32_t systemAbilityId,bool runOnCreate)37 SysInstallerServer::SysInstallerServer(int32_t systemAbilityId, bool runOnCreate)
38     : SystemAbility(systemAbilityId, runOnCreate)
39 {
40 }
41 
~SysInstallerServer()42 SysInstallerServer::~SysInstallerServer()
43 {
44 }
45 
SysInstallerInit(const std::string & taskId,bool bStreamUpgrade)46 int32_t SysInstallerServer::SysInstallerInit(const std::string &taskId, bool bStreamUpgrade)
47 {
48     std::lock_guard<std::mutex> lock(sysInstallerServerLock_);
49     DEFINE_EXIT_GUARD();
50     LOG(INFO) << "SysInstallerInit";
51     if (!logInit_) {
52         (void)Utils::MkdirRecursive(SYS_LOG_DIR, 0777); // 0777 : rwxrwxrwx
53         InitUpdaterLogger("SysInstaller", SYS_LOG_FILE, SYS_STAGE_FILE, SYS_ERROR_FILE);
54         logInit_ = true;
55     }
56     bStreamUpgrade_ = bStreamUpgrade;
57     if (bStreamUpgrade_) {
58         StreamInstallerManager::GetInstance().SysInstallerInit();
59     } else {
60         SysInstallerManager::GetInstance().SysInstallerInit(taskId);
61     }
62 
63     return 0;
64 }
65 
StartUpdatePackageZip(const std::string & taskId,const std::string & pkgPath)66 int32_t SysInstallerServer::StartUpdatePackageZip(const std::string &taskId, const std::string &pkgPath)
67 {
68     LOG(INFO) << "StartUpdatePackageZip";
69     DEFINE_EXIT_GUARD();
70     return SysInstallerManager::GetInstance().StartUpdatePackageZip(taskId, pkgPath);
71 }
72 
StartStreamUpdate()73 int32_t SysInstallerServer::StartStreamUpdate()
74 {
75     LOG(INFO) << "StartStreamUpdate";
76     DEFINE_EXIT_GUARD();
77     return StreamInstallerManager::GetInstance().StartStreamUpdate();
78 }
79 
StopStreamUpdate()80 int32_t SysInstallerServer::StopStreamUpdate()
81 {
82     LOG(INFO) << "StopStreamUpdate";
83     DEFINE_EXIT_GUARD();
84     return StreamInstallerManager::GetInstance().StopStreamUpdate();
85 }
86 
ProcessStreamData(const BufferInfoParcel & bufferParcel)87 int32_t SysInstallerServer::ProcessStreamData(const BufferInfoParcel &bufferParcel)
88 {
89     LOG(INFO) << "ProcessStreamData";
90     DEFINE_EXIT_GUARD();
91     return StreamInstallerManager::GetInstance().ProcessStreamData(bufferParcel.bufferInfo.buffer,
92         bufferParcel.bufferInfo.size);
93 }
94 
SetUpdateCallback(const std::string & taskId,const sptr<ISysInstallerCallback> & updateCallback)95 int32_t SysInstallerServer::SetUpdateCallback(const std::string &taskId,
96     const sptr<ISysInstallerCallback> &updateCallback)
97 {
98     LOG(INFO) << "SetUpdateCallback";
99     DEFINE_EXIT_GUARD();
100     if (bStreamUpgrade_) {
101         return StreamInstallerManager::GetInstance().SetUpdateCallback(updateCallback);
102     } else {
103         return SysInstallerManager::GetInstance().SetUpdateCallback(taskId, updateCallback);
104     }
105 }
106 
GetUpdateStatus(const std::string & taskId)107 int32_t SysInstallerServer::GetUpdateStatus(const std::string &taskId)
108 {
109     LOG(INFO) << "GetUpdateStatus";
110     DEFINE_EXIT_GUARD();
111     if (bStreamUpgrade_) {
112         return StreamInstallerManager::GetInstance().GetUpdateStatus();
113     } else {
114         return SysInstallerManager::GetInstance().GetUpdateStatus(taskId);
115     }
116 }
117 
StartUpdateParaZip(const std::string & taskId,const std::string & pkgPath,const std::string & location,const std::string & cfgDir)118 int32_t SysInstallerServer::StartUpdateParaZip(const std::string &taskId, const std::string &pkgPath,
119     const std::string &location, const std::string &cfgDir)
120 {
121     LOG(INFO) << "StartUpdateParaZip";
122     DEFINE_EXIT_GUARD();
123     return SysInstallerManager::GetInstance().StartUpdateParaZip(taskId, pkgPath, location, cfgDir);
124 }
125 
StartDeleteParaZip(const std::string & taskId,const std::string & location,const std::string & cfgDir)126 int32_t SysInstallerServer::StartDeleteParaZip(const std::string &taskId, const std::string &location,
127     const std::string &cfgDir)
128 {
129     LOG(INFO) << "StartDeleteParaZip";
130     DEFINE_EXIT_GUARD();
131     return SysInstallerManager::GetInstance().StartDeleteParaZip(taskId, location, cfgDir);
132 }
133 
AccDecompressAndVerifyPkg(const std::string & taskId,const std::string & srcPath,const std::string & dstPath,const uint32_t type)134 int32_t SysInstallerServer::AccDecompressAndVerifyPkg(const std::string &taskId, const std::string &srcPath,
135     const std::string &dstPath, const uint32_t type)
136 {
137     LOG(INFO) << "AccDecompressAndVerifyPkg";
138     DEFINE_EXIT_GUARD();
139     return SysInstallerManager::GetInstance().AccDecompressAndVerifyPkg(taskId, srcPath, dstPath, type);
140 }
141 
AccDeleteDir(const std::string & taskId,const std::string & dstPath)142 int32_t SysInstallerServer::AccDeleteDir(const std::string &taskId, const std::string &dstPath)
143 {
144     LOG(INFO) << "AccDeleteDir";
145     DEFINE_EXIT_GUARD();
146     return SysInstallerManager::GetInstance().AccDeleteDir(taskId, dstPath);
147 }
148 
StartUpdateVabPackageZip(const std::string & taskId,const std::vector<std::string> & pkgPath)149 int32_t SysInstallerServer::StartUpdateVabPackageZip(const std::string &taskId,
150     const std::vector<std::string> &pkgPath)
151 {
152     LOG(INFO) << "StartUpdateVabPackageZip";
153     DEFINE_EXIT_GUARD();
154     return SysInstallerManager::GetInstance().StartUpdateVabPackageZip(taskId, pkgPath);
155 }
156 
CancelUpdateVabPackageZip(const std::string & taskId)157 int32_t SysInstallerServer::CancelUpdateVabPackageZip(const std::string &taskId)
158 {
159     LOG(INFO) << "CancelUpdateVabPackageZip";
160     DEFINE_EXIT_GUARD();
161     return SysInstallerManager::GetInstance().CancelUpdateVabPackageZip(taskId);
162 }
163 
StartVabMerge(const std::string & taskId)164 int32_t SysInstallerServer::StartVabMerge(const std::string &taskId)
165 {
166     LOG(INFO) << "StartVabMerge";
167     DEFINE_EXIT_GUARD();
168     return SysInstallerManager::GetInstance().StartVabMerge(taskId);
169 }
170 
CreateVabSnapshotCowImg(const std::unordered_map<std::string,uint64_t> & partitionInfo)171 int32_t SysInstallerServer::CreateVabSnapshotCowImg(const std::unordered_map<std::string, uint64_t> &partitionInfo)
172 {
173     LOG(INFO) << "CreateVabSnapshotCowImg";
174     DEFINE_EXIT_GUARD();
175     return SysInstallerManager::GetInstance().CreateVabSnapshotCowImg(partitionInfo);
176 }
177 
ClearVabMetadataAndCow()178 int32_t SysInstallerServer::ClearVabMetadataAndCow()
179 {
180     LOG(INFO) << "ClearVabMetadataAndCow";
181     DEFINE_EXIT_GUARD();
182     return SysInstallerManager::GetInstance().ClearVabMetadataAndCow();
183 }
184 
GetUpdateResult(const std::string & taskId,const std::string & taskType,const std::string & resultType,std::string & updateResult)185 int32_t SysInstallerServer::GetUpdateResult(const std::string &taskId, const std::string &taskType,
186     const std::string &resultType, std::string &updateResult)
187 {
188     DEFINE_EXIT_GUARD();
189     updateResult = SysInstallerManager::GetInstance().GetUpdateResult(taskId, taskType, resultType);
190     return 0;
191 }
192 
VabUpdateActive()193 int32_t SysInstallerServer::VabUpdateActive()
194 {
195     LOG(INFO) << "VabUpdateActive";
196     DEFINE_EXIT_GUARD();
197     return SysInstallerManager::GetInstance().VabUpdateActive();
198 }
199 
GetMetadataResult(const std::string & action,bool & result)200 int32_t SysInstallerServer::GetMetadataResult(const std::string &action, bool &result)
201 {
202     LOG(INFO) << "GetMetadataResult";
203     DEFINE_EXIT_GUARD();
204     return SysInstallerManager::GetInstance().GetMetadataResult(action, result);
205 }
206 
IsTaskRunning(void)207 bool SysInstallerServer::IsTaskRunning(void)
208 {
209     return !SysInstallerExitGuard::GetRunningSet().empty();
210 }
211 
GetRunningTask(void)212 std::string SysInstallerServer::GetRunningTask(void)
213 {
214     const auto &runningSet = SysInstallerExitGuard::GetRunningSet();
215     if (runningSet.size() > SysInstallerExitGuard::MAX_RUNNING_SET_SIZE) {
216         LOG(ERROR) << "size too big, size is " << runningSet.size();
217         return "error: size too big";
218     }
219     std::ostringstream ss;
220     for (const auto &tag : runningSet) {
221         ss << tag;
222     }
223     return ss.str();
224 }
225 
InstallCloudRom(const std::string & taskId,InstallMode installMode,const std::vector<FeatureInfo> & featureInfos,RebootStatus rebootStatus)226 int32_t SysInstallerServer::InstallCloudRom(const std::string &taskId,
227     InstallMode installMode, const std::vector<FeatureInfo> &featureInfos, RebootStatus rebootStatus)
228 {
229     LOG(INFO) << "InstallCloudRom";
230     DEFINE_EXIT_GUARD();
231     return SysInstallerManager::GetInstance().InstallCloudRom(taskId, installMode, featureInfos, rebootStatus);
232 }
233 
UninstallCloudRom(const std::string & taskId,const std::vector<FeatureInfo> & featureInfos,RebootStatus rebootStatus)234 int32_t SysInstallerServer::UninstallCloudRom(const std::string &taskId,
235     const std::vector<FeatureInfo> &featureInfos, RebootStatus rebootStatus)
236 {
237     LOG(INFO) << "UninstallCloudRom";
238     DEFINE_EXIT_GUARD();
239     return SysInstallerManager::GetInstance().UninstallCloudRom(taskId, featureInfos, rebootStatus);
240 }
241 
GetFeatureStatus(const std::vector<FeatureInfo> & featureInfos,std::vector<FeatureStatus> & statusInfos)242 int32_t SysInstallerServer::GetFeatureStatus(const std::vector<FeatureInfo> &featureInfos,
243     std::vector<FeatureStatus> &statusInfos)
244 {
245     LOG(INFO) << "GetFeatureStatus";
246     DEFINE_EXIT_GUARD();
247     return SysInstallerManager::GetInstance().GetFeatureStatus(featureInfos, statusInfos);
248 }
249 
GetAllFeatureStatus(const std::string & baseVersion,std::vector<FeatureStatus> & statusInfos)250 int32_t SysInstallerServer::GetAllFeatureStatus(const std::string &baseVersion,
251     std::vector<FeatureStatus> &statusInfos)
252 {
253     LOG(INFO) << "GetAllFeatureStatus";
254     DEFINE_EXIT_GUARD();
255     return SysInstallerManager::GetInstance().GetAllFeatureStatus(baseVersion, statusInfos);
256 }
257 
ClearCloudRom(const std::string & baseVersion,const std::string & featureName)258 int32_t SysInstallerServer::ClearCloudRom(const std::string &baseVersion,
259     const std::string &featureName)
260 {
261     LOG(INFO) << "ClearCloudRom";
262     DEFINE_EXIT_GUARD();
263     return SysInstallerManager::GetInstance().ClearCloudRom(baseVersion, featureName);
264 }
265 
ExitSysInstaller()266 int32_t SysInstallerServer::ExitSysInstaller()
267 {
268     LOG(INFO) << "ExitSysInstaller";
269     if (IsTaskRunning()) {
270         LOG(ERROR) << "SysInstaller running, can't exit, running info " << GetRunningTask();
271         return -1;
272     }
273     sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
274     if (sm == nullptr) {
275         LOG(ERROR) << "GetSystemAbilityManager samgr object null!";
276         return 0;
277     }
278     if (sm->UnloadSystemAbility(SYS_INSTALLER_DISTRIBUTED_SERVICE_ID) != 0) {
279         LOG(ERROR) << "UnloadSystemAbility error!";
280     }
281     return 0;
282 }
283 
StartAbSync()284 int32_t SysInstallerServer::StartAbSync()
285 {
286     LOG(INFO) << "StartAbSync";
287     DEFINE_EXIT_GUARD();
288     return SysInstallerManager::GetInstance().StartAbSync();
289 }
290 
SetCpuAffinity(const std::string & taskId,uint32_t reservedCores)291 int32_t SysInstallerServer::SetCpuAffinity(const std::string &taskId, uint32_t reservedCores)
292 {
293     LOG(INFO) << "SetCpuAffinity reservedCores:" << reservedCores;
294     DEFINE_EXIT_GUARD();
295     return SysInstallerManager::GetInstance().SetCpuAffinity(taskId, reservedCores);
296 }
297 
IsPermissionGranted(void)298 bool SysInstallerServer::IsPermissionGranted(void)
299 {
300     Security::AccessToken::AccessTokenID callerToken = IPCSkeleton::GetCallingTokenID();
301     std::string permission = "ohos.permission.UPDATE_SYSTEM";
302 
303     int verifyResult = Security::AccessToken::AccessTokenKit::VerifyAccessToken(callerToken, permission);
304     bool isPermissionGranted = (verifyResult == Security::AccessToken::PERMISSION_GRANTED);
305     if (!isPermissionGranted) {
306         LOG(ERROR) << "not granted " << permission;
307     }
308     return isPermissionGranted;
309 }
310 
CheckCallingPerm(void)311 bool SysInstallerServer::CheckCallingPerm(void)
312 {
313     int32_t callingUid = OHOS::IPCSkeleton::GetCallingUid();
314     LOG(INFO) << "CheckCallingPerm callingUid:" << callingUid;
315     if (callingUid == 0) {
316         return true;
317     }
318     return callingUid == Updater::Utils::USER_UPDATE_AUTHORITY && IsPermissionGranted();
319 }
320 
CallbackEnter(uint32_t code)321 int32_t SysInstallerServer::CallbackEnter([[maybe_unused]] uint32_t code)
322 {
323     LOG(INFO) << "Received stub message:" << code << ", callingUid:" << IPCSkeleton::GetCallingUid();
324     if (!CheckCallingPerm()) {
325         LOG(ERROR) << "SysInstallerServer CheckCallingPerm fail";
326         return ERR_INVALID_VALUE;
327     }
328     return ERR_NONE;
329 }
330 
CallbackExit(uint32_t code,int32_t result)331 int32_t SysInstallerServer::CallbackExit([[maybe_unused]] uint32_t code, [[maybe_unused]] int32_t result)
332 {
333     return ERR_NONE;
334 }
335 
OnStart()336 void SysInstallerServer::OnStart()
337 {
338     LOG(INFO) << "OnStart";
339     bool res = Publish(this);
340     if (!res) {
341         LOG(ERROR) << "OnStart failed";
342     }
343 
344     return;
345 }
346 
OnStop()347 void SysInstallerServer::OnStop()
348 {
349     LOG(INFO) << "OnStop";
350 }
351 } // namespace SysInstaller
352 } // namespace OHOS
353