#!/bin/sh
#
# Startup script for Tomcat 5.0, the Apache Servlet Engine
#
# chkconfig: - 80 20
# description: Tomcat 5.0 is the Apache Servlet Engine RI for Servlet 2.4/JSP 2.0
# processname: tomcat
# pidfile: /var/run/tomcat5.pid
# config:  /etc/tomcat5/tomcat5.conf
#
# Gomez Henri <hgomez@users.sourceforge.net>
# Keith Irwin <keith_irwin@non.hp.com>
# Nicolas Mailhot <nicolas.mailhot@one2team.com>
#
# version 1.02 - Removed initlog support
# version 1.03 - Removed config:
# version 1.04 - tomcat will start before httpd and stop after httpd
# version 1.05 - jdk hardcoded to link /usr/java/jdk and tomcat runs as "nobody"
# version 1.06 - split up into script and config file
# version 1.07 - Rework from Nicolas ideas
# version 1.08 - Fix work dir permission at start time, switch to use tomcat4
# version 1.09 - Fix pidfile and config tags
# version 1.10 - Fallback to su direct use on systems without Redhat/Mandrake init.d functions
# version 1.11 - Fix webapps dir permissions
# version 1.12 - remove initial start/stop level for chkconfig (- 80 20)
# version 1.13 - remove chown of logs/work/temp/webapps dir, owned by tomcat4 at install time
# version 1.14 - correct the start/stop ugly hack by waiting all the threads stops
# version 1.15 - ensure we're looking for TOMCAT_USER running catalina
# version 1.16 - Add support for CATALINA_PID env var
# version 1.17 - Remove run files only tomcat started correctl
#                in start area, check that tomcat is not allready running
# version 1.18 - Fix kill typo (thanks Kaj J. Niemi)
# version 1.19 - Add jar relinking
# version 1.20 - Check there is no stalling tomcat4.pid
# version 1.20tc5 - Changed all instances of tomcat4 to tomcat5 except TOMCAT_USER
# version 1.20tc5rh - Changed TOMCAT_USER from tomcat4 to tomcat
#

# Source function library.
if [ -x /etc/rc.d/init.d/functions ]; then
. /etc/rc.d/init.d/functions
fi

NAME=`basename $0`
unset ISBOOT
if [ ${NAME:0:1} = "S" -o ${NAME:0:1} = "K" ]
then
        NAME=${NAME:3}
        ISBOOT=1
fi

# For SELinux we need to use 'runuser' not 'su'
if [ -x /sbin/runuser ]
then
	SU=runuser
else
	SU=su
fi

# Get Tomcat config

TOMCAT_CFG="/etc/tomcat5/tomcat5.conf"

[ -r "$TOMCAT_CFG" ] && . "${TOMCAT_CFG}"

# Get instance specific config file
[ -r /etc/sysconfig/$NAME ] && . /etc/sysconfig/$NAME

#define which connector port to use
CONNECTOR_PORT=${CONNECTOR_PORT:-"8080"}

# Path to the tomcat launch script (direct don't use wrapper)
TOMCAT_SCRIPT=/usr/bin/dtomcat5

# Path to the script that will refresh jar symlinks on startup
TOMCAT_RELINK_SCRIPT="$CATALINA_HOME/bin/relink"

# Tomcat name :)
TOMCAT_PROG=$NAME
        
# if TOMCAT_USER is not set, use tomcat5 like Apache HTTP server
if [ -z "$TOMCAT_USER" ]; then
    TOMCAT_USER="tomcat"
fi

# Since the daemon function will sandbox $tomcat
# no environment stuff should be defined here anymore.
# Please use the /etc/tomcat.conf file instead ; it will
# be read by the $tomcat script

RETVAL=0

function findFreePorts {
   lower=8000
   randomPort1=0
   randomPort2=0
   randomPort3=0
   for ((  i = 0 ;  i <= 20;  i++  )); do
      RANDOM=$(date +%s)
      randomPort1=$((RANDOM%2000+lower))
      randomPort2=$((RANDOM%2000+lower))
      randomPort3=$((RANDOM%2000+lower))
      `netstat -apntl|grep $randomPort1`
      ret1=$?
      `netstat -apntl|grep $randomPort2`
      ret2=$?
      `netstat -apntl|grep $randomPort3`
      ret3=$?
      if [ $ret1 -eq 1 ] && [ $ret2 -eq 1 ] && [ $ret3 -eq 1 ]; then
         return
      fi
   done
   randomPort1=0
   randomPort2=0
   randomPort3=0
}

