OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
misc_utils.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include <fstream>
6 #include <sstream>
7 #include <stdlib.h>
8 #include <base/misc_utils.h>
9 #include <base/logging.h>
10 #include <netdb.h>
11 #include <netinet/in.h>
12 #include <arpa/inet.h>
13 #include "base/sandesh/version_types.h"
14 #include "base/logging.h"
15 #include "rapidjson/document.h"
16 #include "rapidjson/writer.h"
17 #include "rapidjson/stringbuffer.h"
18 
19 using namespace std;
20 
21 const std::string MiscUtils::ContrailVersionCmd = "/opt/contrail/utils/contrail-version";
22 
23 const map<MiscUtils::BuildModule, string> MiscUtils::BuildModuleNames =
26 
28  VERSION_TRACE_BUF, 500));
29 
30 string MiscUtils::BaseName(string filename) {
31  size_t pos = filename.find_last_of('/');
32  if (pos != string::npos) {
33  return filename.substr((pos+1));
34  }
35  return filename;
36 }
37 
38 void MiscUtils::LogVersionInfo(const string build_info, Category::type categ) {
39  VERSION_TRACE(VersionInfoTrace, build_info);
40  if (!LoggingDisabled()) {
41  VERSION_LOG(VersionInfoLog, categ, build_info);
42  }
43 }
44 
45 bool MiscUtils::GetVersionInfoInternal(const string &cmd, string &rpm_version,
46  string &build_num) {
47  FILE *fp;
48  char line[512];
49  fp = popen(cmd.c_str(), "r");
50  if (fp == NULL) {
51  return false;
52  }
53  char *ptr = fgets(line, sizeof(line), fp);
54  if (ptr == NULL) {
55  pclose(fp);
56  return false;
57  }
58  pclose(fp);
59  ptr = strchr(line, '\n');
60  if (ptr != NULL) {
61  *ptr = '\0';
62  }
63  istringstream iss(line);
64  if (iss) {
65  iss >> rpm_version;
66  if (iss) {
67  iss >> build_num;
68  } else {
69  return false;
70  }
71  } else {
72  return false;
73  }
74 
75  return true;
76 }
77 
78 bool MiscUtils::GetContrailVersionInfo(BuildModule id, string &rpm_version,
79  string &build_num) {
80  bool ret = false;
81  stringstream cmd;
82  //Initialize the version info here. Overide its value on finding version
83  rpm_version.assign("unknown");
84  build_num.assign("unknown");
85 
86  ifstream f(ContrailVersionCmd.c_str());
87  if (!f.good()) {
88  f.close();
89  return false;
90  }
91  f.close();
92  cmd << ContrailVersionCmd << " " << BuildModuleNames.at(id)
93  << " | tail -1 | awk '{ print $2 \" \" $3 }'";
94  ret = GetVersionInfoInternal(cmd.str(), rpm_version, build_num);
95 
96  return ret;
97 }
98 
99 bool MiscUtils::GetBuildInfo(BuildModule id, const string &build_info,
100  string &result) {
101  string rpm_version;
102  string build_num;
103 
104  bool ret = GetContrailVersionInfo(id, rpm_version, build_num);
105  contrail_rapidjson::Document d;
106  if (d.Parse<0>(const_cast<char *>(build_info.c_str())).HasParseError()) {
107  result = build_info;
108  return false;
109  }
110  contrail_rapidjson::Value& fields = d["build-info"];
111  if (!fields.IsArray()) {
112  result = build_info;
113  return false;
114  }
115 
116  contrail_rapidjson::Value v;
117  fields[0u].AddMember("build-id",
118  v.SetString(rpm_version.c_str(), d.GetAllocator()), d.GetAllocator());
119  fields[0u].AddMember("build-number",
120  v.SetString(build_num.c_str(), d.GetAllocator()), d.GetAllocator());
121 
122  contrail_rapidjson::StringBuffer strbuf;
123  contrail_rapidjson::Writer<contrail_rapidjson::StringBuffer> writer(strbuf);
124  d.Accept(writer);
125  result = strbuf.GetString();
126  return ret;
127 }
128 
129 bool MiscUtils::GetPlatformInfo(std::string &distro, std::string &code_name) {
130  FILE *fp;
131  char line[512];
132  fp = popen("cat /etc/*release", "r");
133  if (fp == NULL) {
134  return false;
135  }
136  std::string result = "";
137  while (!feof(fp)) {
138  if (fgets(line, 512, fp) != NULL) {
139  result += line;
140  }
141  }
142  pclose(fp);
143 
144  // parse the strings for centos 6.4, 6.5, trusty, precise..
145  if (result.find("trusty") != std::string::npos) {
146  distro = "Ubuntu";
147  code_name = "Trusty";
148  } else if (result.find("precise") != std::string::npos) {
149  distro = "Ubuntu";
150  code_name = "Precise";
151  } else if (result.find("rhel") != std::string::npos) {
152  distro = "rhel";
153  code_name = "7.0";
154  } else if (result.find("CentOS distro 6.4") != std::string::npos) {
155  distro = "CentOS";
156  code_name = "6.4";
157  } else if (result.find("CentOS distro 6.5") != std::string::npos) {
158  distro = "CentOS";
159  code_name = "6.5";
160  } else if (result.find("CentOS Linux release 7") != std::string::npos) {
161  distro = "CentOS";
162  code_name = "7.1.1503";
163  } else {
164  return false;
165  }
166  return true;
167 }
168 
170  return (UTCTimestamp() - startup_time_secs_);
171 }
172 
174  return (startup_time_secs_ = UTCTimestamp());
175 }
static std::string BaseName(std::string filename)
Definition: misc_utils.cc:30
static bool GetBuildInfo(BuildModule id, const std::string &build_info, std::string &result)
Definition: misc_utils.cc:99
static void LogVersionInfo(const std::string str, Category::type categ)
Definition: misc_utils.cc:38
static bool GetPlatformInfo(std::string &distro, std::string &code_name)
Definition: misc_utils.cc:129
static time_t GetUpTimeSeconds()
Definition: misc_utils.cc:169
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
Definition: sandesh_trace.h:18
static const std::map< BuildModule, std::string > BuildModuleNames
Definition: misc_utils.h:56
static bool GetContrailVersionInfo(BuildModule id, std::string &rpm_version, std::string &build_num)
Definition: misc_utils.cc:78
static time_t set_startup_time_secs()
Definition: misc_utils.cc:173
SandeshTraceBufferPtr VersionTraceBuf
uint8_t type
Definition: load_balance.h:109
#define VERSION_LOG(obj, categ,...)
Definition: misc_utils.h:24
#define VERSION_TRACE(obj,...)
Definition: misc_utils.h:20
static std::map< BuildModule, std::string > MapInit()
Definition: misc_utils.h:48
static time_t UTCTimestamp()
Definition: time_util.h:23
static bool GetVersionInfoInternal(const std::string &cmd, std::string &rpm_version, std::string &build_num)
Definition: misc_utils.cc:45
static time_t startup_time_secs_
Definition: misc_utils.h:75
bool LoggingDisabled()
Definition: logging.cc:24
#define VERSION_TRACE_BUF
Definition: misc_utils.h:16
static const std::string ContrailVersionCmd
Definition: misc_utils.h:58
SandeshTraceBufferPtr SandeshTraceBufferCreate(const std::string &buf_name, size_t buf_size, bool trace_enable=true)
Definition: sandesh_trace.h:46