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