1a69a01cdSopenharmony_ci/* 2a69a01cdSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3a69a01cdSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4a69a01cdSopenharmony_ci * you may not use this file except in compliance with the License. 5a69a01cdSopenharmony_ci * You may obtain a copy of the License at 6a69a01cdSopenharmony_ci * 7a69a01cdSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8a69a01cdSopenharmony_ci * 9a69a01cdSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10a69a01cdSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11a69a01cdSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12a69a01cdSopenharmony_ci * See the License for the specific language governing permissions and 13a69a01cdSopenharmony_ci * limitations under the License. 14a69a01cdSopenharmony_ci */ 15a69a01cdSopenharmony_ci 16a69a01cdSopenharmony_ci#include "exception_manager.h" 17a69a01cdSopenharmony_ci 18a69a01cdSopenharmony_ci#include <ctime> 19a69a01cdSopenharmony_ci#include <dirent.h> 20a69a01cdSopenharmony_ci#include <fstream> 21a69a01cdSopenharmony_ci#include <iostream> 22a69a01cdSopenharmony_ci#include <string> 23a69a01cdSopenharmony_ci#include <sys/stat.h> 24a69a01cdSopenharmony_ci#include <sys/types.h> 25a69a01cdSopenharmony_ci#include <vector> 26a69a01cdSopenharmony_ci 27a69a01cdSopenharmony_ci#include "csv_utils.h" 28a69a01cdSopenharmony_ci#include "hisysevent_manager.h" 29a69a01cdSopenharmony_ci#include "sysevent_listener.h" 30a69a01cdSopenharmony_ci#include "wukong_util.h" 31a69a01cdSopenharmony_ci 32a69a01cdSopenharmony_cinamespace OHOS { 33a69a01cdSopenharmony_cinamespace WuKong { 34a69a01cdSopenharmony_ciusing HiviewDFX::HiSysEventManager; 35a69a01cdSopenharmony_ciusing HiviewDFX::ListenerRule; 36a69a01cdSopenharmony_cinamespace { 37a69a01cdSopenharmony_cistd::string DEFAULT_DIR = "/data/local/tmp/wukong"; 38a69a01cdSopenharmony_ci 39a69a01cdSopenharmony_cibool InitReportFolder() 40a69a01cdSopenharmony_ci{ 41a69a01cdSopenharmony_ci DIR *rootDir = nullptr; 42a69a01cdSopenharmony_ci if ((rootDir = opendir(DEFAULT_DIR.c_str())) == nullptr) { 43a69a01cdSopenharmony_ci int ret = mkdir(DEFAULT_DIR.c_str(), S_IROTH | S_IRWXU | S_IRWXG); 44a69a01cdSopenharmony_ci if (ret != 0) { 45a69a01cdSopenharmony_ci ERROR_LOG_STR("failed to create dir: %s", DEFAULT_DIR.c_str()); 46a69a01cdSopenharmony_ci return false; 47a69a01cdSopenharmony_ci } 48a69a01cdSopenharmony_ci } else { 49a69a01cdSopenharmony_ci closedir(rootDir); 50a69a01cdSopenharmony_ci } 51a69a01cdSopenharmony_ci return true; 52a69a01cdSopenharmony_ci} 53a69a01cdSopenharmony_ci 54a69a01cdSopenharmony_cibool InitCsvFile(std::ofstream &csvFile, std::string &filePath) 55a69a01cdSopenharmony_ci{ 56a69a01cdSopenharmony_ci TRACK_LOG_STD(); 57a69a01cdSopenharmony_ci if (!InitReportFolder()) { 58a69a01cdSopenharmony_ci return false; 59a69a01cdSopenharmony_ci } 60a69a01cdSopenharmony_ci 61a69a01cdSopenharmony_ci filePath = DEFAULT_DIR + "/wukong_" + WuKongUtil::GetInstance()->GetStartRunTime() + ".csv"; 62a69a01cdSopenharmony_ci csvFile.open(filePath, std::ios_base::out | std::ios_base::trunc); 63a69a01cdSopenharmony_ci if (!csvFile) { 64a69a01cdSopenharmony_ci ERROR_LOG_STR("Failed to create csv file at: %s", filePath.c_str()); 65a69a01cdSopenharmony_ci return false; 66a69a01cdSopenharmony_ci } 67a69a01cdSopenharmony_ci CsvUtils::WriteHeader(csvFile); 68a69a01cdSopenharmony_ci INFO_LOG_STR("CSV: (%s)", filePath.c_str()); 69a69a01cdSopenharmony_ci TRACK_LOG_END(); 70a69a01cdSopenharmony_ci return true; 71a69a01cdSopenharmony_ci} 72a69a01cdSopenharmony_ci} // namespace 73a69a01cdSopenharmony_cibool ExceptionManager::StartCatching() 74a69a01cdSopenharmony_ci{ 75a69a01cdSopenharmony_ci if (!InitCsvFile(csvFile, currentCsvFilePath)) { 76a69a01cdSopenharmony_ci return false; 77a69a01cdSopenharmony_ci } 78a69a01cdSopenharmony_ci std::vector<ListenerRule> sysRules; 79a69a01cdSopenharmony_ci std::string domain = ""; 80a69a01cdSopenharmony_ci std::string eventName = ""; 81a69a01cdSopenharmony_ci sysRules.emplace_back(domain, eventName); 82a69a01cdSopenharmony_ci toolListener = std::make_shared<SysEventListener>(csvFile); 83a69a01cdSopenharmony_ci if (toolListener == nullptr) { 84a69a01cdSopenharmony_ci ERROR_LOG("toolListener is nullptr and please check the csvFile is ok"); 85a69a01cdSopenharmony_ci return false; 86a69a01cdSopenharmony_ci } 87a69a01cdSopenharmony_ci return HiSysEventManager::AddListener(toolListener, sysRules) == 0; 88a69a01cdSopenharmony_ci} 89a69a01cdSopenharmony_ci 90a69a01cdSopenharmony_civoid ExceptionManager::StopCatching() 91a69a01cdSopenharmony_ci{ 92a69a01cdSopenharmony_ci int32_t result = HiSysEventManager::RemoveListener(toolListener); 93a69a01cdSopenharmony_ci DEBUG_LOG_STR("remove listener result: %d", result); 94a69a01cdSopenharmony_ci if (csvFile.is_open()) { 95a69a01cdSopenharmony_ci csvFile.flush(); 96a69a01cdSopenharmony_ci csvFile.close(); 97a69a01cdSopenharmony_ci } 98a69a01cdSopenharmony_ci TEST_RUN_LOG("catching stopped"); 99a69a01cdSopenharmony_ci} 100a69a01cdSopenharmony_ci} // namespace WuKong 101a69a01cdSopenharmony_ci} // namespace OHOS 102