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