# See how we were called.
start() {
    echo -n "Starting $TOMCAT_PROG: "

	if [ -f /var/lock/subsys/$NAME ] ; then
 		if [ -f /var/run/$NAME.pid ]; then
   	      		read kpid < /var/run/$NAME.pid
         		if checkpid $kpid 2>&1; then
             			echo "process allready running"
             			return -1
         		else
             			echo "lock file found but no process running for pid $kpid, continuing"
 			fi
 		fi
 	fi
 
 	export CATALINA_PID=/var/run/$NAME.pid
 	touch $CATALINA_PID
 	chown $TOMCAT_USER:$TOMCAT_USER $CATALINA_PID

        if [ $CATALINA_HOME != "/usr/share/tomcat5" ]; then
            # if CATALINA_HOME does not exist
            if [ ! -d "$CATALINA_HOME" ]; then
                if [ ! -d "/var/lib/$NAME" ]; then
                    mkdir -p /var/lib/$NAME
                    cp -pL -R /var/lib/tomcat5/* /var/lib/$NAME
                fi
                mkdir -p $CATALINA_HOME
                cp -pL -R /usr/share/tomcat5/bin $CATALINA_HOME
                ln -fs /var/lib/$NAME/common $CATALINA_HOME/common
                mkdir -p $CATALINA_HOME/conf
                cp -pL -R /etc/tomcat5/* $CATALINA_HOME/conf/
                mkdir -p /var/log/$NAME
                chown $TOMCAT_USER:$TOMCAT_USER /var/log/$NAME
                ln -fs /var/log/$NAME $CATALINA_HOME/logs
                ln -fs /var/lib/$NAME/server $CATALINA_HOME/server
                ln -fs /var/lib/$NAME/shared $CATALINA_HOME/shared
                mkdir -p /var/cache/$NAME/temp
                ln -fs /var/cache/$NAME/temp $CATALINA_HOME/temp
                ln -fs /var/lib/$NAME/webapps $CATALINA_HOME/webapps
                mkdir -p /var/cache/$NAME/work
                ln -fs /var/cache/$NAME/work $CATALINA_HOME/work
                cp -pL -R /var/cache/tomcat5/work/* $CATALINA_HOME/work/
            fi
            # modify port number so that multiple instances doesn't
            # interfere with each other.
            findFreePorts
            if [ $randomPort1 -eq 0 ] || [ $randomPort2 -eq 0 ] || [ $randomPort3 -eq 0 ]; then
                failure $"${NAME} startup"
                echo "Can't find free ports"
                return 1;
            fi
            cp $CATALINA_HOME/conf/server.xml $CATALINA_HOME/conf/server.xml.orig
            sed -e "s/8005/$randomPort1/g" -e "s/8080/$CONNECTOR_PORT/g" -e "s/8009/$randomPort2/g" -e "s/8443/$randomPort3/g" $CATALINA_HOME/conf/server.xml.orig >  $CATALINA_HOME/conf/server.xml
        fi

        options=""
        for i in `grep -v "^#" /etc/tomcat5/tomcat5.conf |grep -v "^$"`; do
            j=`echo $i| sed 's/\"//g'`
            export $j
            options="${options} export $j ;"
        done
        if [ -r /etc/sysconfig/$NAME ]; then
            for i in `grep -v "^#" /etc/sysconfig/$NAME |grep -v "^$"`; do
                j=`echo $i| sed 's/\"//g'`
                export $j
                options="${options} export $j ;"
            done
        fi

        $TOMCAT_RELINK_SCRIPT

        TOMCAT_SCRIPT="$options $TOMCAT_SCRIPT"

        if [ -x /etc/rc.d/init.d/functions ]; then
        	daemon --user $TOMCAT_USER "$TOMCAT_SCRIPT" start 
    	else
        	$SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT start"
    	fi

    	RETVAL=$?
    	echo
    	[ $RETVAL = 0 ] && touch /var/lock/subsys/$NAME
    	return $RETVAL
}

stop() {
    echo -n "Stopping $TOMCAT_PROG: "

    if [ -f /var/lock/subsys/$NAME ] ; then
      if [ -x /etc/rc.d/init.d/functions ]; then
          daemon --user $TOMCAT_USER "$TOMCAT_SCRIPT" stop
      else
          $SU - $TOMCAT_USER -c "$TOMCAT_SCRIPT stop"
      fi
      RETVAL=$?

      if [ $RETVAL = 0 ]; then
        count=0;

        if [ -f /var/run/$NAME.pid ]; then

            read kpid < /var/run/$NAME.pid
            let kwait=$SHUTDOWN_WAIT

            until [ `ps --pid $kpid | grep -c $kpid` = '0' ] || [ $count -gt $kwait ]
            do
                echo -n -e "\nwaiting for processes to exit";
                sleep 1
                let count=$count+1;
            done

            if [ $count -gt $kwait ]; then
                echo -n -e "\nkilling processes which didn't stop after $SHUTDOWN_WAIT seconds"
                kill -9 $kpid
            fi

            if [ $count -gt 0 ]; then
                echo -n -e "\n"
            fi
        fi
    
		rm -f /var/lock/subsys/$NAME /var/run/$NAME.pid
    fi

    fi
}


# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        sleep 2	
        start
        ;;
  condrestart)
        if [ -f /var/run/$NAME.pid ] ; then
                stop
                start
        fi
        ;;
  *)
        echo "Usage: $TOMCAT_PROG {start|stop|restart|condrestart}"
        exit 1
esac

exit $RETVAL
