2014-12-23 18:20:42 -05:00
#!/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.
if [ [ $EUID -ne 0 ] ] ; then
echo -e "\nERROR: This script must be run as root\n" 1>& 2
exit 1
fi
print_usage( ) {
ERROR_MSG = " $1 "
if [ " $ERROR_MSG " != "" ] ; then
echo -e " \nERROR: $ERROR_MSG \n " 1>& 2
fi
echo ""
echo "Usage: install_solr_service.sh path_to_solr_distribution_archive OPTIONS"
echo ""
echo " The first argument to the script must be a path to a Solr distribution archive, such as solr-5.0.0.tgz"
echo " (only .tgz or .zip are supported formats for the archive)"
echo ""
echo " Supported OPTIONS include:"
echo ""
echo " -d Directory for live / writable Solr files, such as logs, pid files, and index data; defaults to /var/solr"
echo ""
echo " -i Directory to extract the Solr installation archive; defaults to /opt/"
echo " The specified path must exist prior to using this script."
echo ""
echo " -p Port Solr should bind to; default is 8983"
echo ""
echo " -s Service name; defaults to solr"
echo ""
echo " -u User to own the Solr files and run the Solr process as; defaults to solr"
echo " This script will create the specified user account if it does not exist."
echo ""
echo " NOTE: Must be run as the root user"
echo ""
} # end print_usage
if [ -f "/proc/version" ] ; then
proc_version = ` cat /proc/version`
else
proc_version = ` uname -a`
fi
if [ [ $proc_version = = *"Debian" * ] ] ; then
distro = Debian
elif [ [ $proc_version = = *"Red Hat" * ] ] ; then
distro = RedHat
elif [ [ $proc_version = = *"Ubuntu" * ] ] ; then
distro = Ubuntu
elif [ [ $proc_version = = *"SUSE" * ] ] ; then
distro = SUSE
else
echo -e " \nERROR: Your Linux distribution ( $proc_version ) not supported by this script!\nYou'll need to setup Solr as a service manually using the documentation provided in the Solr Reference Guide.\n " 1>& 2
exit 1
fi
if [ -z " $1 " ] ; then
print_usage "Must specify the path to the Solr installation archive, such as solr-5.0.0.tgz"
exit 1
fi
SOLR_ARCHIVE = $1
if [ ! -f " $SOLR_ARCHIVE " ] ; then
print_usage " Specified Solr installation archive $SOLR_ARCHIVE not found! "
exit 1
fi
# strip off path info
SOLR_INSTALL_FILE = ${ SOLR_ARCHIVE ##*/ }
is_tar = true
if [ ${ SOLR_INSTALL_FILE : -4 } = = ".tgz" ] ; then
2015-01-21 12:02:36 -05:00
SOLR_DIR = ${ SOLR_INSTALL_FILE %.tgz }
2014-12-23 18:20:42 -05:00
elif [ ${ SOLR_INSTALL_FILE : -4 } = = ".zip" ] ; then
2015-01-21 12:02:36 -05:00
SOLR_DIR = ${ SOLR_INSTALL_FILE %.zip }
2014-12-23 18:20:42 -05:00
is_tar = false
else
print_usage " Solr installation archive $SOLR_ARCHIVE is invalid, expected a .tgz or .zip file! "
exit 1
fi
if [ $# -gt 1 ] ; then
shift
while true; do
case $1 in
-i)
if [ [ -z " $2 " || " ${ 2 : 0 : 1 } " = = "-" ] ] ; then
print_usage " Directory path is required when using the $1 option! "
exit 1
fi
SOLR_EXTRACT_DIR = $2
shift 2
; ;
-d)
if [ [ -z " $2 " || " ${ 2 : 0 : 1 } " = = "-" ] ] ; then
print_usage " Directory path is required when using the $1 option! "
exit 1
fi
SOLR_VAR_DIR = " $2 "
shift 2
; ;
-u)
if [ [ -z " $2 " || " ${ 2 : 0 : 1 } " = = "-" ] ] ; then
print_usage " Username is required when using the $1 option! "
exit 1
fi
SOLR_USER = " $2 "
shift 2
; ;
-s)
if [ [ -z " $2 " || " ${ 2 : 0 : 1 } " = = "-" ] ] ; then
print_usage " Service name is required when using the $1 option! "
exit 1
fi
SOLR_SERVICE = " $2 "
shift 2
; ;
-p)
if [ [ -z " $2 " || " ${ 2 : 0 : 1 } " = = "-" ] ] ; then
print_usage " Port is required when using the $1 option! "
exit 1
fi
SOLR_PORT = " $2 "
shift 2
; ;
-help| -usage)
print_usage ""
exit 0
; ;
--)
shift
break
; ;
*)
if [ " $1 " != "" ] ; then
print_usage " Unrecognized or misplaced argument: $1 ! "
exit 1
else
break # out-of-args, stop looping
fi
; ;
esac
done
fi
if [ -z " $SOLR_EXTRACT_DIR " ] ; then
SOLR_EXTRACT_DIR = /opt
fi
if [ ! -d " $SOLR_EXTRACT_DIR " ] ; then
print_usage " Installation directory $SOLR_EXTRACT_DIR not found! Please create it before running this script. "
exit 1
fi
2015-01-13 13:15:48 -05:00
if [ -z " $SOLR_SERVICE " ] ; then
SOLR_SERVICE = solr
fi
2014-12-23 18:20:42 -05:00
if [ -z " $SOLR_VAR_DIR " ] ; then
2015-01-13 13:15:48 -05:00
SOLR_VAR_DIR = /var/$SOLR_SERVICE
2014-12-23 18:20:42 -05:00
fi
if [ -z " $SOLR_USER " ] ; then
SOLR_USER = solr
fi
if [ -z " $SOLR_PORT " ] ; then
SOLR_PORT = 8983
fi
if [ -f " /etc/init.d/ $SOLR_SERVICE " ] ; then
2015-01-13 13:15:48 -05:00
echo -e " \nERROR: /etc/init.d/ $SOLR_SERVICE already exists! Perhaps Solr is already setup as a service on this host?\n " 1>& 2
2014-12-23 18:20:42 -05:00
exit 1
fi
if [ -e " $SOLR_EXTRACT_DIR / $SOLR_SERVICE " ] ; then
print_usage " $SOLR_EXTRACT_DIR / $SOLR_SERVICE already exists! Please move this directory / link or choose a different service name using the -s option. "
exit 1
fi
solr_uid = ` id -u $SOLR_USER `
if [ $? -ne 0 ] ; then
echo " Creating new user: $SOLR_USER "
if [ " $distro " = = "RedHat" ] ; then
adduser $SOLR_USER
elif [ " $distro " = = "SUSE" ] ; then
useradd -m $SOLR_USER
else
adduser --system --shell /bin/bash --group --disabled-password --home /home/$SOLR_USER $SOLR_USER
fi
fi
SOLR_INSTALL_DIR = $SOLR_EXTRACT_DIR /$SOLR_DIR
if [ ! -d " $SOLR_INSTALL_DIR " ] ; then
echo " Extracting $SOLR_ARCHIVE to $SOLR_EXTRACT_DIR "
if $is_tar ; then
tar zxf $SOLR_ARCHIVE -C $SOLR_EXTRACT_DIR
else
unzip -q $SOLR_ARCHIVE -d $SOLR_EXTRACT_DIR
fi
if [ ! -d " $SOLR_INSTALL_DIR " ] ; then
echo -e " \nERROR: Expected directory $SOLR_INSTALL_DIR not found after extracting $SOLR_ARCHIVE ... script fails.\n " 1>& 2
exit 1
fi
chown -R $SOLR_USER : $SOLR_INSTALL_DIR
else
echo -e " \nWARNING: $SOLR_INSTALL_DIR already exists! Skipping extract ...\n "
fi
# create a symlink for easier scripting
ln -s $SOLR_INSTALL_DIR $SOLR_EXTRACT_DIR /$SOLR_SERVICE
chown -h $SOLR_USER : $SOLR_EXTRACT_DIR /$SOLR_SERVICE
mkdir -p $SOLR_VAR_DIR /data
mkdir -p $SOLR_VAR_DIR /logs
cp $SOLR_INSTALL_DIR /server/solr/solr.xml $SOLR_VAR_DIR /data/
cp $SOLR_INSTALL_DIR /bin/solr.in.sh $SOLR_VAR_DIR /
cp $SOLR_INSTALL_DIR /server/resources/log4j.properties $SOLR_VAR_DIR /log4j.properties
sed_expr = "s#solr.log=.*#solr.log=\${solr.solr.home}/../logs#"
sed -i -e " $sed_expr " $SOLR_VAR_DIR /log4j.properties
chown -R $SOLR_USER : $SOLR_VAR_DIR
echo " SOLR_PID_DIR= $SOLR_VAR_DIR
SOLR_HOME = $SOLR_VAR_DIR /data
LOG4J_PROPS = $SOLR_VAR_DIR /log4j.properties
SOLR_LOGS_DIR = $SOLR_VAR_DIR /logs
SOLR_PORT = $SOLR_PORT
" >> $SOLR_VAR_DIR /solr.in.sh
echo " Creating /etc/init.d/ $SOLR_SERVICE script ... "
cp $SOLR_INSTALL_DIR /bin/init.d/solr /etc/init.d/$SOLR_SERVICE
chmod 744 /etc/init.d/$SOLR_SERVICE
chown root:root /etc/init.d/$SOLR_SERVICE
# do some basic variable substitution on the init.d script
sed_expr1 = " s#SOLR_INSTALL_DIR=.*#SOLR_INSTALL_DIR= $SOLR_EXTRACT_DIR / $SOLR_SERVICE # "
sed_expr2 = " s#SOLR_ENV=.*#SOLR_ENV= $SOLR_VAR_DIR /solr.in.sh# "
sed_expr3 = " s#RUNAS=.*#RUNAS= $SOLR_USER # "
sed_expr4 = " s#Provides:.*#Provides: $SOLR_SERVICE # "
sed -i -e " $sed_expr1 " -e " $sed_expr2 " -e " $sed_expr3 " -e " $sed_expr4 " /etc/init.d/$SOLR_SERVICE
if [ [ " $distro " = = "RedHat" || " $distro " = = "SUSE" ] ] ; then
chkconfig $SOLR_SERVICE on
else
update-rc.d $SOLR_SERVICE defaults
fi
service $SOLR_SERVICE start
sleep 5
service $SOLR_SERVICE status
echo " Service $SOLR_SERVICE installed. "