1
0
mirror of https://github.com/pavel-odintsov/fastnetmon synced 2024-09-18 13:31:40 +02:00

Added logic to correctly parse ARM cpuinfo on ARM based macOS Docker

This commit is contained in:
Pavel Odintsov 2024-07-30 12:42:55 +03:00
parent 3cca3b594e
commit 5f7ce6b6a5
3 changed files with 20 additions and 14 deletions

View File

@ -2193,28 +2193,30 @@ bool get_cpu_flags(std::vector<std::string>& flags) {
return false; return false;
} }
std::string get_cpu_model() { bool get_cpu_model(std::string& cpu_model) {
extern log4cpp::Category& logger; extern log4cpp::Category& logger;
std::ifstream cpuinfo_file("/proc/cpuinfo"); std::ifstream cpuinfo_file("/proc/cpuinfo");
boost::regex processor_model_pattern("^model name\\s+:\\s(.*?)$");
if (!cpuinfo_file.is_open()) { if (!cpuinfo_file.is_open()) {
logger << log4cpp::Priority::ERROR << "License: could not open cpuinfo"; logger << log4cpp::Priority::ERROR << "Could not open /proc/cpuinfo";
return ""; return false;
} }
boost::regex processor_model_pattern("^model name\\s+:\\s(.*?)$");
std::string line; std::string line;
while (getline(cpuinfo_file, line)) { while (getline(cpuinfo_file, line)) {
boost::match_results<std::string::const_iterator> regex_results; boost::match_results<std::string::const_iterator> regex_results;
if (boost::regex_match(line, regex_results, processor_model_pattern)) { if (boost::regex_match(line, regex_results, processor_model_pattern)) {
return regex_results[1]; cpu_model = regex_results[1];
return true;
} }
} }
// For new ARMs (Cavium Thunder X for example) we do not have model name in 4.10 kernel // For ARM CPUs we have another format
#ifdef __aarch64__ // Even if we run in x86_64 mode we can have cpuinfo with such information on ARM64 based macOS platforms
std::string implementer; std::string implementer;
std::string part; std::string part;
std::string revision; std::string revision;
@ -2247,13 +2249,13 @@ std::string get_cpu_model() {
// If we fould all of them, use these fields as model // If we fould all of them, use these fields as model
if (implementer.size() > 0 && part.size() > 0 && revision.size() > 0) { if (implementer.size() > 0 && part.size() > 0 && revision.size() > 0) {
return "implementer: " + implementer + " part: " + part + " revision: " + revision; cpu_model = "implementer: " + implementer + " part: " + part + " revision: " + revision;
} else { return true;
// logger << log4cpp::Priority::ERROR << "implementer: " << implementer << " part: " << part << " revision: " << revision;
} }
#endif
return ""; // logger << log4cpp::Priority::ERROR << "implementer: " << implementer << " part: " << part << " revision: " << revision;
return false;
} }
// returns forwarding status as string // returns forwarding status as string

View File

@ -139,7 +139,7 @@ bool execute_web_request(const std::string& address_param,
const std::map<std::string, std::string>& headers, const std::map<std::string, std::string>& headers,
std::string& error_text); std::string& error_text);
unsigned int get_total_memory(); unsigned int get_total_memory();
std::string get_cpu_model(); bool get_cpu_model(std::string& cpu_model);
bool execute_web_request_secure(std::string address, bool execute_web_request_secure(std::string address,
std::string request_type, std::string request_type,
std::string post_data, std::string post_data,

View File

@ -3083,7 +3083,11 @@ void send_usage_data_to_reporting_server() {
stats["traffic_db"] = false; stats["traffic_db"] = false;
stats["prometheus"] = false; stats["prometheus"] = false;
stats["cpu_model"] = get_cpu_model(); std::string cpu_model;
get_cpu_model(cpu_model);
stats["cpu_model"] = cpu_model;
stats["cpu_logical_cores"] = get_logical_cpus_number(); stats["cpu_logical_cores"] = get_logical_cpus_number();
// Mbytes // Mbytes