From 83969f44a0e9d4f282fa96f94870a039f9307287 Mon Sep 17 00:00:00 2001 From: Ramkumar Aiyengar Date: Fri, 27 Mar 2015 17:25:05 +0000 Subject: [PATCH] SOLR-7309: Make bin/solr, bin/post work when Solr installation directory contains spaces git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1669628 13f79535-47bb-0310-9956-ffa450edef68 --- solr/CHANGES.txt | 3 + solr/bin/post | 33 +++--- solr/bin/solr | 301 ++++++++++++++++++++++++----------------------- 3 files changed, 176 insertions(+), 161 deletions(-) diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 136df3b7ff2c..80610475695b 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -338,6 +338,9 @@ Bug Fixes * SOLR-7298: Fix Collections API calls (SolrJ) to not add name parameter when not needed. (Shai Erera, Anshum Gupta) +* SOLR-7309: Make bin/solr, bin/post work when Solr installation directory contains spaces + (Ramkumar Aiyengar, Martijn Koster) + Optimizations ---------------------- diff --git a/solr/bin/post b/solr/bin/post index ca91b704e957..ecaac0e55e06 100755 --- a/solr/bin/post +++ b/solr/bin/post @@ -34,7 +34,7 @@ SOLR_TIP=`dirname "$THIS_SCRIPT"`/.. SOLR_TIP=`cd "$SOLR_TIP"; pwd` if [ -n "$SOLR_JAVA_HOME" ]; then - JAVA=$SOLR_JAVA_HOME/bin/java + JAVA="$SOLR_JAVA_HOME/bin/java" elif [ -n "$JAVA_HOME" ]; then for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do if [ -x "$java" ]; then @@ -47,12 +47,12 @@ else fi # test that Java exists and is executable on this server -$JAVA -version >/dev/null 2>&1 || { echo >&2 "Java is required to run this tool! Please install Java 8 or greater before running this script."; exit 1; } +"$JAVA" -version >/dev/null 2>&1 || { echo >&2 "Java is required to run this tool! Please install Java 8 or greater before running this script."; exit 1; } # ===== post specific code -TOOL_JAR=$SOLR_TIP/dist/solr-core-*.jar +TOOL_JAR=("$SOLR_TIP/dist"/solr-core-*.jar) function print_usage() { echo "" @@ -104,8 +104,8 @@ if [[ $# -eq 1 && ("$1" == "-help" || "$1" == "-h" || "$1" == "-usage") ]]; then fi -COLLECTION=$DEFAULT_SOLR_COLLECTION -PROPS="-Dauto=yes" +COLLECTION="$DEFAULT_SOLR_COLLECTION" +PROPS=('-Dauto=yes') RECURSIVE="" FILES=() URLS=() @@ -118,7 +118,7 @@ while [ $# -gt 0 ]; do if [[ -d "$1" ]]; then # Directory # echo "$1: DIRECTORY" - RECURSIVE="-Drecursive=yes" + RECURSIVE=yes FILES+=("$1") elif [[ -f "$1" ]]; then # File @@ -129,12 +129,12 @@ while [ $# -gt 0 ]; do # echo "$1: URL" URLS+=("$1") else - if [[ $1 == -* ]]; then - if [[ $1 == "-c" ]]; then + if [[ "$1" == -* ]]; then + if [[ "$1" == "-c" ]]; then # Special case, pull out collection name shift - COLLECTION=$1 - elif [[ ($1 == "-d" || $1 == "--data" || $1 == "-") ]]; then + COLLECTION="$1" + elif [[ ("$1" == "-d" || "$1" == "--data" || "$1" == "-") ]]; then if [[ -s /dev/stdin ]]; then MODE="stdin" else @@ -148,10 +148,10 @@ while [ $# -gt 0 ]; do fi fi else - key=${1:1} + key="${1:1}" shift # echo "$1: PROP" - PROPS="$PROPS -D$key=$1" + PROPS+=("-D$key=$1") fi else echo -e "\nUnrecognized argument: $1\n" @@ -208,10 +208,13 @@ else PARAMS=("${ARGS[@]}") fi -PROPS="$PROPS -Dc=$COLLECTION -Ddata=$MODE $RECURSIVE" +PROPS+=("-Dc=$COLLECTION" "-Ddata=$MODE") +if [[ -n "$RECURSIVE" ]]; then + PROPS+=('-Drecursive=yes') +fi -echo "$JAVA" -classpath $TOOL_JAR $PROPS org.apache.solr.util.SimplePostTool "${PARAMS[@]}" -"$JAVA" -classpath $TOOL_JAR $PROPS org.apache.solr.util.SimplePostTool "${PARAMS[@]}" +echo "$JAVA" -classpath "${TOOL_JAR[0]}" "${PROPS[@]}" org.apache.solr.util.SimplePostTool "${PARAMS[@]}" +"$JAVA" -classpath "${TOOL_JAR[0]}" "${PROPS[@]}" org.apache.solr.util.SimplePostTool "${PARAMS[@]}" # post smoker: # bin/post -c signals -out yes -type application/json -d '[{"id": 2, "val": 0.47}]' diff --git a/solr/bin/solr b/solr/bin/solr index 090d9fd86e7a..1c47a6268c93 100755 --- a/solr/bin/solr +++ b/solr/bin/solr @@ -50,9 +50,9 @@ verbose=false THIS_OS=`uname -s` if hash jar 2>/dev/null ; then # hash returns true if jar is on the path - UNPACK_WAR_CMD="$(command -v jar) xf" + UNPACK_WAR_CMD=("$(command -v jar)" xf) elif hash unzip 2>/dev/null ; then # hash returns true if unzip is on the path - UNPACK_WAR_CMD="$(command -v unzip) -q" + UNPACK_WAR_CMD=("$(command -v unzip)" -q) else echo -e "This script requires extracting a WAR file with either the jar or unzip utility, please install these utilities or contact your administrator for assistance." exit 1 @@ -81,7 +81,7 @@ done SOLR_TIP=`dirname "$SOLR_SCRIPT"`/.. SOLR_TIP=`cd "$SOLR_TIP"; pwd` -DEFAULT_SERVER_DIR=$SOLR_TIP/server +DEFAULT_SERVER_DIR="$SOLR_TIP/server" # If an include wasn't specified in the environment, then search for one... if [ -z "$SOLR_INCLUDE" ]; then @@ -102,11 +102,11 @@ elif [ -r "$SOLR_INCLUDE" ]; then fi if [ -z "$SOLR_PID_DIR" ]; then - SOLR_PID_DIR=$SOLR_TIP/bin + SOLR_PID_DIR="$SOLR_TIP/bin" fi if [ -n "$SOLR_JAVA_HOME" ]; then - JAVA=$SOLR_JAVA_HOME/bin/java + JAVA="$SOLR_JAVA_HOME/bin/java" elif [ -n "$JAVA_HOME" ]; then for java in "$JAVA_HOME"/bin/amd64/java "$JAVA_HOME"/bin/java; do if [ -x "$java" ]; then @@ -126,7 +126,7 @@ else fi # test that Java exists and is executable on this server -$JAVA -version >/dev/null 2>&1 || { +"$JAVA" -version >/dev/null 2>&1 || { echo >&2 "Java not found, or an error was encountered when running java." echo >&2 "A working Java 8 is required to run Solr!" echo >&2 "Please install Java 8 or fix JAVA_HOME before running this script." @@ -349,7 +349,7 @@ function spinner() { function solr_pid_by_port() { THE_PORT="$1" if [ -e "$SOLR_PID_DIR/solr-$THE_PORT.pid" ]; then - PID=`cat $SOLR_PID_DIR/solr-$THE_PORT.pid` + PID=`cat "$SOLR_PID_DIR/solr-$THE_PORT.pid"` CHECK_PID=`ps auxww | awk '{print $2}' | grep $PID | sort -r | tr -d ' '` if [ "$CHECK_PID" != "" ]; then local solrPID=$PID @@ -379,13 +379,16 @@ function jetty_port() { function run_tool() { # Extract the solr.war if it hasn't been done already (so we can access the SolrCLI class) - if [[ -e $DEFAULT_SERVER_DIR/webapps/solr.war && ! -d "$DEFAULT_SERVER_DIR/solr-webapp/webapp" ]]; then - (mkdir -p $DEFAULT_SERVER_DIR/solr-webapp/webapp && cd $DEFAULT_SERVER_DIR/solr-webapp/webapp && $UNPACK_WAR_CMD $DEFAULT_SERVER_DIR/webapps/solr.war) + if [[ -e "$DEFAULT_SERVER_DIR/webapps/solr.war" && ! -d "$DEFAULT_SERVER_DIR/solr-webapp/webapp" ]]; then + (mkdir -p "$DEFAULT_SERVER_DIR/solr-webapp/webapp" && \ + cd "$DEFAULT_SERVER_DIR/solr-webapp/webapp" && \ + "${UNPACK_WAR_CMD[@]}" "$DEFAULT_SERVER_DIR/webapps/solr.war") fi - - "$JAVA" $SOLR_SSL_OPTS -Dsolr.install.dir=$SOLR_TIP -Dlog4j.configuration=file:$DEFAULT_SERVER_DIR/scripts/cloud-scripts/log4j.properties \ + + "$JAVA" $SOLR_SSL_OPTS -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 $* + org.apache.solr.util.SolrCLI "$@" return $? } # end run_tool function @@ -393,16 +396,16 @@ function run_tool() { # get information about any Solr nodes running on this host function get_info() { # first, see if Solr is running - numSolrs=`find $SOLR_PID_DIR -name "solr-*.pid" -type f | wc -l | tr -d ' '` + numSolrs=`find "$SOLR_PID_DIR" -name "solr-*.pid" -type f | wc -l | tr -d ' '` if [ "$numSolrs" != "0" ]; then echo -e "\nFound $numSolrs Solr nodes: " - for PIDF in `find $SOLR_PID_DIR -name "solr-*.pid" -type f` + find "$SOLR_PID_DIR" -name "solr-*.pid" -type f | while read PIDF do - ID=`cat $PIDF` + ID=`cat "$PIDF"` port=`jetty_port "$ID"` if [ "$port" != "" ]; then echo -e "\nSolr process $ID running on port $port" - run_tool status -solr $SOLR_URL_SCHEME://localhost:$port/solr + run_tool status -solr "$SOLR_URL_SCHEME://localhost:$port/solr" echo "" else echo -e "\nSolr process $ID from $PIDF not found." @@ -419,7 +422,7 @@ function get_info() { if [ "$port" != "" ]; then echo "" echo "Solr process $ID running on port $port" - run_tool status -solr $SOLR_URL_SCHEME://localhost:$port/solr + run_tool status -solr "$SOLR_URL_SCHEME://localhost:$port/solr" echo "" fi done @@ -442,10 +445,10 @@ function stop_solr() { if [ "$SOLR_PID" != "" ]; then echo -e "Sending stop command to Solr running on port $SOLR_PORT ... waiting 5 seconds to allow Jetty process $SOLR_PID to stop gracefully." - $JAVA $SOLR_SSL_OPTS -jar $DIR/start.jar STOP.PORT=$STOP_PORT STOP.KEY=$STOP_KEY --stop || true + "$JAVA" $SOLR_SSL_OPTS -jar "$DIR/start.jar" "STOP.PORT=$STOP_PORT" "STOP.KEY=$STOP_KEY" --stop || true (sleep 5) & spinner $! - rm -f $SOLR_PID_DIR/solr-$SOLR_PORT.pid + rm -f "$SOLR_PID_DIR/solr-$SOLR_PORT.pid" else echo -e "No Solr nodes found to stop." exit 0 @@ -456,7 +459,7 @@ function stop_solr() { echo -e "Solr process $SOLR_PID is still running; forcefully killing it now." kill -9 $SOLR_PID echo "Killed process $SOLR_PID" - rm -f $SOLR_PID_DIR/solr-$SOLR_PORT.pid + rm -f "$SOLR_PID_DIR/solr-$SOLR_PORT.pid" sleep 1 fi @@ -486,7 +489,7 @@ if [ $# -gt 0 ]; then if [[ $1 == -* ]]; then SCRIPT_CMD="start" else - SCRIPT_CMD=$1 + SCRIPT_CMD="$1" shift fi else @@ -507,13 +510,13 @@ if [ "$SCRIPT_CMD" == "healthcheck" ]; then if [ $# -gt 0 ]; then while true; do - case $1 in + case "$1" in -c|-collection) if [[ -z "$2" || "${2:0:1}" == "-" ]]; then print_usage "$SCRIPT_CMD" "Collection name is required when using the $1 option!" exit 1 fi - HEALTHCHECK_COLLECTION=$2 + HEALTHCHECK_COLLECTION="$2" shift 2 ;; -z|-zkhost) @@ -554,7 +557,7 @@ if [ "$SCRIPT_CMD" == "healthcheck" ]; then exit 1 fi - run_tool healthcheck -zkHost $ZK_HOST -collection $HEALTHCHECK_COLLECTION + run_tool healthcheck -zkHost "$ZK_HOST" -collection "$HEALTHCHECK_COLLECTION" exit $? fi @@ -567,13 +570,13 @@ if [[ "$SCRIPT_CMD" == "create" || "$SCRIPT_CMD" == "create_core" || "$SCRIPT_CM if [ $# -gt 0 ]; then while true; do - case $1 in + case "$1" in -c|-core|-collection) if [[ -z "$2" || "${2:0:1}" == "-" ]]; then print_usage "$SCRIPT_CMD" "name is required when using the $1 option!" exit 1 fi - CREATE_NAME=$2 + CREATE_NAME="$2" shift 2 ;; -n|-confname) @@ -637,7 +640,7 @@ if [[ "$SCRIPT_CMD" == "create" || "$SCRIPT_CMD" == "create_core" || "$SCRIPT_CM fi if [ -z "$CREATE_CONFDIR" ]; then - CREATE_CONFDIR=data_driven_schema_configs + CREATE_CONFDIR='data_driven_schema_configs' fi # validate the confdir arg @@ -654,7 +657,7 @@ if [[ "$SCRIPT_CMD" == "create" || "$SCRIPT_CMD" == "create_core" || "$SCRIPT_CM # If not defined, use the collection name for the name of the configuration in ZooKeeper if [ -z "$CREATE_CONFNAME" ]; then - CREATE_CONFNAME=$CREATE_NAME + CREATE_CONFNAME="$CREATE_NAME" fi if [ -z "$CREATE_PORT" ]; then @@ -674,14 +677,14 @@ if [[ "$SCRIPT_CMD" == "create" || "$SCRIPT_CMD" == "create_core" || "$SCRIPT_CM fi if [ "$SCRIPT_CMD" == "create_core" ]; then - run_tool create_core -name $CREATE_NAME -solrUrl $SOLR_URL_SCHEME://localhost:$CREATE_PORT/solr \ - -confdir $CREATE_CONFDIR -configsetsDir $SOLR_TIP/server/solr/configsets + run_tool create_core -name "$CREATE_NAME" -solrUrl "$SOLR_URL_SCHEME://localhost:$CREATE_PORT/solr" \ + -confdir "$CREATE_CONFDIR" -configsetsDir "$SOLR_TIP/server/solr/configsets" exit $? else - run_tool $SCRIPT_CMD -name $CREATE_NAME -shards $CREATE_NUM_SHARDS -replicationFactor $CREATE_REPFACT \ - -confname $CREATE_CONFNAME -confdir $CREATE_CONFDIR \ - -configsetsDir $SOLR_TIP/server/solr/configsets \ - -solrUrl $SOLR_URL_SCHEME://localhost:$CREATE_PORT/solr + run_tool "$SCRIPT_CMD" -name "$CREATE_NAME" -solrUrl "$SOLR_URL_SCHEME://localhost:$CREATE_PORT/solr" \ + -shards "$CREATE_NUM_SHARDS" -replicationFactor "$CREATE_REPFACT" \ + -confname "$CREATE_CONFNAME" -confdir "$CREATE_CONFDIR" \ + -configsetsDir "$SOLR_TIP/server/solr/configsets" exit $? fi fi @@ -691,13 +694,13 @@ if [[ "$SCRIPT_CMD" == "delete" ]]; then if [ $# -gt 0 ]; then while true; do - case $1 in + case "$1" in -c|-core|-collection) if [[ -z "$2" || "${2:0:1}" == "-" ]]; then print_usage "$SCRIPT_CMD" "name is required when using the $1 option!" exit 1 fi - DELETE_NAME=$2 + DELETE_NAME="$2" shift 2 ;; -p|-port) @@ -763,8 +766,8 @@ if [[ "$SCRIPT_CMD" == "delete" ]]; then exit 1 fi - run_tool delete -name $DELETE_NAME -deleteConfig $DELETE_CONFIG \ - -solrUrl $SOLR_URL_SCHEME://localhost:$DELETE_PORT/solr + run_tool delete -name "$DELETE_NAME" -deleteConfig "$DELETE_CONFIG" \ + -solrUrl "$SOLR_URL_SCHEME://localhost:$DELETE_PORT/solr" exit $? fi @@ -777,10 +780,11 @@ fi # Run in foreground (default is to run in the background) FG="false" noprompt=false +SOLR_OPTS=() if [ $# -gt 0 ]; then while true; do - case $1 in + case "$1" in -c|-cloud) SOLR_MODE="solrcloud" shift @@ -792,17 +796,17 @@ if [ $# -gt 0 ]; then fi if [[ "$2" == "." || "$2" == "./" || "$2" == ".." || "$2" == "../" ]]; then - SOLR_SERVER_DIR=`pwd`/$2 + SOLR_SERVER_DIR="$(pwd)/$2" else # see if the arg value is relative to the tip vs full path - if [[ $2 != /* ]] && [[ -d "$SOLR_TIP/$2" ]]; then + if [[ "$2" != /* ]] && [[ -d "$SOLR_TIP/$2" ]]; then SOLR_SERVER_DIR="$SOLR_TIP/$2" else SOLR_SERVER_DIR="$2" fi fi # resolve it to an absolute path - SOLR_SERVER_DIR=`cd "$SOLR_SERVER_DIR"; pwd` + SOLR_SERVER_DIR="$(cd "$SOLR_SERVER_DIR"; pwd)" shift 2 ;; -s|-solr.home) @@ -890,7 +894,7 @@ if [ $# -gt 0 ]; then *) if [ "${1:0:2}" == "-D" ]; then # pass thru any opts that begin with -D (java system props) - SOLR_OPTS="$SOLR_OPTS $1" + SOLR_OPTS+=("$1") shift else if [ "$1" != "" ]; then @@ -908,17 +912,17 @@ fi if $verbose ; then echo "Using Solr root directory: $SOLR_TIP" echo "Using Java: $JAVA" - $JAVA -version + "$JAVA" -version fi if [ "$SOLR_HOST" != "" ]; then - SOLR_HOST_ARG="-Dhost=$SOLR_HOST" + SOLR_HOST_ARG=("-Dhost=$SOLR_HOST") else - SOLR_HOST_ARG="" + SOLR_HOST_ARG=() fi if [ -z "$SOLR_SERVER_DIR" ]; then - SOLR_SERVER_DIR=$DEFAULT_SERVER_DIR + SOLR_SERVER_DIR="$DEFAULT_SERVER_DIR" fi if [ ! -e "$SOLR_SERVER_DIR" ]; then @@ -990,12 +994,12 @@ if [ "$EXAMPLE" != "" ]; then fi # setup a unqiue solr.solr.home directory for each node - CLOUD_EXAMPLE_DIR=$SOLR_TIP/example/cloud + CLOUD_EXAMPLE_DIR="$SOLR_TIP/example/cloud" if [ ! -d "$CLOUD_EXAMPLE_DIR/node1/solr" ]; then echo "Creating Solr home directory $CLOUD_EXAMPLE_DIR/node1/solr" - mkdir -p $CLOUD_EXAMPLE_DIR/node1/solr - cp $DEFAULT_SERVER_DIR/solr/solr.xml $CLOUD_EXAMPLE_DIR/node1/solr/ - cp $DEFAULT_SERVER_DIR/solr/zoo.cfg $CLOUD_EXAMPLE_DIR/node1/solr/ + mkdir -p "$CLOUD_EXAMPLE_DIR/node1/solr" + cp "$DEFAULT_SERVER_DIR/solr/solr.xml" "$CLOUD_EXAMPLE_DIR/node1/solr/" + cp "$DEFAULT_SERVER_DIR/solr/zoo.cfg" "$CLOUD_EXAMPLE_DIR/node1/solr/" fi for (( s=1; s<$CLOUD_NUM_NODES; s++ )) @@ -1003,23 +1007,23 @@ if [ "$EXAMPLE" != "" ]; then ndx=$[$s+1] if [ ! -d "$CLOUD_EXAMPLE_DIR/node$ndx" ]; then echo "Cloning Solr home directory $CLOUD_EXAMPLE_DIR/node1 into $CLOUD_EXAMPLE_DIR/node$ndx" - cp -r $CLOUD_EXAMPLE_DIR/node1 $CLOUD_EXAMPLE_DIR/node$ndx + cp -r "$CLOUD_EXAMPLE_DIR/node1" "$CLOUD_EXAMPLE_DIR/node$ndx" fi done SOLR_MODE="solrcloud" SOLR_SERVER_DIR="$SOLR_TIP/server" SOLR_HOME="$CLOUD_EXAMPLE_DIR/node1/solr" - SOLR_PORT=${CLOUD_PORTS[0]} + SOLR_PORT="${CLOUD_PORTS[0]}" shift ;; techproducts) SOLR_HOME="$SOLR_TIP/example/techproducts/solr" - mkdir -p $SOLR_HOME + mkdir -p "$SOLR_HOME" if [ ! -f "$SOLR_HOME/solr.xml" ]; then - cp $DEFAULT_SERVER_DIR/solr/solr.xml $SOLR_HOME/solr.xml - cp $DEFAULT_SERVER_DIR/solr/zoo.cfg $SOLR_HOME/zoo.cfg + cp "$DEFAULT_SERVER_DIR/solr/solr.xml" "$SOLR_HOME/solr.xml" + cp "$DEFAULT_SERVER_DIR/solr/zoo.cfg" "$SOLR_HOME/zoo.cfg" fi - EXAMPLE_CONFIGSET=sample_techproducts_configs + EXAMPLE_CONFIGSET='sample_techproducts_configs' shift ;; dih) @@ -1028,12 +1032,12 @@ if [ "$EXAMPLE" != "" ]; then ;; schemaless) SOLR_HOME="$SOLR_TIP/example/schemaless/solr" - mkdir -p $SOLR_HOME + mkdir -p "$SOLR_HOME" if [ ! -f "$SOLR_HOME/solr.xml" ]; then - cp $DEFAULT_SERVER_DIR/solr/solr.xml $SOLR_HOME/solr.xml - cp $DEFAULT_SERVER_DIR/solr/zoo.cfg $SOLR_HOME/zoo.cfg + cp "$DEFAULT_SERVER_DIR/solr/solr.xml" "$SOLR_HOME/solr.xml" + cp "$DEFAULT_SERVER_DIR/solr/zoo.cfg" "$SOLR_HOME/zoo.cfg" fi - EXAMPLE_CONFIGSET=data_driven_schema_configs + EXAMPLE_CONFIGSET='data_driven_schema_configs' shift ;; *) @@ -1043,39 +1047,40 @@ if [ "$EXAMPLE" != "" ]; then esac fi -if [[ "$FG" == "true" && "$EXAMPLE" != "" ]]; then - FG="false" +if [[ "$FG" == 'true' && "$EXAMPLE" != "" ]]; then + FG='false' echo -e "\nWARNING: Foreground mode (-f) not supported when running examples.\n" fi if [ -z "$STOP_KEY" ]; then - STOP_KEY="solrrocks" + STOP_KEY='solrrocks' fi # stop all if no port specified if [[ "$SCRIPT_CMD" == "stop" && -z "$SOLR_PORT" ]]; then if $stop_all; then none_stopped=true - for PIDF in `find $SOLR_PID_DIR -name "solr-*.pid" -type f` + find "$SOLR_PID_DIR" -name "solr-*.pid" -type f | while read PIDF do - NEXT_PID=`cat $PIDF` + NEXT_PID=`cat "$PIDF"` port=`jetty_port "$NEXT_PID"` if [ "$port" != "" ]; then stop_solr "$SOLR_SERVER_DIR" "$port" "$STOP_KEY" "$NEXT_PID" none_stopped=false fi - rm -f $PIDF + rm -f "$PIDF" done + # TODO: This doesn't get reflected across the subshell if $none_stopped; then echo -e "\nNo Solr nodes found to stop.\n" fi else # not stopping all and don't have a port, but if we can find the pid file for the default port 8983, then use that none_stopped=true - numSolrs=`find $SOLR_PID_DIR -name "solr-*.pid" -type f | wc -l | tr -d ' '` + numSolrs=`find "$SOLR_PID_DIR" -name "solr-*.pid" -type f | wc -l | tr -d ' '` if [ $numSolrs -eq 1 ]; then # only do this if there is only 1 node running, otherwise they must provide the -p or -all - PID=`find $SOLR_PID_DIR -name "solr-*.pid" -type f -exec cat {} \;` + PID="$(cat "$(find "$SOLR_PID_DIR" -name "solr-*.pid" -type f)")" CHECK_PID=`ps auxww | awk '{print $2}' | grep $PID | sort -r | tr -d ' '` if [ "$CHECK_PID" != "" ]; then port=`jetty_port "$CHECK_PID"` @@ -1099,7 +1104,7 @@ if [[ "$SCRIPT_CMD" == "stop" && -z "$SOLR_PORT" ]]; then fi if [ -z "$SOLR_PORT" ]; then - SOLR_PORT="8983" + SOLR_PORT=8983 fi if [ -z "$STOP_PORT" ]; then @@ -1142,25 +1147,26 @@ if [ -z "$SOLR_HOME" ]; then else if [[ $SOLR_HOME != /* ]] && [[ -d "$SOLR_SERVER_DIR/$SOLR_HOME" ]]; then SOLR_HOME="$SOLR_SERVER_DIR/$SOLR_HOME" - SOLR_PID_DIR=$SOLR_HOME + SOLR_PID_DIR="$SOLR_HOME" elif [[ $SOLR_HOME != /* ]] && [[ -d "`pwd`/$SOLR_HOME" ]]; then - SOLR_HOME="`pwd`/$SOLR_HOME" + SOLR_HOME="$(pwd)/$SOLR_HOME" fi fi # This is quite hacky, but examples rely on a different log4j.properties # so that we can write logs for examples to $SOLR_HOME/../logs if [ -z "$SOLR_LOGS_DIR" ]; then - SOLR_LOGS_DIR=$SOLR_SERVER_DIR/logs + SOLR_LOGS_DIR="$SOLR_SERVER_DIR/logs" fi -EXAMPLE_DIR=$SOLR_TIP/example -if [ "${SOLR_HOME:0:${#EXAMPLE_DIR}}" = $EXAMPLE_DIR ]; then - LOG4J_PROPS=$EXAMPLE_DIR/resources/log4j.properties - SOLR_LOGS_DIR=$SOLR_HOME/../logs +EXAMPLE_DIR="$SOLR_TIP/example" +if [ "${SOLR_HOME:0:${#EXAMPLE_DIR}}" = "$EXAMPLE_DIR" ]; then + LOG4J_PROPS="$EXAMPLE_DIR/resources/log4j.properties" + SOLR_LOGS_DIR="$SOLR_HOME/../logs" fi +LOG4J_CONFIG=() if [ -n "$LOG4J_PROPS" ]; then - LOG4J_CONFIG="-Dlog4j.configuration=file:$LOG4J_PROPS" + LOG4J_CONFIG+=("-Dlog4j.configuration=file:$LOG4J_PROPS") fi if [ "$SCRIPT_CMD" == "stop" ]; then @@ -1180,45 +1186,47 @@ if [ ! -e "$SOLR_HOME/solr.xml" ]; then fi # backup the log files before starting -if [ -f $SOLR_LOGS_DIR/solr.log ]; then +if [ -f "$SOLR_LOGS_DIR/solr.log" ]; then if $verbose ; then echo "Backing up $SOLR_LOGS_DIR/solr.log" fi - mv $SOLR_LOGS_DIR/solr.log $SOLR_LOGS_DIR/solr_log_`date +"%Y%m%d_%H%M"` + mv "$SOLR_LOGS_DIR/solr.log" "$SOLR_LOGS_DIR/solr_log_$(date +"%Y%m%d_%H%M")" fi -if [ -f $SOLR_LOGS_DIR/solr_gc.log ]; then +if [ -f "$SOLR_LOGS_DIR/solr_gc.log" ]; then if $verbose ; then echo "Backing up $SOLR_LOGS_DIR/solr_gc.log" fi - mv $SOLR_LOGS_DIR/solr_gc.log $SOLR_LOGS_DIR/solr_gc_log_`date +"%Y%m%d_%H%M"` + mv "$SOLR_LOGS_DIR/solr_gc.log" "$SOLR_LOGS_DIR/solr_gc_log_$(date +"%Y%m%d_%H%M")" fi # if verbose gc logging enabled, setup the location of the log file if [ "$GC_LOG_OPTS" != "" ]; then - GC_LOG_OPTS="$GC_LOG_OPTS -Xloggc:$SOLR_LOGS_DIR/solr_gc.log" + GC_LOG_OPTS=($GC_LOG_OPTS "-Xloggc:$SOLR_LOGS_DIR/solr_gc.log") +else + GC_LOG_OPTS=() fi -if [ "$SOLR_MODE" == "solrcloud" ]; then +if [ "$SOLR_MODE" == 'solrcloud' ]; then if [ -z "$ZK_CLIENT_TIMEOUT" ]; then ZK_CLIENT_TIMEOUT="15000" fi - CLOUD_MODE_OPTS="-DzkClientTimeout=$ZK_CLIENT_TIMEOUT" + CLOUD_MODE_OPTS=("-DzkClientTimeout=$ZK_CLIENT_TIMEOUT") if [ "$ZK_HOST" != "" ]; then - CLOUD_MODE_OPTS="$CLOUD_MODE_OPTS -DzkHost=$ZK_HOST" + CLOUD_MODE_OPTS+=("-DzkHost=$ZK_HOST") else if $verbose ; then echo "Configuring SolrCloud to launch an embedded ZooKeeper using -DzkRun" fi - CLOUD_MODE_OPTS="$CLOUD_MODE_OPTS -DzkRun" + CLOUD_MODE_OPTS+=('-DzkRun') fi # and if collection1 needs to be bootstrapped if [ -e "$SOLR_HOME/collection1/core.properties" ]; then - CLOUD_MODE_OPTS="$CLOUD_MODE_OPTS -Dbootstrap_confdir=./solr/collection1/conf -Dcollection.configName=myconf -DnumShards=1" + CLOUD_MODE_OPTS+=('-Dbootstrap_confdir=./solr/collection1/conf' '-Dcollection.configName=myconf' '-DnumShards=1') fi fi @@ -1227,34 +1235,35 @@ fi if [ "$ENABLE_REMOTE_JMX_OPTS" == "true" ]; then if [ -z "$RMI_PORT" ]; then - RMI_PORT=1$SOLR_PORT + RMI_PORT="1$SOLR_PORT" fi - REMOTE_JMX_OPTS="-Dcom.sun.management.jmxremote \ --Dcom.sun.management.jmxremote.local.only=false \ --Dcom.sun.management.jmxremote.ssl=false \ --Dcom.sun.management.jmxremote.authenticate=false \ --Dcom.sun.management.jmxremote.port=$RMI_PORT \ --Dcom.sun.management.jmxremote.rmi.port=$RMI_PORT" + REMOTE_JMX_OPTS=('-Dcom.sun.management.jmxremote' \ + '-Dcom.sun.management.jmxremote.local.only=false' \ + '-Dcom.sun.management.jmxremote.ssl=false' \ + '-Dcom.sun.management.jmxremote.authenticate=false' \ + "-Dcom.sun.management.jmxremote.port=$RMI_PORT" \ + "-Dcom.sun.management.jmxremote.rmi.port=$RMI_PORT") # if the host is set, then set that as the rmi server hostname if [ "$SOLR_HOST" != "" ]; then - REMOTE_JMX_OPTS="$REMOTE_JMX_OPTS -Djava.rmi.server.hostname=$SOLR_HOST" + REMOTE_JMX_OPTS+=("-Djava.rmi.server.hostname=$SOLR_HOST") fi else - REMOTE_JMX_OPTS="" + REMOTE_JMX_OPTS=() fi +SOLR_JAVA_MEM=() if [ "$SOLR_HEAP" != "" ]; then - SOLR_JAVA_MEM="-Xms$SOLR_HEAP -Xmx$SOLR_HEAP" + SOLR_JAVA_MEM=("-Xms$SOLR_HEAP" "-Xmx$SOLR_HEAP") fi if [ -z "$SOLR_JAVA_MEM" ]; then - SOLR_JAVA_MEM="-Xms512m -Xmx512m" + SOLR_JAVA_MEM=('-Xms512m' '-Xmx512m') fi if [ -z "$SOLR_TIMEZONE" ]; then - SOLR_TIMEZONE="UTC" + SOLR_TIMEZONE='UTC' fi # Launches Solr in foreground/background depending on parameters @@ -1265,14 +1274,15 @@ function launch_solr() { SOLR_ADDL_ARGS="$2" + GC_TUNE=($GC_TUNE) # deal with Java version specific GC and other flags - JAVA_VERSION=`echo "$($JAVA -version 2>&1)" | grep "java version" | awk '{ print substr($3, 2, length($3)-2); }'` + JAVA_VERSION=`echo "$("$JAVA" -version 2>&1)" | grep "java version" | awk '{ print substr($3, 2, length($3)-2); }'` if [ "${JAVA_VERSION:0:3}" == "1.7" ]; then # Specific Java version hacking - GC_TUNE="$GC_TUNE -XX:CMSFullGCsBeforeCompaction=1 -XX:CMSTriggerPermRatio=80" + GC_TUNE+=('-XX:CMSFullGCsBeforeCompaction=1' '-XX:CMSTriggerPermRatio=80') JAVA_MINOR_VERSION=${JAVA_VERSION:(-2)} if [[ $JAVA_MINOR_VERSION -ge 40 && $JAVA_MINOR_VERSION -le 51 ]]; then - GC_TUNE="$GC_TUNE -XX:-UseSuperWord" + GC_TUNE+=('-XX:-UseSuperWord') echo -e "\nWARNING: Java version $JAVA_VERSION has known bugs with Lucene and requires the -XX:-UseSuperWord flag. Please consider upgrading your JVM.\n" fi fi @@ -1284,7 +1294,7 @@ function launch_solr() { if [ -n "$SOLR_SSL_PORT" ]; then SSL_PORT_PROP="-Djetty.ssl.port=$SOLR_SSL_PORT" fi - SOLR_OPTS="$SOLR_OPTS $SOLR_SSL_OPTS $SSL_PORT_PROP" + SOLR_OPTS+=($SOLR_SSL_OPTS "$SSL_PORT_PROP") fi if $verbose ; then @@ -1320,37 +1330,35 @@ function launch_solr() { fi # need to launch solr from the server dir - cd $SOLR_SERVER_DIR + cd "$SOLR_SERVER_DIR" if [ ! -e "$SOLR_SERVER_DIR/start.jar" ]; then echo -e "\nERROR: start.jar file not found in $SOLR_SERVER_DIR!\nPlease check your -d parameter to set the correct Solr server directory.\n" exit 1 fi - SOLR_START_OPTS="-server -Xss256k $SOLR_JAVA_MEM $GC_TUNE $GC_LOG_OPTS $REMOTE_JMX_OPTS \ - $CLOUD_MODE_OPTS \ --Djetty.home=$SOLR_SERVER_DIR --DSTOP.PORT=$stop_port -DSTOP.KEY=$STOP_KEY \ -$SOLR_HOST_ARG -Djetty.port=$SOLR_PORT \ --Dsolr.solr.home=$SOLR_HOME \ --Dsolr.install.dir=$SOLR_TIP \ --Duser.timezone=$SOLR_TIMEZONE \ -$LOG4J_CONFIG \ -$SOLR_OPTS" - + SOLR_START_OPTS=('-server' '-Xss256k' "${SOLR_JAVA_MEM[@]}" "${GC_TUNE[@]}" "${GC_LOG_OPTS[@]}" \ + "${REMOTE_JMX_OPTS[@]}" "${CLOUD_MODE_OPTS[@]}" \ + "-Djetty.port=$SOLR_PORT" "-DSTOP.PORT=$stop_port" "-DSTOP.KEY=$STOP_KEY" \ + "${SOLR_HOST_ARG[@]}" "-Duser.timezone=$SOLR_TIMEZONE" \ + "-Djetty.home=$SOLR_SERVER_DIR" "-Dsolr.solr.home=$SOLR_HOME" "-Dsolr.install.dir=$SOLR_TIP" \ + "${LOG4J_CONFIG[@]}" "${SOLR_OPTS[@]}") + if [ "$SOLR_MODE" == "solrcloud" ]; then IN_CLOUD_MODE=" in SolrCloud mode" fi - mkdir -p $SOLR_LOGS_DIR + mkdir -p "$SOLR_LOGS_DIR" if [ "$run_in_foreground" == "true" ]; then echo -e "\nStarting Solr$IN_CLOUD_MODE on port $SOLR_PORT from $SOLR_SERVER_DIR\n" - $JAVA $SOLR_START_OPTS $SOLR_ADDL_ARGS -jar start.jar + "$JAVA" "${SOLR_START_OPTS[@]}" $SOLR_ADDL_ARGS -jar start.jar else # run Solr in the background - nohup $JAVA $SOLR_START_OPTS $SOLR_ADDL_ARGS -XX:OnOutOfMemoryError="$SOLR_TIP/bin/oom_solr.sh $SOLR_PORT $SOLR_LOGS_DIR" -jar start.jar 1>$SOLR_LOGS_DIR/solr-$SOLR_PORT-console.log 2>&1 & echo $! > $SOLR_PID_DIR/solr-$SOLR_PORT.pid - + nohup "$JAVA" "${SOLR_START_OPTS[@]}" $SOLR_ADDL_ARGS -jar start.jar \ + "-XX:OnOutOfMemoryError=$SOLR_TIP/bin/oom_solr.sh $SOLR_PORT $SOLR_LOGS_DIR" \ + 1>"$SOLR_LOGS_DIR/solr-$SOLR_PORT-console.log" 2>&1 & echo $! > "$SOLR_PID_DIR/solr-$SOLR_PORT.pid" + # no lsof on cygwin though if hash lsof 2>/dev/null ; then # hash returns true if lsof is on the path echo -n "Waiting to see Solr listening on port $SOLR_PORT" @@ -1365,13 +1373,13 @@ $SOLR_OPTS" loops=$[$loops+1] else echo -e "Still not seeing Solr listening on $SOLR_PORT after 30 seconds!" - tail -30 $SOLR_LOGS_DIR/solr.log - exit; + tail -30 "$SOLR_LOGS_DIR/solr.log" + exit fi else SOLR_PID=`ps auxww | grep start\.jar | grep $SOLR_PORT | grep -v grep | awk '{print $2}' | sort -r` echo -e "\nStarted Solr server on port $SOLR_PORT (pid=$SOLR_PID). Happy searching!\n" - exit; + exit fi done) & spinner $! @@ -1392,19 +1400,20 @@ if [ "$EXAMPLE" != "cloud" ]; then if [ "$EXAMPLE" == "schemaless" ]; then EXAMPLE_NAME=gettingstarted else - EXAMPLE_NAME=$EXAMPLE + EXAMPLE_NAME="$EXAMPLE" fi - run_tool create -name $EXAMPLE_NAME -shards 1 -replicationFactor 1 \ - -confname $EXAMPLE_NAME -confdir $EXAMPLE_CONFIGSET \ - -configsetsDir $SOLR_TIP/server/solr/configsets -solrUrl $SOLR_URL_SCHEME://localhost:$SOLR_PORT/solr + run_tool create -name "$EXAMPLE_NAME" -shards 1 -replicationFactor 1 \ + -confname "$EXAMPLE_NAME" -confdir "$EXAMPLE_CONFIGSET" \ + -configsetsDir "$SOLR_TIP/server/solr/configsets" -solrUrl $SOLR_URL_SCHEME://localhost:$SOLR_PORT/solr if [ $? -ne 0 ]; then exit 1 fi if [ "$EXAMPLE" == "techproducts" ]; then echo "Indexing tech product example docs from $SOLR_TIP/example/exampledocs" - "$JAVA" $SOLR_SSL_OPTS -Durl=$SOLR_URL_SCHEME://localhost:$SOLR_PORT/solr/$EXAMPLE/update -jar $SOLR_TIP/example/exampledocs/post.jar $SOLR_TIP/example/exampledocs/*.xml + "$JAVA" $SOLR_SSL_OPTS -Durl="$SOLR_URL_SCHEME://localhost:$SOLR_PORT/solr/$EXAMPLE/update" \ + -jar "$SOLR_TIP/example/exampledocs/post.jar" "$SOLR_TIP/example/exampledocs"/*.xml fi echo -e "\nSolr $EXAMPLE example launched successfully. Direct your Web browser to $SOLR_URL_SCHEME://localhost:$SOLR_PORT/solr to visit the Solr Admin UI\n" @@ -1413,9 +1422,9 @@ else # # SolrCloud example is a bit involved so needs special handling here # - SOLR_SERVER_DIR=$SOLR_TIP/server - SOLR_HOME=$SOLR_TIP/example/cloud/node1/solr - SOLR_PORT=${CLOUD_PORTS[0]} + SOLR_SERVER_DIR="$SOLR_TIP/server" + SOLR_HOME="$SOLR_TIP/example/cloud/node1/solr" + SOLR_PORT="${CLOUD_PORTS[0]}" if [ "$ZK_HOST" != "" ]; then DASHZ="-z $ZK_HOST" @@ -1436,46 +1445,46 @@ else launch_solr "false" "$ADDITIONAL_CMD_OPTS" # if user did not define a specific -z parameter, assume embedded in first cloud node we launched above - zk_host=$ZK_HOST + zk_host="$ZK_HOST" if [ -z "$zk_host" ]; then zk_port=$[$SOLR_PORT+1000] - zk_host=localhost:$zk_port + zk_host="localhost:$zk_port" fi for (( s=1; s<$CLOUD_NUM_NODES; s++ )) do ndx=$[$s+1] - next_port=${CLOUD_PORTS[$s]} + next_port="${CLOUD_PORTS[$s]}" echo -e "\n\nStarting node$ndx on port $next_port using command:\n" echo -e "solr start -cloud -s example/cloud/node$ndx/solr -p $next_port -z $zk_host $DASHM $DASHA \n\n" # call this script again with correct args for next node - $SOLR_TIP/bin/solr start -cloud -s $SOLR_TIP/example/cloud/node$ndx/solr -p $next_port -z $zk_host $DASHM $DASHA + "$SOLR_TIP/bin/solr" start -cloud -s "$SOLR_TIP/example/cloud/node$ndx/solr" -p "$next_port" -z "$zk_host" $DASHM $DASHA done # TODO: better (shorter) name?? - CLOUD_COLLECTION=gettingstarted + CLOUD_COLLECTION='gettingstarted' if $noprompt ; then CLOUD_NUM_SHARDS=2 CLOUD_REPFACT=2 - CLOUD_CONFIG=data_driven_schema_configs + CLOUD_CONFIG='data_driven_schema_configs' else echo -e "\nNow let's create a new collection for indexing documents in your $CLOUD_NUM_NODES-node cluster.\n" read -e -p "Please provide a name for your new collection: [gettingstarted] " USER_INPUT # trim whitespace out of the user input - CLOUD_COLLECTION=`echo $USER_INPUT | tr -d ' '` + CLOUD_COLLECTION=`echo "$USER_INPUT" | tr -d ' '` # handle the default selection or empty input if [ -z "$CLOUD_COLLECTION" ]; then - CLOUD_COLLECTION=gettingstarted + CLOUD_COLLECTION='gettingstarted' fi echo $CLOUD_COLLECTION USER_INPUT= read -e -p "How many shards would you like to split $CLOUD_COLLECTION into? [2] " USER_INPUT # trim whitespace out of the user input - CLOUD_NUM_SHARDS=`echo $USER_INPUT | tr -d ' '` - + CLOUD_NUM_SHARDS=`echo "$USER_INPUT" | tr -d ' '` + # handle the default selection or empty input if [ -z "$CLOUD_NUM_SHARDS" ]; then CLOUD_NUM_SHARDS=2 @@ -1499,11 +1508,11 @@ else while true do # trim whitespace out of the user input - CLOUD_CONFIG=`echo $USER_INPUT | tr -d ' '` + CLOUD_CONFIG=`echo "$USER_INPUT" | tr -d ' '` # handle the default selection or empty input if [ -z "$CLOUD_CONFIG" ]; then - CLOUD_CONFIG=data_driven_schema_configs + CLOUD_CONFIG='data_driven_schema_configs' fi # validate the confdir arg @@ -1518,9 +1527,9 @@ else fi - run_tool create_collection -name $CLOUD_COLLECTION -shards $CLOUD_NUM_SHARDS -replicationFactor $CLOUD_REPFACT \ - -confname $CLOUD_COLLECTION -confdir $CLOUD_CONFIG \ - -configsetsDir $SOLR_TIP/server/solr/configsets -solrUrl $SOLR_URL_SCHEME://localhost:$SOLR_PORT/solr + run_tool create_collection -name "$CLOUD_COLLECTION" -shards $CLOUD_NUM_SHARDS -replicationFactor $CLOUD_REPFACT \ + -confname "$CLOUD_COLLECTION" -confdir "$CLOUD_CONFIG" \ + -configsetsDir "$SOLR_TIP/server/solr/configsets" -solrUrl "$SOLR_URL_SCHEME://localhost:$SOLR_PORT/solr" echo -e "\n\nSolrCloud example running, please visit $SOLR_URL_SCHEME://localhost:$SOLR_PORT/solr \n\n" fi