• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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