#!/bin/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.
#
# cloudstack-management      This shell script takes care of starting and stopping Tomcat
#
# chkconfig: - 80 20
#
### BEGIN INIT INFO
# Provides: tomcat6
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start:
# Default-Stop:
# Description: Release implementation for Servlet 2.5 and JSP 2.1
# Short-Description: start and stop tomcat
### END INIT INFO
#
# - originally written by Henri Gomez, Keith Irwin, and Nicolas Mailhot
# - heavily rewritten by Deepak Bhole and Jason Corley
#

if [ -r /etc/rc.d/init.d/functions ]; then
    . /etc/rc.d/init.d/functions
fi
if [ -r /lib/lsb/init-functions ]; then
    . /lib/lsb/init-functions
fi


NAME="$(basename $0)"
stop() {
	SHUTDOWN_WAIT="30"
	count="0"
	if [ -f /var/run/${NAME}.pid ]; then
		pid=`cat /var/run/${NAME}.pid`
		kill $pid &>/dev/null
		until [ "$(ps --pid $pid | grep -c $pid)" -eq "0" ] || \
			[ "$count" -gt "$SHUTDOWN_WAIT" ]
		do
			sleep 1
			let count="${count}+1"
		done
		if [ "$(ps --pid $pid | grep -c $pid)" -eq "0" ]; then
			log_success_msg "Stopping ${NAME}:"
		else
			log_failure_msg "Stopping ${NAME}:"
		fi
	else
		echo "Cannot find PID file of ${NAME}"
		log_failure_msg "Stopping ${NAME}:"
	fi
}

set_ulimit() {
    fd_limit=`ulimit -n`
    if [ "$fd_limit" != "4096" ]; then
        user=`whoami`
        if [ $user == "root" ]; then
            ulimit -n 4096
        fi
    fi
}

handle_pid_file() {
    if [ "$1" -ne 0 ] ; then
        echo "The pid file locates at /var/run/${NAME}.pid and lock file at /var/lock/subsys/${NAME}.
        Starting ${NAME} will take care of them or you can manually clean up."
    fi
}

# See how we were called.
case "$1" in
    status)
		status ${NAME}
		RETVAL=$?
        handle_pid_file $RETVAL
		;;
    stop)
		stop
		;;
    restart)
		stop
		set start
        set_ulimit
		. /etc/rc.d/init.d/tomcat6
		;;
	*)
        set_ulimit
		. /etc/rc.d/init.d/tomcat6
esac

exit $RETVAL
