30340fb
#!/bin/bash
30340fb
#
5b34837
# tomcat      This shell script takes care of starting and stopping Tomcat
30340fb
#
30340fb
# chkconfig: - 80 20
30340fb
#
30340fb
### BEGIN INIT INFO
5b34837
# Provides: tomcat
30340fb
# Required-Start: $network $syslog
30340fb
# Required-Stop: $network $syslog
30340fb
# Default-Start:
30340fb
# Default-Stop:
167370b
# Description: Release implementation for Servlet 3.0 and JSP 2.2
30340fb
# Short-Description: start and stop tomcat
30340fb
### END INIT INFO
30340fb
#
30340fb
# - originally written by Henri Gomez, Keith Irwin, and Nicolas Mailhot
30340fb
# - heavily rewritten by Deepak Bhole and Jason Corley
30340fb
#
30340fb
41ff5cd
## Source function library.
41ff5cd
#. /etc/rc.d/init.d/functions
41ff5cd
# Source LSB function library.
41ff5cd
if [ -r /lib/lsb/init-functions ]; then
41ff5cd
    . /lib/lsb/init-functions
41ff5cd
else
41ff5cd
    exit 1
41ff5cd
fi
41ff5cd
41ff5cd
DISTRIB_ID=`lsb_release -i -s 2>/dev/null`
30340fb
30340fb
NAME="$(basename $0)"
30340fb
unset ISBOOT
30340fb
if [ "${NAME:0:1}" = "S" -o "${NAME:0:1}" = "K" ]; then
30340fb
    NAME="${NAME:3}"
30340fb
    ISBOOT="1"
30340fb
fi
30340fb
30340fb
# For SELinux we need to use 'runuser' not 'su'
30340fb
if [ -x "/sbin/runuser" ]; then
david knox 5fa3921
    SU="/sbin/runuser -s /bin/sh"
30340fb
else
david knox 5fa3921
    SU="/bin/su -s /bin/sh"
30340fb
fi
30340fb
david knox 6b3301f
# Get the tomcat config (use this for environment specific settings)
5b34837
TOMCAT_CFG="/etc/tomcat/tomcat.conf"
david knox 6b3301f
if [ -r "$TOMCAT_CFG" ]; then
david knox 6b3301f
    . $TOMCAT_CFG
david knox 6b3301f
fi
david knox 6b3301f
david knox 3cb34c7
# Get instance specific config file
david knox 3cb34c7
if [ -r "/etc/sysconfig/${NAME}" ]; then
david knox 3cb34c7
    . /etc/sysconfig/${NAME}
david knox 3cb34c7
fi
david knox 3cb34c7
30340fb
# Define which connector port to use
30340fb
CONNECTOR_PORT="${CONNECTOR_PORT:-8080}"
30340fb
30340fb
# Path to the tomcat launch script
5b34837
TOMCAT_SCRIPT="/usr/sbin/tomcat"
30340fb
30340fb
# Tomcat program name
30340fb
TOMCAT_PROG="${NAME}"
30340fb
        
30340fb
# Define the tomcat username
30340fb
TOMCAT_USER="${TOMCAT_USER:-tomcat}"
30340fb
30340fb
# Define the tomcat log file
ddfc98c
TOMCAT_LOG="${TOMCAT_LOG:-${CATALINA_HOME}/logs/${NAME}-initd.log}"
david knox 3cb34c7
30340fb
30340fb
RETVAL="0"
30340fb
30340fb
# Look for open ports, as the function name might imply
30340fb
function findFreePorts() {
30340fb
    local isSet1="false"
30340fb
    local isSet2="false"
30340fb
    local isSet3="false"
30340fb
    local lower="8000"
30340fb
    randomPort1="0"
30340fb
    randomPort2="0"
30340fb
    randomPort3="0"
30340fb
    local -a listeners="( $(
30340fb
                        netstat -ntl | \
30340fb
                        awk '/^tcp/ {gsub("(.)*:", "", $4); print $4}'
30340fb
                    ) )"
30340fb
    while [ "$isSet1" = "false" ] || \
30340fb
          [ "$isSet2" = "false" ] || \
30340fb
          [ "$isSet3" = "false" ]; do
30340fb
        let port="${lower}+${RANDOM:0:4}"
30340fb
        if [ -z `expr " ${listeners[*]} " : ".*\( $port \).*"` ]; then
30340fb
            if [ "$isSet1" = "false" ]; then
30340fb
                export randomPort1="$port"
30340fb
                isSet1="true"
30340fb
            elif [ "$isSet2" = "false" ]; then
30340fb
                export randomPort2="$port"
30340fb
                isSet2="true"
30340fb
            elif [ "$isSet3" = "false" ]; then
30340fb
                export randomPort3="$port"
30340fb
                isSet3="true"
30340fb
            fi
30340fb
        fi
30340fb
    done
30340fb
}
30340fb
30340fb
function makeHomeDir() {
30340fb
    if [ ! -d "$CATALINA_HOME" ]; then
30340fb
        echo "$CATALINA_HOME does not exist, creating"
30340fb
        if [ ! -d "/usr/share/${NAME}" ]; then
30340fb
            mkdir /usr/share/${NAME}
5b34837
            cp -pLR /usr/share/tomcat/* /usr/share/${NAME}
30340fb
        fi
30340fb
        mkdir -p /var/log/${NAME} \
30340fb
                 /var/cache/${NAME} \
30340fb
                 /var/tmp/${NAME}
30340fb
        ln -fs /var/cache/${NAME} ${CATALINA_HOME}/work
30340fb
        ln -fs /var/tmp/${NAME} ${CATALINA_HOME}/temp
30340fb
        cp -pLR /usr/share/${NAME}/bin $CATALINA_HOME
30340fb
        cp -pLR /usr/share/${NAME}/conf $CATALINA_HOME
5b34837
        ln -fs /usr/share/java/tomcat ${CATALINA_HOME}/lib
5b34837
        ln -fs /usr/share/tomcat/webapps ${CATALINA_HOME}/webapps
30340fb
        chown ${TOMCAT_USER}:${TOMCAT_USER} /var/log/${NAME}
30340fb
    fi
30340fb
}
30340fb
30340fb
function parseOptions() {
30340fb
    options=""
30340fb
    options="$options $(
30340fb
                 awk '!/^#/ && !/^$/ { ORS=" "; print "export ", $0, ";" }' \
30340fb
                 $TOMCAT_CFG
30340fb
             )"
30340fb
    if [ -r "/etc/sysconfig/${NAME}" ]; then
30340fb
        options="$options $(
30340fb
                     awk '!/^#/ && !/^$/ { ORS=" "; 
30340fb
                                           print "export ", $0, ";" }' \
30340fb
                     /etc/sysconfig/${NAME}
30340fb
                 )"
30340fb
    fi
30340fb
    TOMCAT_SCRIPT="$options ${TOMCAT_SCRIPT}"
30340fb
}
30340fb
30340fb
# See how we were called.
30340fb
function start() {
Dave Knox 186acca
  
Dave Knox 186acca
   echo -n "Starting ${TOMCAT_PROG}: "
Dave Knox 186acca
   if [ "$RETVAL" != "0" ]; then 
Dave Knox 186acca
     log_failure_msg
Dave Knox 186acca
     return
Dave Knox 186acca
   fi
Dave Knox 186acca
   if [ -f "/var/lock/subsys/${NAME}" ]; then
18fb32c
        if [ -s "/var/run/${NAME}.pid" ]; then
30340fb
            read kpid < /var/run/${NAME}.pid
41ff5cd
#           if checkpid $kpid 2>&1; then
41ff5cd
            if [ -d "/proc/${kpid}" ]; then
41ff5cd
                log_success_msg
41ff5cd
                if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then
41ff5cd
                    echo
41ff5cd
                fi
30340fb
                return 0
30340fb
            fi
30340fb
        fi
30340fb
    fi
30340fb
    # fix permissions on the log and pid files
30340fb
    export CATALINA_PID="/var/run/${NAME}.pid"
Dave Knox 186acca
    touch $CATALINA_PID 2>&1 || RETVAL="4"
Dave Knox 186acca
    if [ "$RETVAL" -eq "0" -a "$?" -eq "0" ]; then 
Dave Knox 186acca
      chown ${TOMCAT_USER}:${TOMCAT_USER} $CATALINA_PID
Dave Knox 186acca
    fi
Dave Knox 186acca
    [ "$RETVAL" -eq "0" ] && touch $TOMCAT_LOG 2>&1 || RETVAL="4" 
Dave Knox 186acca
    if [ "$RETVAL" -eq "0" -a "$?" -eq "0" ]; then
Dave Knox 186acca
      chown ${TOMCAT_USER}:${TOMCAT_USER} $TOMCAT_LOG
Dave Knox 186acca
    fi
5b34837
    if [ "$CATALINA_HOME" != "/usr/share/tomcat" -a "$RETVAL" -eq "0" ]; then
30340fb
        # Create a tomcat directory if it doesn't exist
30340fb
        makeHomeDir
30340fb
        # If CATALINA_HOME doesn't exist modify port number so that
30340fb
        # multiple instances don't interfere with each other
30340fb
        findFreePorts
30340fb
        sed -i -e "s/8005/${randomPort1}/g" -e "s/8080/${CONNECTOR_PORT}/g" \
30340fb
            -e "s/8009/${randomPort2}/g" -e "s/8443/${randomPort3}/g" \
30340fb
            ${CATALINA_HOME}/conf/server.xml
30340fb
    fi
30340fb
    parseOptions
Dave Knox 186acca
    if [ "$RETVAL" -eq "0" -a "$SECURITY_MANAGER" = "true" ]; then
30340fb
        $SU - $TOMCAT_USER -c "${TOMCAT_SCRIPT} start-security" \
ddfc98c
            >> ${TOMCAT_LOG} 2>&1 || RETVAL="4"
30340fb
    else
Dave Knox 186acca
       
ddfc98c
       [ "$RETVAL" -eq "0" ] && $SU - $TOMCAT_USER -c "${TOMCAT_SCRIPT} start" >> ${TOMCAT_LOG} 2>&1 || RETVAL="4"
30340fb
    fi
Dave Knox 186acca
    if [ "$RETVAL" -eq "0" ]; then 
41ff5cd
        log_success_msg
30340fb
        touch /var/lock/subsys/${NAME}
30340fb
    else
Dave Knox 186acca
        log_failure_msg "Error code ${RETVAL}"
41ff5cd
    fi
41ff5cd
    if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then
41ff5cd
        echo
30340fb
    fi
30340fb
}
30340fb
30340fb
function stop() {
30340fb
    echo -n "Stopping ${TOMCAT_PROG}: "
30340fb
    if [ -f "/var/lock/subsys/${NAME}" ]; then
Dave Knox 186acca
      parseOptions
Dave Knox 186acca
      if [ "$RETVAL" -eq "0" ]; then
Dave Knox 186acca
         touch /var/lock/subsys/${NAME} 2>&1 || RETVAL="4"
ddfc98c
         [ "$RETVAL" -eq "0" ] && $SU - $TOMCAT_USER -c "${TOMCAT_SCRIPT} stop" >> ${TOMCAT_LOG} 2>&1 || RETVAL="4"
Dave Knox 186acca
      fi
Dave Knox 186acca
      if [ "$RETVAL" -eq "0" ]; then
Dave Knox 186acca
         count="0"
18fb32c
         if [ -s "/var/run/${NAME}.pid" ]; then
Dave Knox 186acca
            read kpid < /var/run/${NAME}.pid
Dave Knox 186acca
            until [ "$(ps --pid $kpid | grep -c $kpid)" -eq "0" ] || \
30340fb
                      [ "$count" -gt "$SHUTDOWN_WAIT" ]; do
30340fb
                    if [ "$SHUTDOWN_VERBOSE" = "true" ]; then
30340fb
                        echo "waiting for processes $kpid to exit"
30340fb
                    fi
30340fb
                    sleep 1
30340fb
                    let count="${count}+1"
30340fb
                done
30340fb
                if [ "$count" -gt "$SHUTDOWN_WAIT" ]; then
30340fb
                    if [ "$SHUTDOWN_VERBOSE" = "true" ]; then
Dave Knox 186acca
                        log_warning_msg "killing processes which did not stop after ${SHUTDOWN_WAIT} seconds"
30340fb
                    fi
30340fb
                    kill -9 $kpid
30340fb
                fi
41ff5cd
                log_success_msg
30340fb
            fi
30340fb
            rm -f /var/lock/subsys/${NAME} /var/run/${NAME}.pid
30340fb
        else
41ff5cd
            log_failure_msg
Dave Knox 186acca
            RETVAL="4"
30340fb
        fi
30340fb
    else
41ff5cd
        log_success_msg
Dave Knox 186acca
        RETVAL="0"
41ff5cd
    fi
41ff5cd
    if [ "$DISTRIB_ID" = "MandrivaLinux" ]; then
41ff5cd
        echo
30340fb
    fi
Dave Knox 186acca
}
Dave Knox 186acca
Dave Knox 186acca
function usage()
Dave Knox 186acca
{
Dave Knox 186acca
   echo "Usage: $0 {start|stop|restart|condrestart|try-restart|reload|force-reload|status|version}"
Dave Knox 186acca
   RETVAL="2"
30340fb
}
30340fb
30340fb
# See how we were called.
Dave Knox 186acca
RETVAL="0"
30340fb
case "$1" in
30340fb
    start)
30340fb
        start
30340fb
        ;;
30340fb
    stop)
30340fb
        stop
30340fb
        ;;
30340fb
    restart)
30340fb
        stop
30340fb
        start
30340fb
        ;;
30340fb
    condrestart|try-restart)
18fb32c
        if [ -s "/var/run/${NAME}.pid" ]; then
30340fb
            stop
30340fb
            start
30340fb
        fi
30340fb
        ;;
30340fb
    reload)
30340fb
        RETVAL="3"
30340fb
        ;;
30340fb
    force-reload)
18fb32c
        if [ -s "/var/run/${NAME}.pid" ]; then
30340fb
            stop
30340fb
            start
30340fb
        fi
30340fb
        ;;
30340fb
    status)
18fb32c
        if [ -s "/var/run/${NAME}.pid" ]; then
41ff5cd
            read kpid < /var/run/${NAME}.pid
41ff5cd
            if [ -d "/proc/${kpid}" ]; then
Dave Knox 186acca
                log_success_msg "${NAME} (pid ${kpid}) is running..."
41ff5cd
                RETVAL="0"
Dave Knox 186acca
            else
Dave Knox 186acca
# The pid file exists but the process is not running
Dave Knox 186acca
               log_warning_msg "PID file exists, but process is not running"
Dave Knox 186acca
               RETVAL="1"
41ff5cd
            fi
30340fb
        else
41ff5cd
            pid="$(/usr/bin/pgrep -d , -u ${TOMCAT_USER} -G ${TOMCAT_USER} java)"
30340fb
            if [ -z "$pid" ]; then
41ff5cd
#               status ${NAME}
41ff5cd
#               RETVAL="$?"
Dave Knox 186acca
                log_success_msg "${NAME} is stopped"
41ff5cd
                RETVAL="3"
30340fb
            else
Dave Knox 186acca
                log_success_msg "${NAME} (pid $pid) is running..."
30340fb
                RETVAL="0"
30340fb
            fi
30340fb
        fi
Dave Knox 186acca
         if [ -f /var/lock/subsys/${NAME} ]; then
Dave Knox 186acca
            pid="$(/usr/bin/pgrep -d , -u ${TOMCAT_USER} -G ${TOMCAT_USER} java)"
Dave Knox 186acca
# The lockfile exists but the process is not running
Dave Knox 186acca
            if [ -z "$pid" ]; then
Dave Knox 186acca
               log_failure_msg "${NAME} lockfile exists but process is not running"
Dave Knox 186acca
               RETVAL="2"
Dave Knox 186acca
            fi
Dave Knox 186acca
         fi
30340fb
        ;;
30340fb
    version)
30340fb
        ${TOMCAT_SCRIPT} version
30340fb
        ;;
30340fb
    *)
Dave Knox 186acca
      usage
Dave Knox 186acca
      ;;
30340fb
esac
30340fb
30340fb
exit $RETVAL