You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ja...@apache.org on 2016/10/12 07:23:37 UTC
lucene-solr:branch_6x: SOLR-9610: New AssertTool in SolrCLI for
easier cross platform assertions from command line
Repository: lucene-solr
Updated Branches:
refs/heads/branch_6x 0375122c8 -> df4170629
SOLR-9610: New AssertTool in SolrCLI for easier cross platform assertions from command line
(cherry picked from commit 6512d0c)
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/df417062
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/df417062
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/df417062
Branch: refs/heads/branch_6x
Commit: df4170629587ff60e10b93dbe16d607ca798e894
Parents: 0375122
Author: Jan H�ydahl <ja...@apache.org>
Authored: Wed Oct 12 09:16:41 2016 +0200
Committer: Jan H�ydahl <ja...@apache.org>
Committed: Wed Oct 12 09:22:53 2016 +0200
----------------------------------------------------------------------
solr/CHANGES.txt | 2 +
solr/bin/solr | 8 +-
solr/bin/solr.cmd | 10 +
.../src/java/org/apache/solr/util/SolrCLI.java | 215 ++++++++++++++++++-
4 files changed, 233 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/df417062/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 001f03e..c7c1370 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -232,6 +232,8 @@ Other Changes
* SOLR-8969: SQLHandler causes NPE in non-cloud mode (Markus Jelsma, Kevin Risden)
+* SOLR-9610: New AssertTool in SolrCLI for easier cross platform assertions from command line (janhoy)
+
================== 6.2.1 ==================
Bug Fixes
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/df417062/solr/bin/solr
----------------------------------------------------------------------
diff --git a/solr/bin/solr b/solr/bin/solr
index ac33cc0..f753d7d 100755
--- a/solr/bin/solr
+++ b/solr/bin/solr
@@ -636,6 +636,12 @@ if [ "$SCRIPT_CMD" == "status" ]; then
exit
fi
+# assert tool
+if [ "$SCRIPT_CMD" == "assert" ]; then
+ run_tool assert $*
+ exit $?
+fi
+
# run a healthcheck and exit if requested
if [ "$SCRIPT_CMD" == "healthcheck" ]; then
@@ -1042,7 +1048,7 @@ if [[ "$SCRIPT_CMD" == "zk" ]]; then
fi
# verify the command given is supported
-if [ "$SCRIPT_CMD" != "stop" ] && [ "$SCRIPT_CMD" != "start" ] && [ "$SCRIPT_CMD" != "restart" ] && [ "$SCRIPT_CMD" != "status" ]; then
+if [ "$SCRIPT_CMD" != "stop" ] && [ "$SCRIPT_CMD" != "start" ] && [ "$SCRIPT_CMD" != "restart" ] && [ "$SCRIPT_CMD" != "status" ] && [ "$SCRIPT_CMD" != "assert" ]; then
print_usage "" "$SCRIPT_CMD is not a valid command!"
exit 1
fi
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/df417062/solr/bin/solr.cmd
----------------------------------------------------------------------
diff --git a/solr/bin/solr.cmd b/solr/bin/solr.cmd
index e1f2ffd..0bfb773 100644
--- a/solr/bin/solr.cmd
+++ b/solr/bin/solr.cmd
@@ -103,6 +103,7 @@ IF "%1"=="status" goto get_info
IF "%1"=="version" goto get_version
IF "%1"=="-v" goto get_version
IF "%1"=="-version" goto get_version
+IF "%1"=="assert" goto run_assert
REM Only allow the command to be the first argument, assume start if not supplied
IF "%1"=="start" goto set_script_cmd
@@ -1076,6 +1077,15 @@ IF NOT DEFINED HEALTHCHECK_ZK_HOST set "HEALTHCHECK_ZK_HOST=localhost:9983"
org.apache.solr.util.SolrCLI healthcheck -collection !HEALTHCHECK_COLLECTION! -zkHost !HEALTHCHECK_ZK_HOST!
goto done
+:run_assert
+"%JAVA%" %SOLR_SSL_OPTS% %SOLR_ZK_CREDS_AND_ACLS% -Dsolr.install.dir="%SOLR_TIP%" -Dlog4j.configuration="file:%DEFAULT_SERVER_DIR%\scripts\cloud-scripts\log4j.properties" ^
+ -classpath "%DEFAULT_SERVER_DIR%\solr-webapp\webapp\WEB-INF\lib\*;%DEFAULT_SERVER_DIR%\lib\ext\*" ^
+ org.apache.solr.util.SolrCLI %*
+if errorlevel 1 (
+ exit /b 1
+)
+goto done
+
:get_version
"%JAVA%" %SOLR_SSL_OPTS% %SOLR_ZK_CREDS_AND_ACLS% -Dsolr.install.dir="%SOLR_TIP%" -Dlog4j.configuration="file:%DEFAULT_SERVER_DIR%\scripts\cloud-scripts\log4j.properties" ^
-classpath "%DEFAULT_SERVER_DIR%\solr-webapp\webapp\WEB-INF\lib\*;%DEFAULT_SERVER_DIR%\lib\ext\*" ^
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/df417062/solr/core/src/java/org/apache/solr/util/SolrCLI.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/util/SolrCLI.java b/solr/core/src/java/org/apache/solr/util/SolrCLI.java
index 574911c..a60620e 100644
--- a/solr/core/src/java/org/apache/solr/util/SolrCLI.java
+++ b/solr/core/src/java/org/apache/solr/util/SolrCLI.java
@@ -30,6 +30,7 @@ import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.nio.file.attribute.FileOwnerAttributeView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -159,7 +160,7 @@ public class SolrCLI {
return toolExitStatus;
}
- private void setBasicAuth(CommandLine cli) throws Exception {
+ protected void setBasicAuth(CommandLine cli) throws Exception {
String basicauth = System.getProperty("basicauth", null);
if (basicauth != null) {
List<String> ss = StrUtils.splitSmart(basicauth, ':');
@@ -367,6 +368,8 @@ public class SolrCLI {
return new ZkCpTool();
else if ("ls".equals(toolType))
return new ZkLsTool();
+ else if ("assert".equals(toolType))
+ return new AssertTool();
// If you add a built-in tool to this class, add it here to avoid
// classpath scanning
@@ -3129,4 +3132,214 @@ public class SolrCLI {
}
} // end RunExampleTool class
+
+ /**
+ * Asserts various conditions and exists with error code if fails, else continues with no output
+ */
+ public static class AssertTool extends ToolBase {
+
+ private static String message = null;
+ private static boolean useExitCode = false;
+
+ public AssertTool() { this(System.out); }
+ public AssertTool(PrintStream stdout) { super(stdout); }
+
+ public String getName() {
+ return "assert";
+ }
+
+ @SuppressWarnings("static-access")
+ public Option[] getOptions() {
+ return new Option[] {
+ OptionBuilder
+ .withDescription("Asserts that we are NOT the root user")
+ .withLongOpt("not-root")
+ .create("R"),
+ OptionBuilder
+ .withDescription("Asserts that we are the root user")
+ .withLongOpt("root")
+ .create("r"),
+ OptionBuilder
+ .withDescription("Asserts that Solr is NOT started on a certain URL")
+ .withLongOpt("not-started")
+ .hasArg(true)
+ .withArgName("url")
+ .create("S"),
+ OptionBuilder
+ .withDescription("Asserts that Solr is started on a certain URL")
+ .withLongOpt("started")
+ .hasArg(true)
+ .withArgName("url")
+ .create("s"),
+ OptionBuilder
+ .withDescription("Asserts that we run as same user that owns <directory>")
+ .withLongOpt("same-user")
+ .hasArg(true)
+ .withArgName("directory")
+ .create("u"),
+ OptionBuilder
+ .withDescription("Asserts that directory <directory> exists")
+ .withLongOpt("exists")
+ .hasArg(true)
+ .withArgName("directory")
+ .create("x"),
+ OptionBuilder
+ .withDescription("Asserts that directory <directory> does NOT exist")
+ .withLongOpt("not-exists")
+ .hasArg(true)
+ .withArgName("directory")
+ .create("X"),
+ OptionBuilder
+ .withDescription("Exception message to be used in place of the default error message")
+ .withLongOpt("message")
+ .hasArg(true)
+ .withArgName("message")
+ .create("m"),
+ OptionBuilder
+ .withDescription("Return an exit code instead of printing error message on assert fail.")
+ .withLongOpt("exitcode")
+ .create("e")
+ };
+ }
+
+ public int runTool(CommandLine cli) throws Exception {
+ verbose = cli.hasOption("verbose");
+
+ int toolExitStatus = 0;
+ try {
+ setBasicAuth(cli);
+ toolExitStatus = runAssert(cli);
+ } catch (Exception exc) {
+ // since this is a CLI, spare the user the stacktrace
+ String excMsg = exc.getMessage();
+ if (excMsg != null) {
+ System.err.println("\nERROR: " + excMsg + "\n");
+ toolExitStatus = 1;
+ } else {
+ throw exc;
+ }
+ }
+ return toolExitStatus;
+ }
+
+ @Override
+ protected void runImpl(CommandLine cli) throws Exception {
+ runAssert(cli);
+ }
+
+ // Custom run method which may return exit code
+ protected int runAssert(CommandLine cli) throws Exception {
+ if (cli.getOptions().length == 0 || cli.getArgs().length > 0 || cli.hasOption("h")) {
+ new HelpFormatter().printHelp("bin/solr assert [-m <message>] [-e] [-rR] [-s <url>] [-S <url>] [-u <dir>] [-x <dir>] [-X <dir>]", getToolOptions(this));
+ return 1;
+ }
+ if (cli.hasOption("m")) {
+ message = cli.getOptionValue("m");
+ }
+ if (cli.hasOption("e")) {
+ useExitCode = true;
+ }
+ if (cli.hasOption("r")) {
+ if (assertRootUser() > 0) return 1;
+ }
+ if (cli.hasOption("R")) {
+ if (assertNotRootUser() > 0) return 1;
+ }
+ if (cli.hasOption("x")) {
+ if (assertFileExists(cli.getOptionValue("x")) > 0) return 1;
+ }
+ if (cli.hasOption("X")) {
+ if (assertFileNotExists(cli.getOptionValue("X")) > 0) return 1;
+ }
+ if (cli.hasOption("u")) {
+ if (sameUser(cli.getOptionValue("u")) > 0) return 1;
+ }
+ if (cli.hasOption("s")) {
+ if (assertSolrRunning(cli.getOptionValue("s")) > 0) return 1;
+ }
+ if (cli.hasOption("s")) {
+ if (assertSolrNotRunning(cli.getOptionValue("S")) > 0) return 1;
+ }
+ return 0;
+ }
+
+ public static int assertSolrRunning(String url) throws Exception {
+ StatusTool status = new StatusTool();
+ try {
+ status.waitToSeeSolrUp(url, 5);
+ } catch (Exception e) {
+ return exitOrException("Solr is not running on url " + url);
+ }
+ return 0;
+ }
+
+ public static int assertSolrNotRunning(String url) throws Exception {
+ StatusTool status = new StatusTool();
+ try {
+ status.waitToSeeSolrUp(url, 5);
+ return exitOrException("Solr is running on url " + url);
+ } catch (Exception e) { return 0; }
+ }
+
+ public static int sameUser(String directory) throws Exception {
+ if (Files.exists(Paths.get(directory))) {
+ String userForDir = userForDir(Paths.get(directory));
+ if (!currentUser().equals(userForDir)) {
+ return exitOrException("Must run as user " + userForDir + ". We are " + currentUser());
+ }
+ } else {
+ return exitOrException("Directory " + directory + " does not exist.");
+ }
+ return 0;
+ }
+
+ public static int assertFileExists(String directory) throws Exception {
+ if (! Files.exists(Paths.get(directory))) {
+ return exitOrException("Directory " + directory + " does not exist.");
+ }
+ return 0;
+ }
+
+ public static int assertFileNotExists(String directory) throws Exception {
+ if (Files.exists(Paths.get(directory))) {
+ return exitOrException("Directory " + directory + " should not exist.");
+ }
+ return 0;
+ }
+
+ public static int assertRootUser() throws Exception {
+ if (!currentUser().equals("root")) {
+ return exitOrException("Must run as root user");
+ }
+ return 0;
+ }
+
+ public static int assertNotRootUser() throws Exception {
+ if (currentUser().equals("root")) {
+ return exitOrException("Not allowed to run as root user");
+ }
+ return 0;
+ }
+
+ public static String currentUser() {
+ return System.getProperty("user.name");
+ }
+
+ public static String userForDir(Path pathToDir) {
+ try {
+ FileOwnerAttributeView ownerAttributeView = Files.getFileAttributeView(pathToDir, FileOwnerAttributeView.class);
+ return ownerAttributeView.getOwner().getName();
+ } catch (IOException e) {
+ return "N/A";
+ }
+ }
+
+ private static int exitOrException(String msg) throws Exception {
+ if (useExitCode) {
+ return 1;
+ } else {
+ throw new Exception(message != null ? message : msg);
+ }
+ }
+ } // end AssertTool class
}