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