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.3.5~47 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f13460a2ddfcc6332991ad62bb292f94f4863347;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 af71a8725..2aee26ee9 100644 --- a/lib/base/application.cpp +++ b/lib/base/application.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -485,23 +486,58 @@ static String UnameHelper(char type) return result; } -static String LsbReleaseHelper(void) -{ - FILE *fp = popen("lsb_release -s -d 2>&1", "r"); - - char line[1024]; - std::ostringstream msgbuf; - - while (fgets(line, sizeof(line), fp) != NULL) - msgbuf << line; - - pclose(fp); - - String result = msgbuf.str(); - result.Trim(); - - 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 */ /** @@ -534,7 +570,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__ */ }