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