• 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 "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 }