From: Jean-Marcel Flach Date: Mon, 27 Apr 2015 14:21:59 +0000 (+0200) Subject: Update ReleaseHelper to work with most Linux distributions X-Git-Tag: v2.4.0~678 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b30069c282de3d446b84ecc22f557489c9da3b16;p=icinga2 Update ReleaseHelper to work with most Linux distributions refs #8888 --- diff --git a/lib/base/application.cpp b/lib/base/application.cpp index 5ed6b38b4..3015a1c57 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -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__ */ }