From ac71c819a0beccb8fce04457eefac532b8728f38 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Mon, 12 Nov 2018 08:25:13 -0500 Subject: [PATCH 1/6] Address handling of OS pretty name on some OS Some OS (e.g., Oracle Linux Server 6.9) have a trailing space at the end of the PRETTY_NAME line in /etc/os-release. This commit addresses this by accounting for this trailing space when extracting the pretty name. --- .../monitor/os/EvilOsProbeTests.java | 2 +- .../org/elasticsearch/monitor/os/OsProbe.java | 17 +++++++---------- .../elasticsearch/monitor/os/OsProbeTests.java | 11 +++++------ 3 files changed, 13 insertions(+), 17 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..eae58d50607a8 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 @@ -39,7 +39,7 @@ public void testOsPrettyName() throws IOException { final List lines = Files.readAllLines(PathUtils.get("/etc/os-release")); for (final String line : lines) { if (line != null && line.startsWith("PRETTY_NAME=")) { - final Matcher matcher = Pattern.compile("PRETTY_NAME=(\"?|'?)?([^\"']+)\\1").matcher(line); + final Matcher matcher = Pattern.compile("PRETTY_NAME=(\"?|'?)?([^\"']+)\\1\\s*").matcher(line); assert matcher.matches() : line; final String prettyName = matcher.group(2); assertThat(osInfo.getPrettyName(), equalTo(prettyName)); 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..6dc2ac7c52ff4 100644 --- a/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java +++ b/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java @@ -37,6 +37,8 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; public class OsProbe { @@ -547,16 +549,11 @@ private String getPrettyName() throws IOException { final Optional maybePrettyNameLine = prettyNameLines.size() == 1 ? Optional.of(prettyNameLines.get(0)) : Optional.empty(); if (maybePrettyNameLine.isPresent()) { - final String prettyNameLine = maybePrettyNameLine.get(); - final String[] prettyNameFields = prettyNameLine.split("="); - assert prettyNameFields.length == 2 : prettyNameLine; - if (prettyNameFields[1].length() >= 3 && - (prettyNameFields[1].startsWith("\"") && prettyNameFields[1].endsWith("\"")) || - (prettyNameFields[1].startsWith("'") && prettyNameFields[1].endsWith("'"))) { - return prettyNameFields[1].substring(1, prettyNameFields[1].length() - 1); - } else { - return prettyNameFields[1]; - } + // we trim since some OS contain trailing space, for example, Oracle Linux Server 6.9 has a trailing space after the quote + final String trimmedPrettyNameLine = maybePrettyNameLine.get().trim(); + final Matcher matcher = Pattern.compile("PRETTY_NAME=(\"?|'?)?([^\"']+)\\1\\s*").matcher(trimmedPrettyNameLine); + assert matcher.matches() : trimmedPrettyNameLine; + return matcher.group(2); } else { return Constants.OS_NAME; } diff --git a/server/src/test/java/org/elasticsearch/monitor/os/OsProbeTests.java b/server/src/test/java/org/elasticsearch/monitor/os/OsProbeTests.java index 4e94e13523897..f76ac7289486d 100644 --- a/server/src/test/java/org/elasticsearch/monitor/os/OsProbeTests.java +++ b/server/src/test/java/org/elasticsearch/monitor/os/OsProbeTests.java @@ -27,6 +27,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Locale; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.anyOf; @@ -55,12 +56,10 @@ public void testOsInfo() throws IOException { List readOsRelease() throws IOException { assert Constants.LINUX : Constants.OS_NAME; if (prettyName != null) { - final String quote = randomFrom("\"", "'", null); - if (quote == null) { - return Arrays.asList("NAME=" + randomAlphaOfLength(16), "PRETTY_NAME=" + prettyName); - } else { - return Arrays.asList("NAME=" + randomAlphaOfLength(16), "PRETTY_NAME=" + quote + prettyName + quote); - } + final String quote = randomFrom("\"", "'", ""); + final String space = randomFrom(" ", ""); + final String prettyNameLine = String.format(Locale.ROOT, "PRETTY_NAME=%s%s%s%s", quote, prettyName, quote, space); + return Arrays.asList("NAME=" + randomAlphaOfLength(16), prettyNameLine); } else { return Collections.singletonList("NAME=" + randomAlphaOfLength(16)); } From 15ce2a0cbad8f97526d63d21341449015b8f581a Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Mon, 12 Nov 2018 08:40:13 -0500 Subject: [PATCH 2/6] Remove extraneous trim --- .../java/org/elasticsearch/monitor/os/EvilOsProbeTests.java | 2 +- server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java | 2 +- 2 files changed, 2 insertions(+), 2 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 eae58d50607a8..f6d31f1486b68 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 @@ -39,7 +39,7 @@ public void testOsPrettyName() throws IOException { final List lines = Files.readAllLines(PathUtils.get("/etc/os-release")); for (final String line : lines) { if (line != null && line.startsWith("PRETTY_NAME=")) { - final Matcher matcher = Pattern.compile("PRETTY_NAME=(\"?|'?)?([^\"']+)\\1\\s*").matcher(line); + final Matcher matcher = Pattern.compile("PRETTY_NAME=(\"?|'?)?([^\"']+)\\1").matcher(line.trim()); assert matcher.matches() : line; final String prettyName = matcher.group(2); assertThat(osInfo.getPrettyName(), equalTo(prettyName)); 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 6dc2ac7c52ff4..775fc8a0502da 100644 --- a/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java +++ b/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java @@ -551,7 +551,7 @@ private String getPrettyName() throws IOException { if (maybePrettyNameLine.isPresent()) { // we trim since some OS contain trailing space, for example, Oracle Linux Server 6.9 has a trailing space after the quote final String trimmedPrettyNameLine = maybePrettyNameLine.get().trim(); - final Matcher matcher = Pattern.compile("PRETTY_NAME=(\"?|'?)?([^\"']+)\\1\\s*").matcher(trimmedPrettyNameLine); + final Matcher matcher = Pattern.compile("PRETTY_NAME=(\"?|'?)?([^\"']+)\\1").matcher(trimmedPrettyNameLine); assert matcher.matches() : trimmedPrettyNameLine; return matcher.group(2); } else { From 8fe91d61185079a1a5cc842c9bdb0fb05b1a7e3b Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Mon, 12 Nov 2018 09:48:35 -0500 Subject: [PATCH 3/6] Simplify group handling --- .../src/main/java/org/elasticsearch/monitor/os/OsProbe.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 775fc8a0502da..8280590875c9b 100644 --- a/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java +++ b/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java @@ -551,9 +551,10 @@ private String getPrettyName() throws IOException { if (maybePrettyNameLine.isPresent()) { // we trim since some OS contain trailing space, for example, Oracle Linux Server 6.9 has a trailing space after the quote final String trimmedPrettyNameLine = maybePrettyNameLine.get().trim(); - final Matcher matcher = Pattern.compile("PRETTY_NAME=(\"?|'?)?([^\"']+)\\1").matcher(trimmedPrettyNameLine); + final Matcher matcher = Pattern.compile("PRETTY_NAME=(?:\"?|'?)?([^\"']+)\\1").matcher(trimmedPrettyNameLine); assert matcher.matches() : trimmedPrettyNameLine; - return matcher.group(2); + assert matcher.groupCount() == 1 : trimmedPrettyNameLine; + return matcher.group(1); } else { return Constants.OS_NAME; } From 6212c3effc8253723e3ba1484a3f81238c42bbe8 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Mon, 12 Nov 2018 10:01:49 -0500 Subject: [PATCH 4/6] More assertions --- .../java/org/elasticsearch/monitor/os/EvilOsProbeTests.java | 5 +++-- 1 file changed, 3 insertions(+), 2 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 f6d31f1486b68..f923fb2ff929d 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 @@ -39,9 +39,10 @@ public void testOsPrettyName() throws IOException { final List lines = Files.readAllLines(PathUtils.get("/etc/os-release")); for (final String line : lines) { if (line != null && line.startsWith("PRETTY_NAME=")) { - final Matcher matcher = Pattern.compile("PRETTY_NAME=(\"?|'?)?([^\"']+)\\1").matcher(line.trim()); + final Matcher matcher = Pattern.compile("PRETTY_NAME=(?:\"?|'?)?([^\"']+)\\1").matcher(line.trim()); assert matcher.matches() : line; - final String prettyName = matcher.group(2); + assert matcher.groupCount() == 1 : line; + final String prettyName = matcher.group(1); assertThat(osInfo.getPrettyName(), equalTo(prettyName)); return; } From b210587ebaf745782d6983dd5b3304e839a642e4 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Mon, 12 Nov 2018 10:02:41 -0500 Subject: [PATCH 5/6] Have to capture for backreference --- .../java/org/elasticsearch/monitor/os/EvilOsProbeTests.java | 6 +++--- .../src/main/java/org/elasticsearch/monitor/os/OsProbe.java | 6 +++--- 2 files changed, 6 insertions(+), 6 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 f923fb2ff929d..f58f3ca92ebc2 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 @@ -39,10 +39,10 @@ public void testOsPrettyName() throws IOException { final List lines = Files.readAllLines(PathUtils.get("/etc/os-release")); for (final String line : lines) { if (line != null && line.startsWith("PRETTY_NAME=")) { - final Matcher matcher = Pattern.compile("PRETTY_NAME=(?:\"?|'?)?([^\"']+)\\1").matcher(line.trim()); + final Matcher matcher = Pattern.compile("PRETTY_NAME=(\"?|'?)?([^\"']+)\\1").matcher(line.trim()); assert matcher.matches() : line; - assert matcher.groupCount() == 1 : line; - final String prettyName = matcher.group(1); + assert matcher.groupCount() == 2 : line; + final String prettyName = matcher.group(2); assertThat(osInfo.getPrettyName(), equalTo(prettyName)); return; } 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 8280590875c9b..37e0ce927f44b 100644 --- a/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java +++ b/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java @@ -551,10 +551,10 @@ private String getPrettyName() throws IOException { if (maybePrettyNameLine.isPresent()) { // we trim since some OS contain trailing space, for example, Oracle Linux Server 6.9 has a trailing space after the quote final String trimmedPrettyNameLine = maybePrettyNameLine.get().trim(); - final Matcher matcher = Pattern.compile("PRETTY_NAME=(?:\"?|'?)?([^\"']+)\\1").matcher(trimmedPrettyNameLine); + final Matcher matcher = Pattern.compile("PRETTY_NAME=(\"?|'?)?([^\"']+)\\1").matcher(trimmedPrettyNameLine); assert matcher.matches() : trimmedPrettyNameLine; - assert matcher.groupCount() == 1 : trimmedPrettyNameLine; - return matcher.group(1); + assert matcher.groupCount() == 2 : trimmedPrettyNameLine; + return matcher.group(2); } else { return Constants.OS_NAME; } From a49548e86ab82f6c8e658265c81af7be7dffdcd8 Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Mon, 12 Nov 2018 11:02:29 -0500 Subject: [PATCH 6/6] Fix assertions with side-effects --- .../java/org/elasticsearch/monitor/os/EvilOsProbeTests.java | 3 ++- server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java | 3 ++- 2 files changed, 4 insertions(+), 2 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 f58f3ca92ebc2..fed9b2cb535d8 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 @@ -40,7 +40,8 @@ public void testOsPrettyName() throws IOException { for (final String line : lines) { if (line != null && line.startsWith("PRETTY_NAME=")) { final Matcher matcher = Pattern.compile("PRETTY_NAME=(\"?|'?)?([^\"']+)\\1").matcher(line.trim()); - assert matcher.matches() : line; + final boolean matches = matcher.matches(); + assert matches : line; assert matcher.groupCount() == 2 : line; final String prettyName = matcher.group(2); assertThat(osInfo.getPrettyName(), equalTo(prettyName)); 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 37e0ce927f44b..dcc1dd2a581e8 100644 --- a/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java +++ b/server/src/main/java/org/elasticsearch/monitor/os/OsProbe.java @@ -552,7 +552,8 @@ private String getPrettyName() throws IOException { // we trim since some OS contain trailing space, for example, Oracle Linux Server 6.9 has a trailing space after the quote final String trimmedPrettyNameLine = maybePrettyNameLine.get().trim(); final Matcher matcher = Pattern.compile("PRETTY_NAME=(\"?|'?)?([^\"']+)\\1").matcher(trimmedPrettyNameLine); - assert matcher.matches() : trimmedPrettyNameLine; + final boolean matches = matcher.matches(); + assert matches : trimmedPrettyNameLine; assert matcher.groupCount() == 2 : trimmedPrettyNameLine; return matcher.group(2); } else {