#!/bin/bash

BIGTOP_DEFAULTS_DIR=${BIGTOP_DEFAULTS_DIR-/etc/default}
[ -n "${BIGTOP_DEFAULTS_DIR}" -a -r ${BIGTOP_DEFAULTS_DIR}/solr ] && . ${BIGTOP_DEFAULTS_DIR}/solr

# Autodetect JAVA_HOME if not defined
if [ -e /usr/lib/bigtop-utils/bigtop-detect-javahome ]; then
  . /usr/lib/bigtop-utils/bigtop-detect-javahome
fi

# resolve links - $0 may be a softlink
PRG="${BASH_SOURCE[0]}"

while [ -h "${PRG}" ]; do
  ls=`ls -ld "${PRG}"`
  link=`expr "$ls" : '.*-> \(.*\)$'`
  if expr "$link" : '/.*' > /dev/null; then
    PRG="$link"
  else
    PRG=`dirname "${PRG}"`/"$link"
  fi
done

BASEDIR=`dirname ${PRG}`
BASEDIR=`cd ${BASEDIR}/..;pwd`

SOLR_PORT=${SOLR_PORT:-8983}
SOLR_ADMIN_PORT=${SOLR_ADMIN_PORT:-8984}
SOLR_MAX_CONNECTOR_THREAD=${SOLR_MAX_CONNECTOR_THREAD:-10000}
SOLR_LOG=${SOLR_LOG:-/var/log/solr}
SOLR_TOMCAT_BACKLOG=${SOLR_TOMCAT_BACKLOG:-4096}
SOLR_TOMCAT_CONNECTION_TIMEOUT=${SOLR_TOMCAT_CONNECTION_TIMEOUT:-180000}
SOLR_TOMCAT_KEEP_ALIVE_TIMEOUT=${SOLR_TOMCAT_KEEP_ALIVE_TIMEOUT:-600000}
SOLR_TOMCAT_MAX_KEEP_ALIVE_REQUESTS=${SOLR_TOMCAT_MAX_KEEP_ALIVE_REQUESTS:--1}
SOLR_TOMCAT_CONNECTION_LINGER=${SOLR_TOMCAT_CONNECTION_LINGER:-300}
SOLR_TOMCAT_BUFFER_SIZE={SOLR_TOMCAT_BUFFER_SIZE:-131072}
SOLR_HOME=${SOLR_HOME:-/var/lib/solr}
SOLR_LOG4J_CONFIG=${SOLR_LOG4J_CONFIG:-/etc/solr/conf/log4j.properties}

export CATALINA_HOME=${CATALINA_HOME:-$BASEDIR/../bigtop-tomcat}
export CATALINA_BASE=/var/lib/solr/tomcat-deployment

export CATALINA_TMPDIR=${SOLR_DATA:-/var/lib/solr/}
export CATALINA_PID=${SOLR_RUN:-/var/run/solr}/solr.pid
export CATALINA_OUT=${SOLR_LOG:-/var/log/solr}/solr.out

die() {
  echo "$@" >&2
  exit 1
}

tomcat_set_prop() {
  if [ -z "${CATALINA_PROPERTIES}" ]; then
    if [ ! -e "${CATALINA_BASE}" ]; then
      echo "Can't find Catalina Base ${CATALINA_BASE}"
      exit 1
    fi
    CATALINA_PROPERTIES="${CATALINA_BASE}/conf/catalina.properties"
    if [ ! -e "${CATALINA_PROPERTIES}" ]; then
      echo "Error: can't find ${CATALINA_PROPERTIES}"
      exit 1
    fi
  fi
  echo "$@" >> "${CATALINA_PROPERTIES}"
}

# Preflight checks (required only during startup) :
# 1. We are only supporting SolrCloud mode
if ([ "$1" = "start" -o "$1" = "run" ]) && [ -z "$SOLR_ZK_ENSEMBLE" ] ; then
  die "Error: SOLR_ZK_ENSEMBLE is not set in /etc/default/solr"
fi

# If Solr is started using "run" command, then the pid file is not generated.
# Hence if we can't find the file, we assume that it was started using run method.
if [ "$1" == "stop" ] && [ ! -f "$CATALINA_PID" ]; then
  echo "$CATALINA_PID file not found. Unsetting CATALINA_PID enviornment variable"
  unset CATALINA_PID
fi

CATALINA_OPTS="${CATALINA_OPTS} -DzkHost=${SOLR_ZK_ENSEMBLE} -Dsolr.solrxml.location=zookeeper"

