1020a203aSopenharmony_ci/* 2020a203aSopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4020a203aSopenharmony_ci * you may not use this file except in compliance with the License. 5020a203aSopenharmony_ci * You may obtain a copy of the License at 6020a203aSopenharmony_ci * 7020a203aSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8020a203aSopenharmony_ci * 9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12020a203aSopenharmony_ci * See the License for the specific language governing permissions and 13020a203aSopenharmony_ci * limitations under the License. 14020a203aSopenharmony_ci */ 15020a203aSopenharmony_ci#include "event_logger_config.h" 16020a203aSopenharmony_ci 17020a203aSopenharmony_ci#include <chrono> 18020a203aSopenharmony_ci#include <regex> 19020a203aSopenharmony_ci 20020a203aSopenharmony_ci#include "hiview_logger.h" 21020a203aSopenharmony_ci#include "file_util.h" 22020a203aSopenharmony_cinamespace OHOS { 23020a203aSopenharmony_cinamespace HiviewDFX { 24020a203aSopenharmony_cinamespace { 25020a203aSopenharmony_ci constexpr char EVENT_LOGGER_CONFIG_PATH[] = "/system/etc/hiview/event_logger_config"; 26020a203aSopenharmony_ci constexpr int VERSION_FIELD = 1; 27020a203aSopenharmony_ci constexpr int ID_FIELD = 1; 28020a203aSopenharmony_ci constexpr int NAME_FIELD = 2; 29020a203aSopenharmony_ci constexpr int ACTION_FIELD = 3; 30020a203aSopenharmony_ci constexpr int INTERVAL_FIELD = 4; 31020a203aSopenharmony_ci} 32020a203aSopenharmony_ci 33020a203aSopenharmony_ciDEFINE_LOG_TAG("EventLogger-EventLoggerConfig"); 34020a203aSopenharmony_ci 35020a203aSopenharmony_ciEventLoggerConfig::EventLoggerConfig() 36020a203aSopenharmony_ci{ 37020a203aSopenharmony_ci configPath_ = EVENT_LOGGER_CONFIG_PATH; 38020a203aSopenharmony_ci} 39020a203aSopenharmony_ci 40020a203aSopenharmony_ciEventLoggerConfig::EventLoggerConfig(std::string configPath) 41020a203aSopenharmony_ci{ 42020a203aSopenharmony_ci configPath_ = configPath; 43020a203aSopenharmony_ci} 44020a203aSopenharmony_ci 45020a203aSopenharmony_cibool EventLoggerConfig::OpenConfig() 46020a203aSopenharmony_ci{ 47020a203aSopenharmony_ci std::string realPath; 48020a203aSopenharmony_ci if (!FileUtil::PathToRealPath(configPath_, realPath)) { 49020a203aSopenharmony_ci HIVIEW_LOGI("fail to realPath."); 50020a203aSopenharmony_ci return false; 51020a203aSopenharmony_ci } 52020a203aSopenharmony_ci in_.open(realPath); 53020a203aSopenharmony_ci if (!in_.is_open()) { 54020a203aSopenharmony_ci HIVIEW_LOGW("fail to open config file.\n"); 55020a203aSopenharmony_ci return false; 56020a203aSopenharmony_ci } 57020a203aSopenharmony_ci return true; 58020a203aSopenharmony_ci} 59020a203aSopenharmony_ci 60020a203aSopenharmony_civoid EventLoggerConfig::CloseConfig() 61020a203aSopenharmony_ci{ 62020a203aSopenharmony_ci if (in_.is_open()) { 63020a203aSopenharmony_ci in_.close(); 64020a203aSopenharmony_ci } 65020a203aSopenharmony_ci} 66020a203aSopenharmony_ci 67020a203aSopenharmony_cibool EventLoggerConfig::FindConfigVersion() 68020a203aSopenharmony_ci{ 69020a203aSopenharmony_ci if (!OpenConfig()) { 70020a203aSopenharmony_ci return false; 71020a203aSopenharmony_ci } 72020a203aSopenharmony_ci 73020a203aSopenharmony_ci std::string buf = ""; 74020a203aSopenharmony_ci if (!getline(in_, buf)) { 75020a203aSopenharmony_ci HIVIEW_LOGW("Configfile is none.\n"); 76020a203aSopenharmony_ci CloseConfig(); 77020a203aSopenharmony_ci return false; 78020a203aSopenharmony_ci } 79020a203aSopenharmony_ci 80020a203aSopenharmony_ci std::smatch result; 81020a203aSopenharmony_ci auto versionRegex = std::regex("version=\"([0-9\\.]+)\".*"); 82020a203aSopenharmony_ci if (!regex_search(buf, result, versionRegex)) { 83020a203aSopenharmony_ci HIVIEW_LOGW("match version failed.\n"); 84020a203aSopenharmony_ci CloseConfig(); 85020a203aSopenharmony_ci return false; 86020a203aSopenharmony_ci } 87020a203aSopenharmony_ci version_ = result[VERSION_FIELD]; 88020a203aSopenharmony_ci HIVIEW_LOGI("version: %{public}s\n", version_.c_str()); 89020a203aSopenharmony_ci return true; 90020a203aSopenharmony_ci} 91020a203aSopenharmony_ci 92020a203aSopenharmony_cibool EventLoggerConfig::ParseConfigData(std::function<bool(EventLoggerConfigData&)> func) 93020a203aSopenharmony_ci{ 94020a203aSopenharmony_ci HIVIEW_LOGI("called\n"); 95020a203aSopenharmony_ci if (!FindConfigVersion()) { 96020a203aSopenharmony_ci return false; 97020a203aSopenharmony_ci } 98020a203aSopenharmony_ci 99020a203aSopenharmony_ci std::string buf = ""; 100020a203aSopenharmony_ci std::smatch result; 101020a203aSopenharmony_ci auto eventRegex = std::regex( 102020a203aSopenharmony_ci "event id=\"([0-9xX]*)\"\\s*name=\"([A-Z0-9_]+)\"\\s*action=\"(.*)\"\\s*interval=\"([0-9]*)\".*"); 103020a203aSopenharmony_ci 104020a203aSopenharmony_ci while (getline(in_, buf)) { 105020a203aSopenharmony_ci if (!regex_search(buf, result, eventRegex)) { 106020a203aSopenharmony_ci HIVIEW_LOGW("match event failed, getline duf is %{public}s.\n", buf.c_str()); 107020a203aSopenharmony_ci continue; 108020a203aSopenharmony_ci } 109020a203aSopenharmony_ci 110020a203aSopenharmony_ci EventLoggerConfigData tmpConfigDate; 111020a203aSopenharmony_ci std::string idString = result[ID_FIELD]; 112020a203aSopenharmony_ci if (idString.empty()) { 113020a203aSopenharmony_ci tmpConfigDate.id = -1; 114020a203aSopenharmony_ci } else { 115020a203aSopenharmony_ci tmpConfigDate.id = std::stoi(idString, nullptr, 0); 116020a203aSopenharmony_ci } 117020a203aSopenharmony_ci tmpConfigDate.name = result[NAME_FIELD]; 118020a203aSopenharmony_ci tmpConfigDate.action = result[ACTION_FIELD]; 119020a203aSopenharmony_ci std::string intervalString = result[INTERVAL_FIELD]; 120020a203aSopenharmony_ci if (intervalString.empty()) { 121020a203aSopenharmony_ci tmpConfigDate.interval = 0; 122020a203aSopenharmony_ci } else { 123020a203aSopenharmony_ci tmpConfigDate.interval = std::stoi(intervalString); 124020a203aSopenharmony_ci } 125020a203aSopenharmony_ci if (!func(tmpConfigDate)) { 126020a203aSopenharmony_ci break; 127020a203aSopenharmony_ci } 128020a203aSopenharmony_ci } 129020a203aSopenharmony_ci CloseConfig(); 130020a203aSopenharmony_ci return true; 131020a203aSopenharmony_ci} 132020a203aSopenharmony_ci 133020a203aSopenharmony_cibool EventLoggerConfig::FindConfigLine(int eventId, std::string eventName, EventLoggerConfigData &configOut) 134020a203aSopenharmony_ci{ 135020a203aSopenharmony_ci HIVIEW_LOGI("called\n"); 136020a203aSopenharmony_ci bool ret = false; 137020a203aSopenharmony_ci ParseConfigData([&](EventLoggerConfigData& configDate)->bool { 138020a203aSopenharmony_ci if (eventName == configDate.name) { 139020a203aSopenharmony_ci ret = true; 140020a203aSopenharmony_ci } 141020a203aSopenharmony_ci if (eventId == configDate.id) { 142020a203aSopenharmony_ci ret = true; 143020a203aSopenharmony_ci } 144020a203aSopenharmony_ci if (ret) { 145020a203aSopenharmony_ci configOut.id = configDate.id; 146020a203aSopenharmony_ci configOut.name = configDate.name; 147020a203aSopenharmony_ci configOut.interval = configDate.interval; 148020a203aSopenharmony_ci configOut.action = configDate.action; 149020a203aSopenharmony_ci HIVIEW_LOGI("configDate-> id: 0x%{public}x, name: %{public}s, action: %{public}s, interval: %{public}d\n", 150020a203aSopenharmony_ci configOut.id, configOut.name.c_str(), configOut.action.c_str(), configOut.interval); 151020a203aSopenharmony_ci return false; 152020a203aSopenharmony_ci } 153020a203aSopenharmony_ci return true; 154020a203aSopenharmony_ci }); 155020a203aSopenharmony_ci return ret; 156020a203aSopenharmony_ci} 157020a203aSopenharmony_ci 158020a203aSopenharmony_cistd::unordered_map<std::string, EventLoggerConfig::EventLoggerConfigData> EventLoggerConfig::GetConfig() 159020a203aSopenharmony_ci{ 160020a203aSopenharmony_ci std::unordered_map<std::string, EventLoggerConfigData> ret; 161020a203aSopenharmony_ci ParseConfigData([&](EventLoggerConfigData& data)->bool { 162020a203aSopenharmony_ci ret.insert({ data.name, data }); 163020a203aSopenharmony_ci return true; 164020a203aSopenharmony_ci }); 165020a203aSopenharmony_ci return ret; 166020a203aSopenharmony_ci} 167020a203aSopenharmony_ci} // namespace HiviewDFX 168020a203aSopenharmony_ci} // namespace OHOS 169