1 /*
2 * Copyright (c) 2024 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 "utils/storage_radar.h"
17 #include "utils/string_utils.h"
18
19 #include "hisysevent.h"
20 #include "storage_service_errno.h"
21 #include "storage_service_log.h"
22 #include <iomanip>
23
24 namespace OHOS {
25 namespace StorageService {
26 constexpr const char *FILE_STORAGE_MANAGER_FAULT_BEHAVIOR = "FILE_STORAGE_MANAGER_FAULT";
27 constexpr const char *FILE_STORAGE_MANAGER_STATISTIC = "FILE_STORAGE_MANAGER_STATISTIC";
28 constexpr char STORAGESERVICE_DOAMIN[] = "FILEMANAGEMENT";
29 constexpr uint8_t INDEX = 3;
30 constexpr uint32_t MS_1000 = 1000;
31 constexpr int32_t GLOBAL_USER_ID = 0;
32
33 constexpr const char *TAG_PREFIX = " WARNING: DELAY > ";
34 constexpr const char *TAG_UNIT_SUFFIX = " ms.";
35
ReportActiveUserKey(const std::string & funcName,uint32_t userId,int ret,const std::string & keyLevel)36 void StorageRadar::ReportActiveUserKey(const std::string &funcName, uint32_t userId, int ret,
37 const std::string &keyLevel)
38 {
39 RadarParameter param = {
40 .orgPkg = "os_account",
41 .userId = userId,
42 .funcName = funcName,
43 .bizScene = BizScene::USER_KEY_ENCRYPTION,
44 .bizStage = BizStage::BIZ_STAGE_ACTIVE_USER_KEY,
45 .keyElxLevel = keyLevel,
46 .errorCode = ret
47 };
48 StorageRadar::GetInstance().RecordFuctionResult(param);
49 }
50
ReportGetStorageStatus(const std::string & funcName,uint32_t userId,int ret,const std::string & orgPkg)51 void StorageRadar::ReportGetStorageStatus(const std::string &funcName, uint32_t userId, int ret,
52 const std::string &orgPkg)
53 {
54 RadarParameter param = {
55 .orgPkg = orgPkg,
56 .userId = userId,
57 .funcName = funcName,
58 .bizScene = BizScene::SPACE_STATISTICS,
59 .bizStage = BizStage::BIZ_STAGE_GET_USER_STORAGE_STATS,
60 .keyElxLevel = "NA",
61 .errorCode = ret
62 };
63 StorageRadar::GetInstance().RecordFuctionResult(param);
64 }
65
ReportVolumeOperation(const std::string & funcName,int ret)66 void StorageRadar::ReportVolumeOperation(const std::string &funcName, int ret)
67 {
68 RadarParameter param = {
69 .orgPkg = DEFAULT_ORGPKGNAME,
70 .userId = DEFAULT_USERID,
71 .funcName = funcName,
72 .bizScene = BizScene::EXTERNAL_VOLUME_MANAGER,
73 .bizStage = BizStage::BIZ_STAGE_MOUNT,
74 .keyElxLevel = "NA",
75 .errorCode = ret
76 };
77 StorageRadar::GetInstance().RecordFuctionResult(param);
78 }
79
ReportUserKeyResult(const std::string & funcName,uint32_t userId,int ret,const std::string & keyLevel,const std::string & extraData)80 void StorageRadar::ReportUserKeyResult(const std::string &funcName, uint32_t userId, int ret,
81 const std::string &keyLevel, const std::string &extraData)
82 {
83 RadarParameter param = {
84 .orgPkg = "init",
85 .userId = userId,
86 .funcName = funcName,
87 .bizScene = BizScene::USER_KEY_ENCRYPTION,
88 .bizStage = BizStage::BIZ_STAGE_INIT_GLOBAL_KEY,
89 .keyElxLevel = keyLevel,
90 .errorCode = ret,
91 .extraData = extraData
92 };
93 StorageRadar::GetInstance().RecordFuctionResult(param);
94 }
95
ReportUserManager(const std::string & funcName,uint32_t userId,int ret,const std::string & extraData)96 void StorageRadar::ReportUserManager(const std::string &funcName, uint32_t userId, int ret,
97 const std::string &extraData)
98 {
99 RadarParameter param = {
100 .orgPkg = DEFAULT_ORGPKGNAME,
101 .userId = userId,
102 .funcName = funcName,
103 .bizScene = BizScene::USER_MOUNT_MANAGER,
104 .bizStage = BizStage::BIZ_STAGE_USER_MOUNT,
105 .keyElxLevel = "NA",
106 .errorCode = ret,
107 .extraData = extraData
108 };
109 StorageRadar::GetInstance().RecordFuctionResult(param);
110 }
111
ReportSaSizeResult(const std::string & funcName,int ret,const std::string & extraData)112 void StorageRadar::ReportSaSizeResult(const std::string &funcName, int ret, const std::string &extraData)
113 {
114 RadarParameter param = {
115 .orgPkg = DEFAULT_ORGPKGNAME,
116 .userId = GLOBAL_USER_ID,
117 .funcName = funcName,
118 .bizScene = BizScene::SPACE_STATISTICS,
119 .bizStage = BizStage::BIZ_STAGE_GET_SYSTEM_SIZE,
120 .keyElxLevel = "NA",
121 .errorCode = ret,
122 .extraData = extraData
123 };
124 StorageRadar::GetInstance().RecordFuctionResult(param);
125 }
126
ReportUpdateUserAuth(const std::string & funcName,uint32_t userId,int ret,const std::string & keyLevel,const std::string & extraData)127 void StorageRadar::ReportUpdateUserAuth(const std::string &funcName, uint32_t userId, int ret,
128 const std::string &keyLevel, const std::string &extraData)
129 {
130 RadarParameter param = {
131 .orgPkg = "os_account",
132 .userId = userId,
133 .funcName = funcName,
134 .bizScene = BizScene::USER_KEY_ENCRYPTION,
135 .bizStage = BizStage::BIZ_STAGE_UPDATE_USER_AUTH,
136 .keyElxLevel = keyLevel,
137 .errorCode = ret,
138 .extraData = extraData
139 };
140 StorageRadar::GetInstance().RecordFuctionResult(param);
141 }
142
ReportFbexResult(const std::string & funcName,uint32_t userId,int ret,const std::string & keyLevel,const std::string & extraData)143 void StorageRadar::ReportFbexResult(const std::string &funcName, uint32_t userId, int ret, const std::string &keyLevel,
144 const std::string &extraData)
145 {
146 RadarParameter param = {
147 .orgPkg = DEFAULT_ORGPKGNAME,
148 .userId = userId,
149 .funcName = funcName,
150 .bizScene = BizScene::USER_KEY_ENCRYPTION,
151 .bizStage = BizStage::BIZ_STAGE_ACTIVE_USER_KEY,
152 .keyElxLevel = keyLevel,
153 .errorCode = ret,
154 .extraData = extraData,
155 .toCallPkg = "fbex"
156 };
157 StorageRadar::GetInstance().RecordFuctionResult(param);
158 }
159
ReportIamResult(const std::string & funcName,uint32_t userId,int ret)160 void StorageRadar::ReportIamResult(const std::string &funcName, uint32_t userId, int ret)
161 {
162 RadarParameter param = {
163 .orgPkg = DEFAULT_ORGPKGNAME,
164 .userId = userId,
165 .funcName = funcName,
166 .bizScene = BizScene::USER_KEY_ENCRYPTION,
167 .bizStage = BizStage::BIZ_STAGE_ACTIVE_USER_KEY,
168 .keyElxLevel = "NA",
169 .errorCode = ret,
170 .toCallPkg = "iam"
171 };
172 StorageRadar::GetInstance().RecordFuctionResult(param);
173 }
174
ReportHuksResult(const std::string & funcName,int ret)175 void StorageRadar::ReportHuksResult(const std::string &funcName, int ret)
176 {
177 RadarParameter param = {
178 .orgPkg = DEFAULT_ORGPKGNAME,
179 .userId = DEFAULT_USERID,
180 .funcName = funcName,
181 .bizScene = BizScene::USER_KEY_ENCRYPTION,
182 .bizStage = BizStage::BIZ_STAGE_ACTIVE_USER_KEY,
183 .keyElxLevel = "NA",
184 .errorCode = ret,
185 .toCallPkg = "huks"
186 };
187 StorageRadar::GetInstance().RecordFuctionResult(param);
188 }
189
ReportMtpfsResult(const std::string & funcName,int ret)190 void StorageRadar::ReportMtpfsResult(const std::string &funcName, int ret)
191 {
192 RadarParameter param = {
193 .orgPkg = DEFAULT_ORGPKGNAME,
194 .userId = DEFAULT_USERID,
195 .funcName = "MtpFsDevice::" + funcName,
196 .bizScene = BizScene::STORAGE_MTPFS,
197 .bizStage = BizStage::BIZ_STAGE_MTPFS_MTP_DEVICE,
198 .keyElxLevel = "NA",
199 .errorCode = ret,
200 };
201 StorageRadar::GetInstance().RecordFuctionResult(param);
202 }
203
ReportKeyRingResult(const std::string & funcName,int ret,const std::string & extraData)204 void StorageRadar::ReportKeyRingResult(const std::string &funcName, int ret, const std::string &extraData)
205 {
206 RadarParameter param = {
207 .orgPkg = DEFAULT_ORGPKGNAME,
208 .userId = DEFAULT_USERID,
209 .funcName = funcName,
210 .bizScene = BizScene::USER_KEY_ENCRYPTION,
211 .bizStage = BizStage::BIZ_STAGE_ACTIVE_USER_KEY,
212 .keyElxLevel = "NA",
213 .errorCode = ret,
214 .extraData = extraData
215 };
216 StorageRadar::GetInstance().RecordFuctionResult(param);
217 }
218
ReportOsAccountResult(const std::string & funcName,int32_t ret,unsigned int userId)219 void StorageRadar::ReportOsAccountResult(const std::string &funcName, int32_t ret, unsigned int userId)
220 {
221 RadarParameter param = {
222 .orgPkg = DEFAULT_ORGPKGNAME,
223 .userId = userId,
224 .funcName = funcName,
225 .bizScene = BizScene::USER_KEY_ENCRYPTION,
226 .bizStage = BizStage::BIZ_STAGE_ACTIVE_USER_KEY,
227 .keyElxLevel = "NA",
228 .errorCode = ret,
229 .toCallPkg = "os_account"
230 };
231 StorageRadar::GetInstance().RecordFuctionResult(param);
232 }
233
ReportEl5KeyMgrResult(const std::string & funcName,int32_t ret,unsigned int userId)234 void StorageRadar::ReportEl5KeyMgrResult(const std::string &funcName, int32_t ret, unsigned int userId)
235 {
236 RadarParameter param = {
237 .orgPkg = DEFAULT_ORGPKGNAME,
238 .userId = userId,
239 .funcName = funcName,
240 .bizScene = BizScene::USER_KEY_ENCRYPTION,
241 .bizStage = BizStage::BIZ_STAGE_UNLOCK_USER_SCREEN,
242 .keyElxLevel = "EL5",
243 .errorCode = ret,
244 .toCallPkg = "el5_file_key_manager"
245 };
246 StorageRadar::GetInstance().RecordFuctionResult(param);
247 }
248
ReportTEEClientResult(const std::string & funcName,int32_t ret,unsigned int userId,const std::string & extraData)249 void StorageRadar::ReportTEEClientResult(const std::string &funcName, int32_t ret, unsigned int userId,
250 const std::string &extraData)
251 {
252 RadarParameter param = {
253 .orgPkg = DEFAULT_ORGPKGNAME,
254 .userId = userId,
255 .funcName = funcName,
256 .bizScene = BizScene::USER_KEY_ENCRYPTION,
257 .bizStage = BizStage::BIZ_STAGE_UNLOCK_USER_SCREEN,
258 .keyElxLevel = "NA",
259 .errorCode = ret,
260 .extraData = extraData,
261 .toCallPkg = "tee_client"
262 };
263 StorageRadar::GetInstance().RecordFuctionResult(param);
264 }
265
ReportBundleMgrResult(const std::string & funcName,int32_t ret,unsigned int userId,const std::string & extraData)266 void StorageRadar::ReportBundleMgrResult(const std::string &funcName, int32_t ret, unsigned int userId,
267 const std::string &extraData)
268 {
269 RadarParameter param = {
270 .orgPkg = DEFAULT_ORGPKGNAME,
271 .userId = userId,
272 .funcName = funcName,
273 .bizScene = BizScene::SPACE_STATISTICS,
274 .bizStage = BizStage::BIZ_STAGE_GET_BUNDLE_STATS,
275 .keyElxLevel = "NA",
276 .errorCode = ret,
277 .extraData = extraData,
278 .toCallPkg = "bundle_mgr"
279 };
280 StorageRadar::GetInstance().RecordFuctionResult(param);
281 }
282
ReportStorageUsage(enum BizStage stage,const std::string & extraData)283 void StorageRadar::ReportStorageUsage(enum BizStage stage, const std::string &extraData)
284 {
285 RadarParameter param = {
286 .orgPkg = DEFAULT_ORGPKGNAME,
287 .userId = DEFAULT_USERID,
288 .funcName = "CheckAndCleanCache",
289 .bizScene = BizScene::STORAGE_USAGE_MANAGER,
290 .bizStage = stage,
291 .keyElxLevel = "NA",
292 .errorCode = E_STORAGE_USAGE_NOT_ENOUGH,
293 .extraData = extraData
294 };
295 StorageRadar::GetInstance().RecordFuctionResult(param);
296 }
297
RecordFuctionResult(const RadarParameter & parRes)298 bool StorageRadar::RecordFuctionResult(const RadarParameter &parRes)
299 {
300 int32_t res = E_OK;
301 if (parRes.errorCode == E_OK) {
302 res = HiSysEventWrite(
303 STORAGESERVICE_DOAMIN,
304 FILE_STORAGE_MANAGER_FAULT_BEHAVIOR,
305 HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
306 "ORG_PKG", parRes.orgPkg,
307 "USER_ID", parRes.userId,
308 "FUNC", parRes.funcName,
309 "BIZ_SCENE", static_cast<int32_t>(parRes.bizScene),
310 "BIZ_STAGE", static_cast<int32_t>(parRes.bizStage),
311 "kEY_ELX_LEVEL", parRes.keyElxLevel,
312 "TO_CALL_PKG", parRes.toCallPkg,
313 "DISK_VOLUME_INFO", "{\"diskId\":\"ab12\", \"volumeId\":\"34cd\", \"fsType\":\"ntfs\"}",
314 "FILE_STATUS", parRes.extraData,
315 "STAGE_RES", static_cast<int32_t>(StageRes::STAGE_SUCC),
316 "BIZ_STATE", static_cast<int32_t>(BizState::BIZ_STATE_START));
317 } else {
318 res = HiSysEventWrite(
319 STORAGESERVICE_DOAMIN,
320 FILE_STORAGE_MANAGER_FAULT_BEHAVIOR,
321 HiviewDFX::HiSysEvent::EventType::FAULT,
322 "ORG_PKG", parRes.orgPkg,
323 "USER_ID", parRes.userId,
324 "FUNC", parRes.funcName,
325 "BIZ_SCENE", static_cast<int32_t>(parRes.bizScene),
326 "BIZ_STAGE", static_cast<int32_t>(parRes.bizStage),
327 "kEY_ELX_LEVEL", parRes.keyElxLevel,
328 "TO_CALL_PKG", parRes.toCallPkg,
329 "DISK_VOLUME_INFO", "{\"diskId\":\"ab12\", \"volumeId\":\"34cd\", \"fsType\":\"ntfs\"}",
330 "FILE_STATUS", parRes.extraData,
331 "STAGE_RES", static_cast<int32_t>(StageRes::STAGE_FAIL),
332 "BIZ_STATE", static_cast<int32_t>(BizState::BIZ_STATE_START),
333 "ERROR_CODE", parRes.errorCode);
334 }
335 if (res != E_OK) {
336 LOGE("StorageRadar ERROR, res :%{public}d", res);
337 return false;
338 }
339 return true;
340 }
341
GetCurrentTime()342 static std::string GetCurrentTime()
343 {
344 auto now = std::chrono::system_clock::now();
345 auto time = std::chrono::system_clock::to_time_t(now);
346 auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
347 std::stringstream strTime;
348 strTime << (std::put_time(std::localtime(&time), "%Y-%m-%d %H:%M:%S:")) << (std::setfill('0'))
349 << (std::setw(INDEX)) << (ms.count() % MS_1000);
350 return strTime.str();
351 }
352
ReportStatistics(uint32_t userId,StorageDaemon::RadarStatisticInfo radarInfo)353 void StorageRadar::ReportStatistics(uint32_t userId, StorageDaemon::RadarStatisticInfo radarInfo)
354 {
355 int32_t res = HiSysEventWrite(
356 STORAGESERVICE_DOAMIN,
357 FILE_STORAGE_MANAGER_STATISTIC,
358 HiviewDFX::HiSysEvent::EventType::STATISTIC,
359 "USER_ID", userId,
360 "TIME", GetCurrentTime(),
361 "KEY_LOAD_SUCC_CNT", radarInfo.keyLoadSuccCount,
362 "KEY_LOAD_FAIL_CNT", radarInfo.keyLoadFailCount,
363 "KEY_UNLOAD_SUCC_CNT", radarInfo.keyUnloadSuccCount,
364 "KEY_UNLOAD_FAIL_CNT", radarInfo.keyUnloadFailCount,
365 "USER_ADD_SUCC_CNT", radarInfo.userAddSuccCount,
366 "USER_ADD_FAIL_CNT", radarInfo.userAddFailCount,
367 "USER_REMOVE_SUCC_CNT", radarInfo.userRemoveSuccCount,
368 "USER_REMOVE_FAIL_CNT", radarInfo.userRemoveFailCount,
369 "USER_START_SUCC_CNT", radarInfo.userStartSuccCount,
370 "USER_START_FAIL_CNT", radarInfo.userStartFailCount,
371 "USER_STOP_SUCC_CNT", radarInfo.userStopSuccCount,
372 "USER_STOP_FAIL_CNT", radarInfo.userStopFailCount);
373 if (res != E_OK) {
374 LOGE("StorageRadar ERROR, res :%{public}d", res);
375 }
376 }
377
RecordCurrentTime()378 int64_t StorageRadar::RecordCurrentTime()
379 {
380 return std::chrono::duration_cast<std::chrono::milliseconds>(
381 std::chrono::system_clock::now().time_since_epoch()
382 ).count();
383 }
384
ReportDuration(const std::string & funcName,int64_t startTime,int64_t delay_threshold,uint32_t userId)385 std::string StorageRadar::ReportDuration(const std::string &funcName, int64_t startTime,
386 int64_t delay_threshold, uint32_t userId)
387 {
388 auto duration = RecordCurrentTime() - startTime;
389 std::string ret = std::to_string(duration) + TAG_UNIT_SUFFIX;
390 if (duration <= delay_threshold) {
391 return ret;
392 }
393 std::string tag = TAG_PREFIX + std::to_string(delay_threshold) + TAG_UNIT_SUFFIX;
394 std::string extraData = ret + tag;
395 RadarParameter param = {
396 .orgPkg = DEFAULT_ORGPKGNAME,
397 .userId = userId,
398 .funcName = funcName,
399 .bizScene = BizScene::USER_KEY_ENCRYPTION,
400 .keyElxLevel = "NA",
401 .errorCode = E_DURATION_EXCEED_THRESH,
402 .extraData = extraData
403 };
404 StorageRadar::GetInstance().RecordFuctionResult(param);
405 return ret;
406 }
407 } // namespace StorageService
408 } // namespace OHOS