]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/common/util.cc
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / common / util.cc
index fea63e955117f8eee0ececeeae4cffeb860b27df..f816ff41db0bd9a3f023e12fc055825880bae9af 100644 (file)
@@ -13,7 +13,8 @@
  */
 
 #include <sys/utsname.h>
-#include <boost/lexical_cast.hpp>
+#include <fstream>
+#include <boost/algorithm/string.hpp>
 
 #include "include/compat.h"
 #include "include/util.h"
@@ -240,53 +241,41 @@ void collect_sys_info(map<string, string> *m, CephContext *cct)
   }
 #else
   // memory
-  FILE *f = fopen(PROCPREFIX "/proc/meminfo", "r");
-  if (f) {
-    char buf[100];
-    while (!feof(f)) {
-      char *line = fgets(buf, sizeof(buf), f);
-      if (!line)
-       break;
-      char key[40];
-      long long value;
-      int r = sscanf(line, "%s %lld", key, &value);
-      if (r == 2) {
-       if (strcmp(key, "MemTotal:") == 0)
-         (*m)["mem_total_kb"] = boost::lexical_cast<string>(value);
-       else if (strcmp(key, "SwapTotal:") == 0)
-         (*m)["mem_swap_kb"] = boost::lexical_cast<string>(value);
+  if (std::ifstream f{PROCPREFIX "/proc/meminfo"}; !f.fail()) {
+    for (std::string line; std::getline(f, line); ) {
+      std::vector<string> parts;
+      boost::split(parts, line, boost::is_any_of(":\t "), boost::token_compress_on);
+      if (parts.size() != 3) {
+       continue;
+      }
+      if (parts[0] == "MemTotal") {
+       (*m)["mem_total_kb"] = parts[1];
+      } else if (parts[0] == "SwapTotal") {
+       (*m)["mem_swap_kb"] = parts[1];
       }
     }
-    fclose(f);
   }
   uint64_t cgroup_limit;
   if (get_cgroup_memory_limit(&cgroup_limit) == 0 &&
       cgroup_limit > 0) {
-    (*m)["mem_cgroup_limit"] = boost::lexical_cast<string>(cgroup_limit);
+    (*m)["mem_cgroup_limit"] = std::to_string(cgroup_limit);
   }
 
   // processor
-  f = fopen(PROCPREFIX "/proc/cpuinfo", "r");
-  if (f) {
-    char buf[100];
-    while (!feof(f)) {
-      char *line = fgets(buf, sizeof(buf), f);
-      if (!line)
-       break;
-      if (strncmp(line, "model name", 10) == 0) {
-       char *c = strchr(buf, ':');
-       c++;
-       while (*c == ' ')
-         ++c;
-       char *nl = c;
-       while (*nl != '\n')
-         ++nl;
-       *nl = '\0';
-       (*m)["cpu"] = c;
+  if (std::ifstream f{PROCPREFIX "/proc/cpuinfo"}; !f.fail()) {
+    for (std::string line; std::getline(f, line); ) {
+      std::vector<string> parts;
+      boost::split(parts, line, boost::is_any_of(":"));
+      if (parts.size() != 2) {
+       continue;
+      }
+      boost::trim(parts[0]);
+      boost::trim(parts[1]);
+      if (parts[0] == "model name") {
+       (*m)["cpu"] = parts[1];
        break;
       }
     }
-    fclose(f);
   }
 #endif
   // distro info
@@ -329,7 +318,7 @@ void dump_services(Formatter* f, const map<string, list<string> >& services, con
 
 // If non-printable characters found then convert bufferlist to
 // base64 encoded string indicating whether it did.
-string cleanbin(bufferlist &bl, bool &base64)
+string cleanbin(bufferlist &bl, bool &base64, bool show)
 {
   bufferlist::iterator it;
   for (it = bl.begin(); it != bl.end(); ++it) {
@@ -345,6 +334,8 @@ string cleanbin(bufferlist &bl, bool &base64)
   bufferlist b64;
   bl.encode_base64(b64);
   string encoded(b64.c_str(), b64.length());
+  if (show)
+    encoded = "Base64:" + encoded;
   base64 = true;
   return encoded;
 }
@@ -356,9 +347,7 @@ string cleanbin(string &str)
   bool base64;
   bufferlist bl;
   bl.append(str);
-  string result = cleanbin(bl, base64);
-  if (base64)
-    result = "Base64:" + result;
+  string result = cleanbin(bl, base64, true);
   return result;
 }