1/* 2 * Copyright (c) 2022 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 "exception_manager.h" 17 18#include <ctime> 19#include <dirent.h> 20#include <fstream> 21#include <iostream> 22#include <string> 23#include <sys/stat.h> 24#include <sys/types.h> 25#include <vector> 26 27#include "csv_utils.h" 28#include "hisysevent_manager.h" 29#include "sysevent_listener.h" 30#include "wukong_util.h" 31 32namespace OHOS { 33namespace WuKong { 34using HiviewDFX::HiSysEventManager; 35using HiviewDFX::ListenerRule; 36namespace { 37std::string DEFAULT_DIR = "/data/local/tmp/wukong"; 38 39bool InitReportFolder() 40{ 41 DIR *rootDir = nullptr; 42 if ((rootDir = opendir(DEFAULT_DIR.c_str())) == nullptr) { 43 int ret = mkdir(DEFAULT_DIR.c_str(), S_IROTH | S_IRWXU | S_IRWXG); 44 if (ret != 0) { 45 ERROR_LOG_STR("failed to create dir: %s", DEFAULT_DIR.c_str()); 46 return false; 47 } 48 } else { 49 closedir(rootDir); 50 } 51 return true; 52} 53 54bool InitCsvFile(std::ofstream &csvFile, std::string &filePath) 55{ 56 TRACK_LOG_STD(); 57 if (!InitReportFolder()) { 58 return false; 59 } 60 61 filePath = DEFAULT_DIR + "/wukong_" + WuKongUtil::GetInstance()->GetStartRunTime() + ".csv"; 62 csvFile.open(filePath, std::ios_base::out | std::ios_base::trunc); 63 if (!csvFile) { 64 ERROR_LOG_STR("Failed to create csv file at: %s", filePath.c_str()); 65 return false; 66 } 67 CsvUtils::WriteHeader(csvFile); 68 INFO_LOG_STR("CSV: (%s)", filePath.c_str()); 69 TRACK_LOG_END(); 70 return true; 71} 72} // namespace 73bool ExceptionManager::StartCatching() 74{ 75 if (!InitCsvFile(csvFile, currentCsvFilePath)) { 76 return false; 77 } 78 std::vector<ListenerRule> sysRules; 79 std::string domain = ""; 80 std::string eventName = ""; 81 sysRules.emplace_back(domain, eventName); 82 toolListener = std::make_shared<SysEventListener>(csvFile); 83 if (toolListener == nullptr) { 84 ERROR_LOG("toolListener is nullptr and please check the csvFile is ok"); 85 return false; 86 } 87 return HiSysEventManager::AddListener(toolListener, sysRules) == 0; 88} 89 90void ExceptionManager::StopCatching() 91{ 92 int32_t result = HiSysEventManager::RemoveListener(toolListener); 93 DEBUG_LOG_STR("remove listener result: %d", result); 94 if (csvFile.is_open()) { 95 csvFile.flush(); 96 csvFile.close(); 97 } 98 TEST_RUN_LOG("catching stopped"); 99} 100} // namespace WuKong 101} // namespace OHOS 102