if [ -n "$SOLR_HDFS_HOME" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.hdfs.home=${SOLR_HDFS_HOME}"
fi

if [ -n "$SOLR_HDFS_CONFIG" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.hdfs.confdir=${SOLR_HDFS_CONFIG}"
fi

if [ "$SOLR_KERBEROS_ENABLED" == "true" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.hdfs.security.kerberos.enabled=${SOLR_KERBEROS_ENABLED}"
fi

if [ -n "$SOLR_KERBEROS_KEYTAB" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.hdfs.security.kerberos.keytabfile=${SOLR_KERBEROS_KEYTAB}"
fi

if [ -n "$SOLR_KERBEROS_PRINCIPAL" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.hdfs.security.kerberos.principal=${SOLR_KERBEROS_PRINCIPAL}"
fi

if [ -n "$SOLR_AUTHENTICATION_TYPE" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authentication.type=${SOLR_AUTHENTICATION_TYPE}"
fi

if [ -n "$SOLR_ZKACL_PROVIDER" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -DzkACLProvider=${SOLR_ZKACL_PROVIDER}"
fi

if [ -n "$SOLR_AUTHENTICATION_KERBEROS_KEYTAB" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authentication.kerberos.keytab=${SOLR_AUTHENTICATION_KERBEROS_KEYTAB}"
fi

if [ -n "$SOLR_AUTHENTICATION_KERBEROS_PRINCIPAL" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authentication.kerberos.principal=${SOLR_AUTHENTICATION_KERBEROS_PRINCIPAL}"
fi

if [ -n "$SOLR_AUTHENTICATION_KERBEROS_NAME_RULES" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authentication.kerberos.name.rules=${SOLR_AUTHENTICATION_KERBEROS_NAME_RULES}"
fi

if [ -n "$SOLR_AUTHENTICATION_SIMPLE_ALLOW_ANON" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authentication.simple.anonymous.allowed=${SOLR_AUTHENTICATION_SIMPLE_ALLOW_ANON}"
fi

if [ -n "$SOLR_AUTHENTICATION_JAAS_CONF" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Djava.security.auth.login.config=${SOLR_AUTHENTICATION_JAAS_CONF}"
fi

if [ -n "$SOLR_SECURITY_ALLOWED_PROXYUSERS" ] ; then
  old_IFS=${IFS}
  IFS=","
  for user in $SOLR_SECURITY_ALLOWED_PROXYUSERS
    do
      hostsVar="SOLR_SECURITY_PROXYUSER_"$user"_HOSTS"
      eval hostsVal=\$$hostsVar
      if [ -n "$hostsVal" ] ; then
        CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.security.proxyuser.${user}.hosts=${hostsVal}"
      fi
      groupsVar="SOLR_SECURITY_PROXYUSER_"$user"_GROUPS"
      eval groupsVal=\$$groupsVar
      if [ -n "$groupsVal" ] ; then
        CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.security.proxyuser.${user}.groups=${groupsVal}"
      fi
    done
  IFS=${old_IFS}
fi

if [ -n "$SOLR_AUTHENTICATION_LDAP_PROVIDER_URL" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authentication.ldap.providerurl=${SOLR_AUTHENTICATION_LDAP_PROVIDER_URL}"
fi

if [ -n "$SOLR_AUTHENTICATION_LDAP_BASE_DN" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authentication.ldap.basedn=${SOLR_AUTHENTICATION_LDAP_BASE_DN}"
fi

if [ -n "$SOLR_AUTHENTICATION_LDAP_BIND_DOMAIN" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authentication.ldap.binddomain=${SOLR_AUTHENTICATION_LDAP_BIND_DOMAIN}"
fi

if [ -n "$SOLR_AUTHENTICATION_LDAP_ENABLE_START_TLS" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authentication.ldap.enablestarttls=${SOLR_AUTHENTICATION_LDAP_ENABLE_START_TLS}"
fi

if [ -n "$SOLR_AUTHENTICATION_HTTP_SCHEMES" ] ; then
  CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authentication.multi-scheme-auth-handler.schemes=${SOLR_AUTHENTICATION_HTTP_SCHEMES}"

  if [ -n "$SOLR_AUTHENTICATION_HTTP_DELEGATION_MGMT_SCHEMES" ] ; then
    CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authentication.multi-scheme-auth-handler.delegation.schemes=${SOLR_AUTHENTICATION_HTTP_DELEGATION_MGMT_SCHEMES}"
  fi

  if [ -n "$SOLR_AUTHENTICATION_HTTP_BASIC_HANDLER" ] ; then
    CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authentication.multi-scheme-auth-handler.schemes.basic.handler=${SOLR_AUTHENTICATION_HTTP_BASIC_HANDLER}"
  fi

  if [ -n "$SOLR_AUTHENTICATION_HTTP_NEGOTIATE_HANDLER" ] ; then
    CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authentication.multi-scheme-auth-handler.schemes.negotiate.handler=${SOLR_AUTHENTICATION_HTTP_NEGOTIATE_HANDLER}"
  fi
fi

if [ -z "$SOLR_HOSTNAME" ]; then
  SOLR_HOSTNAME=$(hostname -f)
fi

# FIXME: we need to set this because of the jetty-centric default solr.xml
CATALINA_OPTS="${CATALINA_OPTS} -Dhost=$SOLR_HOSTNAME -Djetty.port=$SOLR_PORT"

export CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.host=$SOLR_HOSTNAME
                                        -Dsolr.port=$SOLR_PORT
                                        -DuseCachedStatsBetweenGetMBeanInfoCalls=true
                                        -Dlog4j.configuration=file://$SOLR_LOG4J_CONFIG
                                        -Dsolr.log=$SOLR_LOG
                                        -Dsolr.admin.port=$SOLR_ADMIN_PORT
                                        -Dsolr.tomcat.backlog=$SOLR_TOMCAT_BACKLOG
                                        -Dsolr.tomcat.connectionTimeout=$SOLR_TOMCAT_CONNECTION_TIMEOUT
                                        -Dsolr.tomcat.keepAliveTimeout=$SOLR_TOMCAT_KEEP_ALIVE_TIMEOUT
                                        -Dsolr.tomcat.maxKeepAliveRequests=$SOLR_TOMCAT_MAX_KEEP_ALIVE_REQUESTS
                                        -Dsolr.max.connector.thread=$SOLR_MAX_CONNECTOR_THREAD
                                        -Dsolr.tomcat.connectionLinger=$SOLR_TOMCAT_CONNECTION_LINGER
                                        -Dsolr.tomcat.bufferSize=$SOLR_TOMCAT_BUFFER_SIZE
                                        -Dsolr.solr.home=$SOLR_HOME"

if [ -n "${SOLR_KEYSTORE_PATH}" ]; then
  tomcat_set_prop "solr.keystore.path=${SOLR_KEYSTORE_PATH}"
fi
if [ -n "${SOLR_KEYSTORE_PASSWORD}" ]; then
  tomcat_set_prop "solr.keystore.password=${SOLR_KEYSTORE_PASSWORD}"
fi
if [ -n "${SOLR_TRUSTSTORE_PATH}" ]; then
  CATALINA_OPTS="${CATALINA_OPTS} -Djavax.net.ssl.trustStore=${SOLR_TRUSTSTORE_PATH}"
fi
if [ -n "${SOLR_TRUSTSTORE_PASSWORD}" ]; then
  CATALINA_OPTS="${CATALINA_OPTS} -Djavax.net.ssl.trustStorePassword=${SOLR_TRUSTSTORE_PASSWORD}"
fi

if [ -n "$SOLR_AUTHORIZATION_SENTRY_SITE" ] ; then
  export CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authorization.sentry.site=${SOLR_AUTHORIZATION_SENTRY_SITE}"
fi

if [ -n "$SOLR_AUTHORIZATION_SUPERUSER" ] ; then
  export CATALINA_OPTS="${CATALINA_OPTS} -Dsolr.authorization.superuser=${SOLR_AUTHORIZATION_SUPERUSER}"
fi

if [ -n "$ZK_SASL_CLIENT_USERNAME" ] ; then
  export CATALINA_OPTS="${CATALINA_OPTS} -Dzookeeper.sasl.client.username=${ZK_SASL_CLIENT_USERNAME}"
fi

#  FIXME: for some reason catalina doesn't use CATALINA_OPTS for stop action
#        and thus doesn't know the admin port
if [ "$1" = "stop" ] ; then
    export JAVA_OPTS="$CATALINA_OPTS"
fi


if [ -x /usr/lib/bigtop-utils/bigtop-monitor-service ]; then
if ([ "$1" = "start" -o "$1" = "run" ]) && [ -n "$SOLRD_WATCHDOG_TIMEOUT" ] ; then
  /usr/lib/bigtop-utils/bigtop-monitor-service $SOLRD_WATCHDOG_TIMEOUT $$
fi
fi

exec ${CATALINA_HOME}/bin/catalina.sh "$@"
