From 82e8dff97cadce797a56e86dbadf42b99059b69b Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Mon, 12 Nov 2018 08:55:11 -0500 Subject: [PATCH 1/4] Handle OS pretty name on old OS without OS release Some very old ancient versions of Linux do not have /etc/os-release. For example, old Red Hat-like OS. This commit adds a fallback for handling pretty name for these OS. --- .../monitor/os/EvilOsProbeTests.java | 11 ++++++- .../org/elasticsearch/monitor/os/OsProbe.java | 29 ++++++++++++++----- .../elasticsearch/bootstrap/security.policy | 1 + 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/qa/evil-tests/src/test/java/org/elasticsearch/monitor/os/EvilOsProbeTests.java b/qa/evil-tests/src/test/java/org/elasticsearch/monitor/os/EvilOsProbeTests.java index 429019b3a134b..6bd6679bbe0bb 100644 --- a/qa/evil-tests/src/test/java/org/elasticsearch/monitor/os/EvilOsProbeTests.java +++ b/qa/evil-tests/src/test/java/org/elasticsearch/monitor/os/EvilOsProbeTests.java @@ -25,6 +25,7 @@ import java.io.IOException; import java.nio.file.Files; +import java.util.Collections; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -36,7 +37,15 @@ public class EvilOsProbeTests extends ESTestCase { public void testOsPrettyName() throws IOException { final OsInfo osInfo = OsProbe.getInstance().osInfo(randomLongBetween(1, 100), randomIntBetween(1, 8)); if (Constants.LINUX) { - final List lines = Files.readAllLines(PathUtils.get("/etc/os-release")); + final List lines; + if (Files.exists(PathUtils.get("/etc/os-release"))) { + lines = Files.readAllLines(PathUtils.get("/etc/os-release")); + } else if (Files.exists(PathUtils.get("/usr/lib/os-release"))) { + lines = Files.readAllLines(PathUtils.get("/usr/lib/os-release")); + } else { + lines = Collections.singletonList( + "PRETTY_NAME=\"" + Files.readAllLines(PathUtils.get("/etc/system-release")).get(0) + "\""); + } for (final String line : lines) { if (line != null && line.startsWith("PRETTY_NAME=")) { final Matcher matcher = Pattern.compile("PRETTY_NAME=(\"?|'?)?([^\"']+)\\1").matcher(line); diff --git a/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java b/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java index 06a5aadd22945..225fd6a49eb5b 100644 --- a/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java +++ b/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java @@ -33,6 +33,8 @@ import java.lang.reflect.Method; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -567,22 +569,33 @@ private String getPrettyName() throws IOException { } /** - * The lines from {@code /etc/os-release} or {@code /usr/lib/os-release} as a fallback. These file represents identification of the - * underlying operating system. The structure of the file is newlines of key-value pairs of shell-compatible variable assignments. + * The lines from {@code /etc/os-release} or {@code /usr/lib/os-release} as a fallback, with an additional fallback to + * {@code /etc/system-release}. These file represents identification of the underlying operating system. The structure of the file is + * newlines of key-value pairs of shell-compatible variable assignments. * - * @return the lines from {@code /etc/os-release} or {@code /usr/lib/os-release} - * @throws IOException if an I/O exception occurs reading {@code /etc/os-release} or {@code /usr/lib/os-release} + * @return the lines from {@code /etc/os-release} or {@code /usr/lib/os-release} or {@code /etc/system-release} + * @throws IOException if an I/O exception occurs reading {@code /etc/os-release} or {@code /usr/lib/os-release} or + * {@code /etc/system-release} */ - @SuppressForbidden(reason = "access /etc/os-release or /usr/lib/os-release") + @SuppressForbidden(reason = "access /etc/os-release or /usr/lib/os-release or /etc/system-release") List readOsRelease() throws IOException { final List lines; if (Files.exists(PathUtils.get("/etc/os-release"))) { lines = Files.readAllLines(PathUtils.get("/etc/os-release")); - } else { + assert lines != null && lines.isEmpty() == false; + return lines; + } else if (Files.exists(PathUtils.get("/usr/lib/os-release"))) { lines = Files.readAllLines(PathUtils.get("/usr/lib/os-release")); + assert lines != null && lines.isEmpty() == false; + return lines; + } else if (Files.exists(PathUtils.get("/etc/system-release"))) { + // fallback for older Red Hat-like OS + lines = Files.readAllLines(PathUtils.get("/etc/system-release")); + assert lines != null && lines.size() == 1; + return Collections.singletonList("PRETTY_NAME=\"" + lines.get(0) + "\""); + } else { + return Collections.emptyList(); } - assert lines != null && lines.isEmpty() == false; - return lines; } public OsStats osStats() { diff --git a/server/src/main/resources/org/elasticsearch/bootstrap/security.policy b/server/src/main/resources/org/elasticsearch/bootstrap/security.policy index 0df1cf17a8499..4df99ef6f8836 100644 --- a/server/src/main/resources/org/elasticsearch/bootstrap/security.policy +++ b/server/src/main/resources/org/elasticsearch/bootstrap/security.policy @@ -127,6 +127,7 @@ grant { // OS release on Linux permission java.io.FilePermission "/etc/os-release", "read"; permission java.io.FilePermission "/usr/lib/os-release", "read"; + permission java.io.FilePermission "/etc/system-release", "read"; // io stats on Linux permission java.io.FilePermission "/proc/self/mountinfo", "read"; From cac0f9f50cb885c43f675a76ee56f7a5a4a2ee57 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Mon, 12 Nov 2018 09:51:57 -0500 Subject: [PATCH 2/4] Fix Javadocs --- server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java b/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java index 225fd6a49eb5b..b2b1606a45755 100644 --- a/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java +++ b/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java @@ -570,7 +570,7 @@ private String getPrettyName() throws IOException { /** * The lines from {@code /etc/os-release} or {@code /usr/lib/os-release} as a fallback, with an additional fallback to - * {@code /etc/system-release}. These file represents identification of the underlying operating system. The structure of the file is + * {@code /etc/system-release}. These files represents identification of the underlying operating system. The structure of the file is * newlines of key-value pairs of shell-compatible variable assignments. * * @return the lines from {@code /etc/os-release} or {@code /usr/lib/os-release} or {@code /etc/system-release} From c09423d9013165cadf5a4d2f4223d86e10c2f6c3 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Mon, 12 Nov 2018 09:55:58 -0500 Subject: [PATCH 3/4] Javadoc round two --- server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java b/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java index b2b1606a45755..bcce82946d6d0 100644 --- a/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java +++ b/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java @@ -570,7 +570,7 @@ private String getPrettyName() throws IOException { /** * The lines from {@code /etc/os-release} or {@code /usr/lib/os-release} as a fallback, with an additional fallback to - * {@code /etc/system-release}. These files represents identification of the underlying operating system. The structure of the file is + * {@code /etc/system-release}. These files represent identification of the underlying operating system. The structure of the file is * newlines of key-value pairs of shell-compatible variable assignments. * * @return the lines from {@code /etc/os-release} or {@code /usr/lib/os-release} or {@code /etc/system-release} From 5c61807b4a1a15def9a3337792733cc25fdce35e Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Mon, 12 Nov 2018 15:54:27 -0500 Subject: [PATCH 4/4] Remove import --- server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java b/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java index 3c97a87d63a18..18173dd275a46 100644 --- a/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java +++ b/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java @@ -33,7 +33,6 @@ import java.lang.reflect.Method; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List;