1 /*
2 * Copyright (c) 2021 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 "parse_plugin_config.h"
17
18 #include "cpu_plugin_config_standard.pb.h"
19 #include "diskio_plugin_config_standard.pb.h"
20 #include "google/protobuf/text_format.h"
21 #include "hidump_plugin_config_standard.pb.h"
22 #include "hilog_plugin_config_standard.pb.h"
23 #include "hiperf_plugin_config_standard.pb.h"
24 #include "hisysevent_plugin_config_standard.pb.h"
25 #include "memory_plugin_common_standard.pb.h"
26 #include "memory_plugin_config_standard.pb.h"
27 #include "native_hook_config_standard.pb.h"
28 #include "network_plugin_config_standard.pb.h"
29 #include "process_plugin_config_standard.pb.h"
30 #include "trace_plugin_config_standard.pb.h"
31
32 using google::protobuf::TextFormat;
33
34 namespace {
35 constexpr int REMAINDER = 2;
36 }
37
GetInstance()38 ParsePluginConfig& ParsePluginConfig::GetInstance()
39 {
40 static ParsePluginConfig parsePluginConfig;
41 return parsePluginConfig;
42 }
43
GetPluginsConfig(std::string & content)44 std::string ParsePluginConfig::GetPluginsConfig(std::string& content)
45 {
46 std::string pluginConfig = "";
47 std::string pluginName = "";
48 size_t beginPos = 0;
49 size_t endPos = 0;
50 for (int i = 0; content.size() > 0; i++) {
51 // 先获取pluginName,再获取configData
52 std::string destStr = (i % REMAINDER) ? "config_data" : "plugin_name";
53 beginPos = content.find(destStr);
54 if (beginPos == std::string::npos) {
55 break;
56 }
57 pluginConfig += content.substr(0, beginPos);
58 content = content.substr(beginPos + destStr.size(), content.size());
59 destStr = (i % REMAINDER) ? "{" : "\"";
60 beginPos = content.find(destStr);
61 if (beginPos == std::string::npos) {
62 break;
63 }
64 content = content.substr(beginPos + 1, content.size());
65 destStr = (i % REMAINDER) ? "}" : "\"";
66 endPos = content.find(destStr);
67 if (endPos == std::string::npos) {
68 break;
69 }
70 std::string contentStr = content.substr(0, endPos);
71 if (i % REMAINDER == 0) { // set plugin-name
72 pluginName = contentStr;
73
74 if (pluginName == "") {
75 return "";
76 }
77 pluginConfig += "name: \"" + pluginName + "\"";
78 } else { // save config_data
79 pluginConfigMap.insert(
80 {pluginName, contentStr}
81 );
82 pluginConfig += "config_data: \"\"";
83 }
84
85 content = content.substr(endPos + 1, content.size());
86 }
87
88 pluginConfig += content;
89 return pluginConfig;
90 }
91
SetSerializePluginsConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)92 bool ParsePluginConfig::SetSerializePluginsConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
93 {
94 bool ret = false;
95 if (pluginConfigMap.count(pluginName) == 0) {
96 printf("unknown plugin: %s\n", pluginName.c_str());
97 return ret;
98 }
99
100 // 将pluginConfigMap中保存的configData序列化后写入pluginConfig
101 if (pluginName == "cpu-plugin") {
102 ret = SetSerializeCpuConfig(pluginName, pluginConfig);
103 } else if (pluginName == "diskio-plugin") {
104 ret = SetSerializeDiskioConfig(pluginName, pluginConfig);
105 } else if (pluginName == "ftrace-plugin") {
106 ret = SetSerializeFtraceConfig(pluginName, pluginConfig);
107 } else if (pluginName == "hidump-plugin") {
108 ret = SetSerializeHidumpConfig(pluginName, pluginConfig);
109 } else if (pluginName == "hilog-plugin") {
110 ret = SetSerializeHilogConfig(pluginName, pluginConfig);
111 } else if (pluginName == "memory-plugin") {
112 ret = SetSerializeMemoryConfig(pluginName, pluginConfig);
113 } else if (pluginName == "nativehook") {
114 ret = SetSerializeHookConfig(pluginName, pluginConfig);
115 } else if (pluginName == "network-plugin") {
116 ret = SetSerializeNetworkConfig(pluginName, pluginConfig);
117 } else if (pluginName == "process-plugin") {
118 ret = SetSerializeProcessConfig(pluginName, pluginConfig);
119 } else if (pluginName == "hiperf-plugin") {
120 ret = SetSerializeHiperfConfig(pluginName, pluginConfig);
121 } else if (pluginName == "hisysevent-plugin") {
122 ret = SetSerializeHisyseventConfig(pluginName, pluginConfig);
123 } else {
124 printf("unsupport plugin: %s\n", pluginName.c_str());
125 }
126
127 return ret;
128 }
129
SetSerializeCpuConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)130 bool ParsePluginConfig::SetSerializeCpuConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
131 {
132 std::string configData = pluginConfigMap[pluginName];
133 auto cpuConfigNolite = std::make_unique<ForStandard::CpuConfig>();
134 if (!TextFormat::ParseFromString(configData, cpuConfigNolite.get())) {
135 printf("cpu parse failed!\n");
136 return false;
137 }
138
139 std::vector<uint8_t> configDataVec(cpuConfigNolite->ByteSizeLong());
140 if (cpuConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
141 printf("cpu serialize failed!\n");
142 return false;
143 }
144 pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
145 return true;
146 }
147
SetSerializeDiskioConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)148 bool ParsePluginConfig::SetSerializeDiskioConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
149 {
150 std::string configData = pluginConfigMap[pluginName];
151 auto diskioConfigNolite = std::make_unique<ForStandard::DiskioConfig>();
152 if (!TextFormat::ParseFromString(configData, diskioConfigNolite.get())) {
153 printf("diskio parse failed!\n");
154 return false;
155 }
156
157 std::vector<uint8_t> configDataVec(diskioConfigNolite->ByteSizeLong());
158 if (diskioConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
159 printf("diskio serialize failed!\n");
160 return false;
161 }
162 pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
163 return true;
164 }
165
SetSerializeFtraceConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)166 bool ParsePluginConfig::SetSerializeFtraceConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
167 {
168 std::string configData = pluginConfigMap[pluginName];
169 auto ftraceConfigNolite = std::make_unique<ForStandard::TracePluginConfig>();
170 if (!TextFormat::ParseFromString(configData, ftraceConfigNolite.get())) {
171 printf("ftrace parse failed!\n");
172 return false;
173 }
174
175 std::vector<uint8_t> configNoLiteDataVec(ftraceConfigNolite->ByteSizeLong());
176 if (ftraceConfigNolite->SerializeToArray(configNoLiteDataVec.data(), configNoLiteDataVec.size()) <= 0) {
177 printf("ftrace serialize failed!\n");
178 return false;
179 }
180
181 pluginConfig.set_config_data((const void*)configNoLiteDataVec.data(), configNoLiteDataVec.size());
182 return true;
183 }
184
SetSerializeHidumpConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)185 bool ParsePluginConfig::SetSerializeHidumpConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
186 {
187 std::string configData = pluginConfigMap[pluginName];
188 auto hidumpConfigNolite = std::make_unique<ForStandard::HidumpConfig>();
189 if (!TextFormat::ParseFromString(configData, hidumpConfigNolite.get())) {
190 printf("hidump parse failed!\n");
191 return false;
192 }
193
194 std::vector<uint8_t> configDataVec(hidumpConfigNolite->ByteSizeLong());
195 if (hidumpConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
196 printf("hidump serialize failed!\n");
197 return false;
198 }
199 pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
200 return true;
201 }
202
SetSerializeHilogConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)203 bool ParsePluginConfig::SetSerializeHilogConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
204 {
205 std::string configData = pluginConfigMap[pluginName];
206 auto hilogConfigNolite = std::make_unique<ForStandard::HilogConfig>();
207 if (!TextFormat::ParseFromString(configData, hilogConfigNolite.get())) {
208 printf("hilog parse failed!\n");
209 return false;
210 }
211
212 std::vector<uint8_t> configDataVec(hilogConfigNolite->ByteSizeLong());
213 if (hilogConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
214 printf("hilog serialize failed!\n");
215 return false;
216 }
217 pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
218 return true;
219 }
220
SetSerializeMemoryConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)221 bool ParsePluginConfig::SetSerializeMemoryConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
222 {
223 std::string configData = pluginConfigMap[pluginName];
224 auto memoryConfigNolite = std::make_unique<ForStandard::MemoryConfig>();
225 if (!TextFormat::ParseFromString(configData, memoryConfigNolite.get())) {
226 printf("memory parse failed!\n");
227 return false;
228 }
229
230 std::vector<uint8_t> configDataVec(memoryConfigNolite->ByteSizeLong());
231 if (memoryConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
232 printf("memory serialize failed!\n");
233 return false;
234 }
235 pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
236 return true;
237 }
238
SetSerializeHookConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)239 bool ParsePluginConfig::SetSerializeHookConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
240 {
241 std::string configData = pluginConfigMap[pluginName];
242 auto hookConfigNolite = std::make_unique<ForStandard::NativeHookConfig>();
243 if (!TextFormat::ParseFromString(configData, hookConfigNolite.get())) {
244 printf("nativedaemon parse failed!\n");
245 return false;
246 }
247
248 std::vector<uint8_t> configDataVec(hookConfigNolite->ByteSizeLong());
249 if (hookConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
250 printf("nativedaemon serialize failed!\n");
251 return false;
252 }
253 pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
254 return true;
255 }
256
SetSerializeNetworkConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)257 bool ParsePluginConfig::SetSerializeNetworkConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
258 {
259 std::string configData = pluginConfigMap[pluginName];
260 auto networkConfigNolite = std::make_unique<ForStandard::NetworkConfig>();
261 if (!TextFormat::ParseFromString(configData, networkConfigNolite.get())) {
262 printf("network parse failed!\n");
263 return false;
264 }
265
266 std::vector<uint8_t> configDataVec(networkConfigNolite->ByteSizeLong());
267 if (networkConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
268 printf("network serialize failed!\n");
269 return false;
270 }
271 pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
272 return true;
273 }
274
SetSerializeProcessConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)275 bool ParsePluginConfig::SetSerializeProcessConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
276 {
277 std::string configData = pluginConfigMap[pluginName];
278 auto processConfigNolite = std::make_unique<ForStandard::ProcessConfig>();
279 if (!TextFormat::ParseFromString(configData, processConfigNolite.get())) {
280 printf("process parse failed!\n");
281 return false;
282 }
283
284 std::vector<uint8_t> configDataVec(processConfigNolite->ByteSizeLong());
285 if (processConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
286 printf("process serialize failed!\n");
287 return false;
288 }
289 pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
290 return true;
291 }
292
SetSerializeHiperfConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)293 bool ParsePluginConfig::SetSerializeHiperfConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
294 {
295 std::string configData = pluginConfigMap[pluginName];
296 auto hiperfConfigNolite = std::make_unique<ForStandard::HiperfPluginConfig>();
297 if (!TextFormat::ParseFromString(configData, hiperfConfigNolite.get())) {
298 printf("hiperf config parse failed!\n");
299 return false;
300 }
301
302 std::vector<uint8_t> configDataVec(hiperfConfigNolite->ByteSizeLong());
303 if (hiperfConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
304 printf("hiperf config failed!\n");
305 return false;
306 }
307 pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
308 return true;
309 }
310
SetSerializeHisyseventConfig(const std::string & pluginName,ProfilerPluginConfig & pluginConfig)311 bool ParsePluginConfig::SetSerializeHisyseventConfig(const std::string& pluginName, ProfilerPluginConfig& pluginConfig)
312 {
313 std::string configData = pluginConfigMap[pluginName];
314 auto hisyseventConfigNolite = std::make_unique<ForStandard::HisyseventConfig>();
315 if (!TextFormat::ParseFromString(configData, hisyseventConfigNolite.get())) {
316 printf("NODE hisysevent parse failed!\n");
317 return false;
318 }
319
320 std::vector<uint8_t> configDataVec(hisyseventConfigNolite->ByteSizeLong());
321 if (hisyseventConfigNolite->SerializeToArray(configDataVec.data(), configDataVec.size()) <= 0) {
322 printf("NODE hisysevent serialize failed!\n");
323 return false;
324 }
325 pluginConfig.set_config_data((const void*)configDataVec.data(), configDataVec.size());
326 return true;
327 }