#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# CONTROLLING STARTUP:
#
# TODO: Write instructions here.
#
##### Setup
DEFAULT_X_WHICH=/usr/bin/which
verbose=false
stop_all=false
##### End Setup
#
#----
# DO NOT EDIT BELOW THIS LINE WITHOUT GUIDANCE
#----

# If the variable for the which command isn't set, set
# it to the default.
if [ -z "${X_WHICH}" ]; then
  X_WHICH="${DEFAULT_X_WHICH}"
fi

# Abort if certain required commands are are not found.
if [ ! -x "${X_WHICH}" ]; then
  # last-ditch effort for locating which, will succeed if it's
  # on the path.
  X_WHICH="`which which`"
  RET=$?
  # TODO: Consider only relying on the exit code.
  if [ ${RET} -ne 0 ] || [ ! -x "${X_WHICH}" ]; then
    echo >&2 "The "which" command is not found or not executable."
    echo >&2 "This command is required. Aborting."
    echo >&2 "The X_WHICH env variable can explicitly set its location."
    exit 1
  fi
fi

X_DIRNAME=`"${X_WHICH}" dirname`
# The which command should only return files that are executable,
# so we are only checking that the value is present.
if [ -z "${X_DIRNAME}" ]; then
  echo >&2 "The dirname command is not found or not executable."
  echo >&2 "This command is required. Aborting."
  echo >&2 "The X_DIRNAME env variable can explicitly set its location."
  exit 1
fi

# Figure out where this script is and load function definitions.
# Abort the script if not found.
THIS_SCRIPT="$0"
cd `"${X_DIRNAME}" "${THIS_SCRIPT}"`
SCRIPT_DIR="`pwd`"
SCRIPT_FUNCTIONS="${SCRIPT_DIR}/functions.sh"
if [ -r "${SCRIPT_FUNCTIONS}" ]; then
  . ${SCRIPT_FUNCTIONS}
else
  echo >&2 "Function include file ${SCRIPT_FUNCTIONS} not found or not readable."
  echo >&2 "These functions are critical for script operation. Aborting."
  exit 1
fi

# Exit if bash not found or too old.
exit_if_no_bash
exit_if_bash_too_old

# Running this script from cygwin is not supported.
# If somebody creates a bulletproof implementation,
# This might be reconsidered.
THIS_OS="`uname -s`"
if [ -z "${SOLR_FORCE_FLAG}" ] && [[ "${THIS_OS,,}" = *cygwin* ]]; then
  echo >&2 "This script does not support cygwin."
  echo >&2 "Use the native solr.cmd script on Windows."
  echo >&2 "You can continue by setting SOLR_FORCE_FLAG,"
  echo >&2 "but you'll be in unsupported territory."
  err_msg_contact_community
  exit 1
fi

# If there are other platforms that are not supported, detect above this line.

# Call function to set location variables, including SOLR_TIP.  The
# function will also change the current directory to SOLR_TIP.
find_dirs_and_change_cwd ${SCRIPT_DIR}

# Find required system executables and assign variables to access them.
# Exit the script if something critical is not found.
find_system_programs_or_exit

# Call the included function for locating Java, exit if not found.
find_java_or_exit

# Create and then delete a tempfile for this script run.
# We will then use the filename later in the script.
mkdir -p ${SOLR_TMP_DIR}
RET=$?
if [ ${RET} -ne 0 ]; then
  echo >&2 "Error creating temp directory ${SOLR_TMP_DIR}. Aborting."
  err_msg_contact_community
  exit 1
fi
TMP_FILE=`"${X_TEMPFILE}" -d "${SOLR_TMP_DIR}"`
RET=$?
if [ ${RET} -ne 0 ]; then
  echo >&2 "Unable to create tempfile. Aborting."
  err_msg_contact_community
  exit 1
fi
rm -rf ${TMP_FILE}

# Ask the agent for commands to set environment variables.
# Write the commands to the tempfile, source the file, and
# then delete it.  This step will also do validation of the
# JVM and OS, setting environment variables for further action.
agent_get_env > ${TMP_FILE}
RET=$?
RET=0
if [ ${RET} -ne 0 ]; then
  rm -rf ${TMP_FILE}
  echo >&2 "Error getting env variables from agent. Aborting."
  err_msg_contact_community
  exit 1
fi
. ${TMP_FILE}
rm -rf ${TMP_FILE}

# If set, display generic message from the agent on stdout.
if [ -n "${SOLR_AGENT_MESSAGE}" ]; then
  echo -e "${SOLR_AGENT_MESSAGE}"
fi

# If the environment variables set by the previous step indicate
# exit is required, display the exit message and then exit.
if [ -n "${SOLR_AGENT_NEEDS_EXIT}" ]; then
  echo >&2 -e "${SOLR_AGENT_EXIT_MESSAGE}"
  err_msg_contact_community
  exit 1;
fi

# Call a function to locate the agent properties.  If the function is
# unable to analyze things to decide how to operate, it will abort the
# script.
find_agent_properties_or_exit
