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