]> granicus.if.org Git - icinga2/commitdiff
Update ReleaseHelper to work with most Linux distributions
authorJean-Marcel Flach <jean-marcel.flach@netways.de>
Mon, 27 Apr 2015 14:21:59 +0000 (16:21 +0200)
committerJean-Marcel Flach <jean-marcel.flach@netways.de>
Mon, 27 Apr 2015 14:21:59 +0000 (16:21 +0200)
refs #8888

lib/base/application.cpp

index 5ed6b38b4c515b22776bfb0522ffc6e2f64d076a..3015a1c57d918229c9cef54980febbb583dc9118 100644 (file)
@@ -34,6 +34,7 @@
 #include <boost/algorithm/string/classification.hpp>
 #include <boost/foreach.hpp>
 #include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/trim.hpp>
 #include <boost/exception/errinfo_api_function.hpp>
 #include <boost/exception/errinfo_errno.hpp>
 #include <boost/exception/errinfo_file_name.hpp>
@@ -487,42 +488,58 @@ static String UnameHelper(char type)
        return result;
 }
 
-static String LsbReleaseHelper(void)
-{
-       String result = "Could not get release string";
-       FILE *fp = popen("lsb_release -s -d 2>&1", "r");
-       std::ostringstream msgbuf;
-
-       if (fp != NULL) {
-               char line[1024];
-
-               while (fgets(line, sizeof(line), fp) != NULL)
-                       msgbuf << line;
-
-               int status = pclose(fp);
-
-               if (WEXITSTATUS(status) == 0) {
-                       result = msgbuf.str();
-                       result.Trim();
-                       return result;
-               }
-       }
-
-       std::ifstream release("/etc/os-release");
-       if (!release.is_open())
-               return result;
-       std::string release_line;
-
-       while (getline(release, release_line)) {
-               if (release_line.find("PRETTY_NAME") != std::string::npos) {
-                       result = release_line.substr(13, release_line.length()-14);
-                       break;
-               }
-       }
-       release.close();
-
-       return result;
+int ReleaseHelper(std::string &result)
+{
+    /* You are useing *some* distribution */
+    FILE *fp = popen("lsb_release -s -d 2>&1", "r");
+    std::ostringstream msgbuf;
+
+    if (fp != NULL) {
+        char line[1024];
+        while (fgets(line, sizeof(line), fp) != NULL)
+            msgbuf << line;
+        int status = pclose(fp);
+        if (WEXITSTATUS(status) == 0) { 
+            result = msgbuf.str();
+                       boost::trim(result);
+            return result.length();
+        }    
+    }    
+
+    /* You have systemd or Ubuntu etc. */
+    std::ifstream release("/etc/os-release");
+    std::string release_line;
+    if (release.is_open()) {
+        while (getline(release, release_line)) {
+            if (release_line.find("PRETTY_NAME") != std::string::npos) {
+                result = release_line.substr(13, release_line.length() - 14); 
+                return result.length();
+            }    
+        }    
+    }    
+
+    /* Centos < 7 */
+    release.close();
+    release.open("/etc/redhat-release");
+    if (release.is_open()) {
+        getline(release, release_line);
+               result = release_line;
+        return result.length();
+    }    
+
+    /* sles 11 sp3, opensuse w/e */
+    release.close();
+    release.open("etc/SuSE-release");
+    if (release.is_open()) {
+        getline(release, release_line);
+        result = release_line;
+        return result.length();
+    }    
+
+    /* Just give up */
+    return 0;
 }
+
 #endif /* _WIN32 */
 
 /**
@@ -554,7 +571,9 @@ void Application::DisplayInfoMessage(std::ostream& os, bool skipVersion)
 #endif /* _WIN32 */
 
 #ifdef __linux__
-       os << "  Distribution: " << LsbReleaseHelper() << "\n";
+       std::string release;
+       if (ReleaseHelper(release))
+               os << "  Distribution: " << release << "\n";
 #endif /* __linux__ */
 }