• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }