summaryrefslogtreecommitdiffstats
path: root/heartbeat/tomcat
diff options
context:
space:
mode:
Diffstat (limited to 'heartbeat/tomcat')
-rwxr-xr-xheartbeat/tomcat816
1 files changed, 816 insertions, 0 deletions
diff --git a/heartbeat/tomcat b/heartbeat/tomcat
new file mode 100755
index 0000000..fa27151
--- /dev/null
+++ b/heartbeat/tomcat
@@ -0,0 +1,816 @@
+#!/bin/sh
+#
+# Description: Manages a Tomcat Server as an OCF High-Availability
+# resource under Heartbeat/LinuxHA control
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# Copyright (c) 2007 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
+#
+#######################################################################
+# OCF parameters:
+# OCF_RESKEY_tomcat_name - The name of the resource. Default is tomcat
+# OCF_RESKEY_script_log - A destination of the log of this script. Default /var/log/OCF_RESKEY_tomcat_name.log
+# OCF_RESKEY_tomcat_stop_timeout - Time-out at the time of the stop. Default is 5. DEPRECATED
+# OCF_RESKEY_tomcat_suspend_trialcount - The re-try number of times awaiting a stop. Default is 10. DEPRECATED
+# OCF_RESKEY_tomcat_user - A user name to start a resource.
+# OCF_RESKEY_statusurl - URL for state confirmation. Default is http://127.0.0.1:8080
+# OCF_RESKEY_max_stop_time - The max time it should take for proper shutdown. Restrictions, only Tomcat6.
+# OCF_RESKEY_java_home - Home directory of Java. Default is none
+# OCF_RESKEY_java_opts - Options to pass to Java JVM for start and stop. Default is none
+# OCF_RESKEY_catalina_home - Home directory of Tomcat. Default is none
+# OCF_RESKEY_catalina_base - Base directory of Tomcat. Default is OCF_RESKEY_catalina_home
+# OCF_RESKEY_catalina_out - Log file name of Tomcat. Default is OCF_RESKEY_catalina_base/logs/catalina.out
+# OCF_RESKEY_catalina_pid - A PID file name of Tomcat. Default is OCF_RESKEY_catalina_base/logs/catalina.pid
+# OCF_RESKEY_tomcat_start_opts - Start options of Tomcat. Default is none.
+# OCF_RESKEY_catalina_opts - CATALINA_OPTS environment variable. Default is none.
+# OCF_RESKEY_catalina_tmpdir - CATALINA_TMPDIR environment variable. Default is none.
+# OCF_RESKEY_catalina_rotate_log - Control catalina.out logrotation flag. Default is NO.
+# OCF_RESKEY_catalina_rotatetime - catalina.out logrotation time span(seconds). Default is 86400.
+# OCF_RESKEY_java_endorsed_dirs - JAVA_ENDORSED_DIRS environment variable. Default is none.
+# OCF_RESKEY_logging_config - LOGGING_CONFIG environment variable. Default is none.
+# OCF_RESKEY_logging_manager - LOGGING_MANAGER environment variable. Default is none.
+###############################################################################
+
+
+: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
+. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
+
+# Use runuser if available for SELinux.
+if [ -x /sbin/runuser ]; then
+ SU=runuser
+else
+ SU=su
+fi
+
+usage()
+{
+ cat <<-EOF
+usage: $0 action
+
+action:
+ start start Tomcat
+
+ stop stop Tomcat
+
+ status return the status of Tomcat, up or down
+
+ monitor return TRUE if Tomcat appears to be working.
+ You have to have installed $WGETNAME for this to work.
+
+ meta-data show meta data message
+
+ validate-all validate the instance parameters
+EOF
+}
+
+isrunning_tomcat()
+{
+ $WGET --tries=20 -O /dev/null $RESOURCE_STATUSURL >/dev/null 2>&1
+}
+
+isalive_tomcat()
+{
+ if ocf_is_true $SYSTEMD; then
+ systemctl is-active tomcat@${TOMCAT_NAME} > /dev/null 2>&1
+ return $?
+ fi
+ # As the server stops, the PID file disappears. To avoid race conditions,
+ # we will have remembered the PID of a running instance on script entry.
+ local pid=$rememberedPID
+ # If there is a PID file, attempt to use that
+ if [ -f $CATALINA_PID ]; then
+ local tmp
+ ocf_log debug "Reading pid from $CATALINA_PID"
+ tmp=`head -n 1 $CATALINA_PID`
+ if [ $? -eq 0 ]; then
+ pid=$tmp
+ fi
+ fi
+ if [ -n "$pid" ] && [ "$pid" -gt 0 ]; then
+ # Retry message for restraint
+ ocf_log debug "Sending noop signal to $pid"
+ kill -s 0 $pid >/dev/null 2>&1
+ return $?
+ fi
+ # No PID file
+ false
+}
+
+# Check rotatelogs process and restart if it is stopped
+monitor_rotatelogs()
+{
+ pgrep -f "$ROTATELOGS.*$CATALINA_BASE/logs/catalina_%F.log" > /dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ ocf_log warn "A rotatelogs command for $CATALINA_BASE/logs/catalina_%F.log is not running. Restarting it."
+ start_rotatelogs
+ if [ $? -eq 0 ]; then
+ ocf_log info "Restart rotatelogs process succeeded."
+ else
+ ocf_log warn "Restart rotatelogs process failed."
+ fi
+ fi
+}
+
+monitor_tomcat()
+{
+ isalive_tomcat ||
+ return $OCF_NOT_RUNNING
+ isrunning_tomcat ||
+ return $OCF_ERR_GENERIC
+ if ocf_is_true ${CATALINA_ROTATE_LOG}; then
+ # Monitor rotatelogs process and restart it if it is stopped.
+ # And never consider rotatelogs process failure to be a monitor failure
+ # as long as Tomcat process works fine.
+ monitor_rotatelogs
+ fi
+ return $OCF_SUCCESS
+}
+
+start_rotatelogs()
+{
+ # -s is required because tomcat5.5's login shell is /bin/false
+ $SU - -s /bin/sh $RESOURCE_TOMCAT_USER \
+ -c "$ROTATELOGS -l \"$CATALINA_BASE/logs/catalina_%F.log\" $CATALINA_ROTATETIME" \
+ < "$CATALINA_OUT" > /dev/null 2>&1 &
+}
+
+# Execute catalina.out log rotation
+rotate_catalina_out()
+{
+ # Check catalina_%F.log is writable or not.
+ CURRENT_ROTATELOG_SUFFIX=`date +"%F"`
+ $SU - -s /bin/sh $RESOURCE_TOMCAT_USER \
+ -c "touch \"$CATALINA_BASE/logs/catalina_$CURRENT_ROTATELOG_SUFFIX.log\"" > /dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ ocf_exit_reason "$CATALINA_BASE/logs/catalina_$CURRENT_ROTATELOG_SUFFIX.log is not writable."
+ return $OCF_ERR_GENERIC
+ fi
+
+ # Clean up and set permissions on required files
+ rm -rf "$CATALINA_BASE"/temp/*
+ if [ -p "$CATALINA_OUT" ]; then
+ rm -f "$CATALINA_OUT"
+ elif [ -e "$CATALINA_OUT" ]; then
+ DATE=`date +"%F-%H%M%S"`
+ ocf_log warn "$CATALINA_OUT already exists. It is saved as $CATALINA_OUT-$DATE"
+ mv "$CATALINA_OUT" "$CATALINA_OUT-$DATE"
+ fi
+ mkfifo -m700 "$CATALINA_OUT"
+ chown --dereference "$RESOURCE_TOMCAT_USER" "$CATALINA_OUT" || true
+
+ start_rotatelogs
+}
+
+create_systemd_config()
+{
+cat<<-EOF > /etc/sysconfig/tomcat@${TOMCAT_NAME}
+JAVA_HOME=${JAVA_HOME}
+JAVA_OPTS="${JAVA_OPTS}"
+CATALINA_HOME=${CATALINA_HOME}
+CATALINA_BASE=${CATALINA_BASE}
+CATALINA_OUT=${CATALINA_OUT}
+CATALINA_OPTS="${CATALINA_OPTS}"
+CATALINA_TMPDIR="${CATALINA_TMPDIR}"
+JAVA_ENDORSED_DIRS="${JAVA_ENDORSED_DIRS}"
+LOGGING_CONFIG="${LOGGING_CONFIG}"
+LOGGING_MANAGER="${LOGGING_MANAGER}"
+TOMCAT_CFG=${TOMCAT_CFG}
+EOF
+}
+
+# shellcheck disable=SC2068
+tomcatCommand()
+{
+ if ocf_is_true $SYSTEMD; then
+ systemctl $@ tomcat@${TOMCAT_NAME}
+ else
+cat<<-END_TOMCAT_COMMAND
+ export JAVA_HOME=${JAVA_HOME}
+ export JAVA_OPTS="${JAVA_OPTS}"
+ export CATALINA_HOME=${CATALINA_HOME}
+ export CATALINA_BASE=${CATALINA_BASE}
+ export CATALINA_OUT=${CATALINA_OUT}
+ export CATALINA_PID=${CATALINA_PID}
+ export CATALINA_OPTS="${CATALINA_OPTS}"
+ export CATALINA_TMPDIR="${CATALINA_TMPDIR}"
+ export JAVA_ENDORSED_DIRS="${JAVA_ENDORSED_DIRS}"
+ export LOGGING_CONFIG="${LOGGING_CONFIG}"
+ export LOGGING_MANAGER="${LOGGING_MANAGER}"
+ export TOMCAT_CFG=${TOMCAT_CFG}
+ $TOMCAT_START_SCRIPT $@
+END_TOMCAT_COMMAND
+ fi
+}
+
+# shellcheck disable=SC2068
+attemptTomcatCommand()
+{
+ if [ -n "$REDIRECT_DEFAULT_CONFIG" ]; then
+ TOMCAT_CFG=$(mktemp "${HA_RSCTMP}/tomcat-tmp-XXXXX.cfg")
+ export TOMCAT_CFG
+ fi
+
+ if ocf_is_true $SYSTEMD; then
+ tomcatCommand $@
+ elif [ "$RESOURCE_TOMCAT_USER" = root ]; then
+ "$TOMCAT_START_SCRIPT" $@ >> "$TOMCAT_CONSOLE" 2>&1
+ else
+ tomcatCommand $@ | $SU - -s /bin/sh "$RESOURCE_TOMCAT_USER" >> "$TOMCAT_CONSOLE" 2>&1
+ fi
+
+ if [ -n "$REDIRECT_DEFAULT_CONFIG" ]; then
+ rm -f "$TOMCAT_CFG"
+ fi
+}
+
+start_tomcat()
+{
+ if ocf_is_true $SYSTEMD; then
+ create_systemd_config
+ fi
+ cd "$CATALINA_HOME/bin" || return $OCF_ERR_GENERIC
+
+ validate_all_tomcat || exit $?
+
+ monitor_tomcat
+ if [ $? -eq $OCF_SUCCESS ]; then
+ return $OCF_SUCCESS
+ fi
+
+ # Remove $CATALINA_PID if it exists
+ rm -f $CATALINA_PID
+
+ #ocf_log debug "catalina.out rotation FLG = ${CATALINA_ROTATE_LOG}"
+ if ocf_is_true ${CATALINA_ROTATE_LOG}; then
+ rotate_catalina_out
+ if [ $? -eq 0 ]; then
+ ocf_log debug "Rotate catalina.out succeeded."
+ else
+ ocf_exit_reason "Rotate catalina.out failed. Avoid starting tomcat without catalina.out rotation."
+ return $OCF_ERR_GENERIC
+ fi
+ fi
+
+ echo "`date "+%Y/%m/%d %T"`: start ===========================" >> "$TOMCAT_CONSOLE"
+
+ ocf_log debug "CATALINA_OPTS value = ${CATALINA_OPTS}"
+ attemptTomcatCommand start ${TOMCAT_START_OPTS} &
+
+ while true; do
+ monitor_tomcat
+ if [ $? -eq $OCF_SUCCESS ]; then
+ break
+ fi
+ ocf_log debug "start_tomcat[$TOMCAT_NAME]: retry monitor_tomcat"
+ sleep 3
+ done
+
+ return $OCF_SUCCESS
+}
+
+stop_tomcat()
+{
+ local stop_time
+ local RA_TIMEOUT=20
+ local TOMCAT_STOP_OPTS=""
+
+ if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then
+ RA_TIMEOUT=$((OCF_RESKEY_CRM_meta_timeout/1000))
+ fi
+
+ STOP_TIMEOUT=$((RA_TIMEOUT-5))
+ if [ -n "$MAX_STOP_TIME" ]; then
+ if [ $MAX_STOP_TIME -gt $RA_TIMEOUT ]; then
+ ocf_log warn "max_stop_timeout must be shorter than the timeout of stop operation."
+ fi
+ if [ $MAX_STOP_TIME -eq 0 ]; then
+ STOP_TIMEOUT=$RA_TIMEOUT
+ else
+ STOP_TIMEOUT=$MAX_STOP_TIME
+ fi
+ fi
+
+ cd "$CATALINA_HOME/bin"
+
+ memorize_pid # This lets monitoring continue to work reliably
+
+ echo "`date "+%Y/%m/%d %T"`: stop ###########################" >> "$TOMCAT_CONSOLE"
+
+ if [ "$TOMCAT_START_SCRIPT" = "$CATALINA_HOME/bin/catalina.sh" ]; then
+ TOMCAT_STOP_OPTS="$STOP_TIMEOUT -force"
+ fi
+ stop_time=$(date +%s)
+ attemptTomcatCommand stop $TOMCAT_STOP_OPTS
+
+ lapse_sec=0
+ while isalive_tomcat; do
+ sleep 1
+ lapse_sec=`expr $(date +%s) - $stop_time`
+ if [ $lapse_sec -ge $STOP_TIMEOUT ]; then
+ ocf_log debug "stop_tomcat[$TOMCAT_NAME]: stop failed, killing with SIGKILL ($lapse_sec)"
+ kill -s KILL $rememberedPID > /dev/null 2>&1
+ fi
+ done
+
+ if ocf_is_true ${CATALINA_ROTATE_LOG}; then
+ rm -f "$CATALINA_PID" "${CATALINA_OUT}"
+ else
+ rm -f "$CATALINA_PID"
+ fi
+ return $OCF_SUCCESS
+}
+
+metadata_tomcat()
+{
+ cat <<END
+<?xml version="1.0"?>
+<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
+<resource-agent name="tomcat" version="1.0">
+<version>1.0</version>
+
+<longdesc lang="en">
+Resource script for Tomcat. It manages a Tomcat instance as a cluster resource.
+</longdesc>
+<shortdesc lang="en">Manages a Tomcat servlet environment instance</shortdesc>
+
+<parameters>
+
+<parameter name="tomcat_name" unique="1" >
+<longdesc lang="en">
+The name of the resource, added as a Java parameter in JAVA_OPTS:
+-Dname=&lt;tomcat_name&gt; to Tomcat process on start. Used to ensure
+process is still running and must be unique.
+</longdesc>
+<shortdesc lang="en">The name of the resource</shortdesc>
+<content type="string" default="${OCF_RESKEY_tomcat_name_default}" />
+</parameter>
+
+<parameter name="script_log" unique="1">
+<longdesc lang="en">
+Log file, used during start and stop operations.
+</longdesc>
+<shortdesc lang="en">Log file</shortdesc>
+<content type="string" default="${OCF_RESKEY_script_log_default}" />
+</parameter>
+
+<parameter name="tomcat_stop_timeout" unique="0">
+<longdesc lang="en">
+Time-out for stop operation. DEPRECATED
+</longdesc>
+<shortdesc lang="en">Time-out for the stop operation. DEPRECATED</shortdesc>
+<content type="integer" default="${OCF_RESKEY_tomcat_stop_timeout_default}" />
+</parameter>
+
+<parameter name="tomcat_suspend_trialcount" unique="0">
+<longdesc lang="en">
+Maximum number of times to retry stop operation before suspending
+and killing Tomcat. DEPRECATED. Does not retry.
+</longdesc>
+<shortdesc lang="en">Max retry count for stop operation. DEPRECATED</shortdesc>
+<content type="integer" default="${OCF_RESKEY_tomcat_suspend_trialcount_default}" />
+</parameter>
+
+<parameter name="tomcat_user" unique="0">
+<longdesc lang="en">
+The user who starts Tomcat.
+</longdesc>
+<shortdesc lang="en">The user who starts Tomcat</shortdesc>
+<content type="string" default="${OCF_RESKEY_tomcat_user_default}" />
+</parameter>
+
+<parameter name="statusurl" unique="0">
+<longdesc lang="en">
+URL for state confirmation.
+</longdesc>
+<shortdesc lang="en">URL for state confirmation</shortdesc>
+<content type="string" default="${OCF_RESKEY_statusurl_default}" />
+</parameter>
+
+<parameter name="max_stop_time" unique="0">
+<longdesc lang="en">
+Number of seconds to wait during a stop before drastic measures
+(force kill) are used on the tomcat process.
+This number MUST be less than your cluster stop timeout for the resource.
+The default value is five seconds before the timeout value of stop operation.
+When it is over this value, it stops a process in kill commands.
+This parameter is only effective on Tomcat 6 or later.
+</longdesc>
+<shortdesc lang="en">The max time it should take for proper shutdown.</shortdesc>
+<content type="integer" default="${OCF_RESKEY_max_stop_time_default}" />
+</parameter>
+
+<parameter name="java_home" unique="0" required="1">
+<longdesc lang="en">
+Home directory of Java.
+</longdesc>
+<shortdesc lang="en">Home directory of Java</shortdesc>
+<content type="string" default="${OCF_RESKEY_java_home_default}" />
+</parameter>
+
+<parameter name="java_opts" unique="0">
+<longdesc lang="en">
+Java JVM options used on start and stop.
+</longdesc>
+<shortdesc lang="en">Java options parsed to JVM, used on start and stop.</shortdesc>
+<content type="string" default="${OCF_RESKEY_java_opts_default}" />
+</parameter>
+
+<parameter name="catalina_home" unique="0" required="1">
+<longdesc lang="en">
+Home directory of Tomcat.
+</longdesc>
+<shortdesc lang="en">Home directory of Tomcat</shortdesc>
+<content type="string" default="${OCF_RESKEY_catalina_home_default}" />
+</parameter>
+
+<parameter name="catalina_base" unique="1">
+<longdesc lang="en">
+Instance directory of Tomcat
+</longdesc>
+<shortdesc lang="en">Instance directory of Tomcat, defaults to catalina_home</shortdesc>
+<content type="string" default="${OCF_RESKEY_catalina_base_default}" />
+</parameter>
+
+<parameter name="catalina_out" unique="1">
+<longdesc lang="en">
+Log file name of Tomcat
+</longdesc>
+<shortdesc lang="en">Log file name of Tomcat, defaults to catalina_base/logs/catalina.out</shortdesc>
+<content type="string" default="${OCF_RESKEY_catalina_out_default}" />
+</parameter>
+
+<parameter name="catalina_pid" unique="1">
+<longdesc lang="en">
+A PID file name for Tomcat.
+</longdesc>
+<shortdesc lang="en">A PID file name for Tomcat</shortdesc>
+<content type="string" default="${OCF_RESKEY_catalina_pid_default}" />
+</parameter>
+
+<parameter name="force_systemd" unique="0" required="0">
+<longdesc lang="en">
+Force use of systemd when available.
+</longdesc>
+<shortdesc lang="en">Force use of systemd when available</shortdesc>
+<content type="string" default="${OCF_RESKEY_force_systemd_default}" />
+</parameter>
+
+<parameter name="tomcat_start_script" unique="0" required="0">
+<longdesc lang="en">
+Absolute path to the custom tomcat start script to use.
+</longdesc>
+<shortdesc lang="en">Tomcat start script location</shortdesc>
+<content type="string" default="${OCF_RESKEY_tomcat_start_script_default}" />
+</parameter>
+
+<parameter name="tomcat_start_opts" unique="0">
+<longdesc lang="en">
+Tomcat start options.
+</longdesc>
+<shortdesc lang="en">Tomcat start options</shortdesc>
+<content type="string" default="${OCF_RESKEY_tomcat_start_opts_default}" />
+</parameter>
+
+<parameter name="catalina_opts" unique="0">
+<longdesc lang="en">
+Catalina options, for the start operation only.
+</longdesc>
+<shortdesc lang="en">Catalina options</shortdesc>
+<content type="string" default="${OCF_RESKEY_catalina_opts_default}" />
+</parameter>
+
+<parameter name="catalina_tmpdir" unique="1">
+<longdesc lang="en">
+Temporary directory of Tomcat
+</longdesc>
+<shortdesc lang="en">Temporary directory of Tomcat, defaults to none</shortdesc>
+<content type="string" default="${OCF_RESKEY_catalina_tmpdir_default}" />
+</parameter>
+
+<parameter name="catalina_rotate_log" unique="0">
+<longdesc lang="en">
+Rotate catalina.out flag.
+</longdesc>
+<shortdesc lang="en">Rotate catalina.out flag</shortdesc>
+<content type="boolean" default="${OCF_RESKEY_catalina_rotate_log_default}" />
+</parameter>
+
+<parameter name="catalina_rotatetime" unique="0">
+<longdesc lang="en">
+catalina.out rotation interval (seconds).
+</longdesc>
+<shortdesc lang="en">catalina.out rotation interval (seconds)</shortdesc>
+<content type="integer" default="${OCF_RESKEY_catalina_rotatetime_default}" />
+</parameter>
+
+<parameter name="java_endorsed_dirs" unique="1">
+<longdesc lang="en">
+Java_endorsed_dirs of tomcat
+</longdesc>
+<shortdesc lang="en">Java_endorsed_dirs of Tomcat, defaults to none</shortdesc>
+<content type="string" default="${OCF_RESKEY_java_endorsed_dirs_default}" />
+</parameter>
+
+<parameter name="logging_config" unique="1">
+<longdesc lang="en">
+Logging_config of tomcat
+</longdesc>
+<shortdesc lang="en">Logging_config of Tomcat, defaults to none</shortdesc>
+<content type="string" default="${OCF_RESKEY_logging_config_default}" />
+</parameter>
+
+<parameter name="logging_manager" unique="1">
+<longdesc lang="en">
+Logging_manager of tomcat
+</longdesc>
+<shortdesc lang="en">Logging_manager of Tomcat, defaults to none.</shortdesc>
+<content type="string" default="${OCF_RESKEY_logging_manager_default}" />
+</parameter>
+
+</parameters>
+
+<actions>
+<action name="start" timeout="60s" />
+<action name="stop" timeout="120s" />
+<action name="status" timeout="60s" />
+<action name="monitor" depth="0" timeout="30s" interval="10s" />
+<action name="meta-data" timeout="5s" />
+<action name="validate-all" timeout="5s"/>
+</actions>
+</resource-agent>
+END
+ return $OCF_SUCCESS
+}
+
+validate_all_tomcat()
+{
+ local port
+ local rc=$OCF_SUCCESS
+ ocf_log info "validate_all_tomcat[$TOMCAT_NAME]"
+
+ check_binary $WGET
+
+ if ! ocf_is_true $OCF_RESKEY_force_systemd && [ -z "${TOMCAT_START_SCRIPT}" ]; then
+ ocf_exit_reason "No default tomcat start script detected. Please specify start script location using the 'tomcat_start_script' option"
+ rc=$OCF_ERR_CONFIGURED
+ fi
+
+ if [ -n "$MAX_STOP_TIME" ] && [ "$MAX_STOP_TIME" -lt 0 ]; then
+ ocf_exit_reason "max_stop_time must be set to a value greater than 0."
+ rc=$OCF_ERR_CONFIGURED
+ fi
+
+ if echo "$RESOURCE_STATUSURL" | grep -q ":[0-9][0-9]*" ; then
+ port=${RESOURCE_STATUSURL##*:}
+ port=${port%%/*}
+ ocf_log debug "Tomcat port is $port"
+ ocf_log debug "grep port=\"$port\" $CATALINA_BASE/conf/server.xml"
+ grep "port=\"$port\"" $CATALINA_BASE/conf/server.xml > /dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ ocf_exit_reason "Your configured status URL specifies a port ($port), but the server does not have a connector listening to that port in $CATALINA_BASE/conf/server.xml"
+ rc=$OCF_ERR_INSTALLED
+ fi
+ fi
+
+ if ocf_is_true ${CATALINA_ROTATE_LOG}; then
+ if [ ! -x "$ROTATELOGS" ]; then
+ ocf_exit_reason "rotatelogs command does not exist."
+ rc=$OCF_ERR_INSTALLED
+ fi
+ fi
+
+ return $rc
+}
+
+# As we stop tomcat, it removes it's own pid file...we still want to know what it was
+memorize_pid()
+{
+ if [ -f $CATALINA_PID ]; then
+ rememberedPID=$(cat $CATALINA_PID)
+ fi
+}
+
+#
+### tomcat RA environment variables
+#
+
+# Parameter defaults
+
+OCF_RESKEY_tomcat_name_default="tomcat"
+OCF_RESKEY_catalina_home_default=""
+OCF_RESKEY_catalina_base_default=""
+
+: ${OCF_RESKEY_tomcat_name=${OCF_RESKEY_tomcat_name_default}}
+: ${OCF_RESKEY_catalina_home=${OCF_RESKEY_catalina_home_default}}
+: ${OCF_RESKEY_catalina_base=${OCF_RESKEY_catalina_base_default}}
+
+# Only default to true for RedHat systems without catalina.sh
+if [ -e "${OCF_RESKEY_catalina_home}/bin/catalina.sh" ] || ! is_redhat_based; then
+ OCF_RESKEY_force_systemd_default=0
+else
+ OCF_RESKEY_force_systemd_default=1
+fi
+
+: ${OCF_RESKEY_force_systemd=${OCF_RESKEY_force_systemd_default}}
+
+if [ -z "${OCF_RESKEY_tomcat_start_script}" ]; then
+ if ocf_is_true $OCF_RESKEY_force_systemd && \
+ systemd_is_running; then
+ SYSTEMD=1
+ elif [ -e "${OCF_RESKEY_catalina_home}/bin/catalina.sh" ]; then
+ TOMCAT_START_SCRIPT="${OCF_RESKEY_catalina_home}/bin/catalina.sh"
+ elif [ -e "/usr/sbin/tomcat" ]; then
+ REDIRECT_DEFAULT_CONFIG=1
+ TOMCAT_START_SCRIPT="/usr/sbin/tomcat"
+ elif [ -e "/usr/sbin/tomcat6" ]; then
+ REDIRECT_DEFAULT_CONFIG=1
+ TOMCAT_START_SCRIPT="/usr/sbin/tomcat6"
+ fi
+fi
+
+OCF_RESKEY_script_log_default="/var/log/${OCF_RESKEY_tomcat_name}.log"
+OCF_RESKEY_tomcat_stop_timeout_default=""
+OCF_RESKEY_tomcat_suspend_trialcount_default=""
+OCF_RESKEY_tomcat_user_default="root"
+OCF_RESKEY_statusurl_default="http://127.0.0.1:8080"
+OCF_RESKEY_max_stop_time_default=""
+OCF_RESKEY_java_home_default=""
+OCF_RESKEY_java_opts_default=""
+OCF_RESKEY_catalina_out_default="${OCF_RESKEY_catalina_base-${OCF_RESKEY_catalina_home}}/logs/catalina.out"
+OCF_RESKEY_catalina_pid_default=""
+OCF_RESKEY_tomcat_start_script_default="${TOMCAT_START_SCRIPT}"
+OCF_RESKEY_tomcat_start_opts_default=""
+OCF_RESKEY_catalina_opts_default=""
+OCF_RESKEY_catalina_tmpdir_default=""
+OCF_RESKEY_catalina_rotate_log_default="NO"
+OCF_RESKEY_catalina_rotatetime_default="86400"
+OCF_RESKEY_java_endorsed_dirs_default=""
+OCF_RESKEY_logging_config_default=""
+OCF_RESKEY_logging_manager_default=""
+
+: ${OCF_RESKEY_script_log=${OCF_RESKEY_script_log_default}}
+: ${OCF_RESKEY_tomcat_stop_timeout=${OCF_RESKEY_tomcat_stop_timeout_default}}
+: ${OCF_RESKEY_tomcat_suspend_trialcount=${OCF_RESKEY_tomcat_suspend_trialcount_default}}
+: ${OCF_RESKEY_tomcat_user=${OCF_RESKEY_tomcat_user_default}}
+: ${OCF_RESKEY_statusurl=${OCF_RESKEY_statusurl_default}}
+: ${OCF_RESKEY_max_stop_time=${OCF_RESKEY_max_stop_time_default}}
+: ${OCF_RESKEY_java_home=${OCF_RESKEY_java_home_default}}
+: ${OCF_RESKEY_java_opts=${OCF_RESKEY_java_opts_default}}
+: ${OCF_RESKEY_catalina_out=${OCF_RESKEY_catalina_out_default}}
+: ${OCF_RESKEY_catalina_pid=${OCF_RESKEY_catalina_pid_default}}
+: ${OCF_RESKEY_tomcat_start_script=${OCF_RESKEY_tomcat_start_script_default}}
+: ${OCF_RESKEY_tomcat_start_opts=${OCF_RESKEY_tomcat_start_opts_default}}
+: ${OCF_RESKEY_catalina_opts=${OCF_RESKEY_catalina_opts_default}}
+: ${OCF_RESKEY_catalina_tmpdir=${OCF_RESKEY_catalina_tmpdir_default}}
+: ${OCF_RESKEY_catalina_rotate_log=${OCF_RESKEY_catalina_rotate_log_default}}
+: ${OCF_RESKEY_catalina_rotatetime=${OCF_RESKEY_catalina_rotatetime_default}}
+: ${OCF_RESKEY_java_endorsed_dirs=${OCF_RESKEY_java_endorsed_dirs_default}}
+: ${OCF_RESKEY_logging_config=${OCF_RESKEY_logging_config_default}}
+: ${OCF_RESKEY_logging_manager=${OCF_RESKEY_logging_manager_default}}
+
+COMMAND=$1
+TOMCAT_NAME="${OCF_RESKEY_tomcat_name}"
+TOMCAT_CONSOLE="${OCF_RESKEY_script_log}"
+RESOURCE_TOMCAT_USER="${OCF_RESKEY_tomcat_user}"
+RESOURCE_STATUSURL="${OCF_RESKEY_statusurl}"
+
+JAVA_HOME="${OCF_RESKEY_java_home}"
+JAVA_OPTS="${OCF_RESKEY_java_opts}"
+CATALINA_HOME="${OCF_RESKEY_catalina_home}"
+CATALINA_BASE="${OCF_RESKEY_catalina_base-${OCF_RESKEY_catalina_home}}"
+CATALINA_OUT="${OCF_RESKEY_catalina_out}"
+
+CATALINA_PID=$OCF_RESKEY_catalina_pid
+if [ -z "$CATALINA_PID" ] && [ "$__OCF_ACTION" = "start" ]; then
+ mkdir -p "${HA_RSCTMP}/${TOMCAT_NAME}_tomcatstate/"
+ if [ "${RESOURCE_TOMCAT_USER}" != "root" ]; then
+ chown ${RESOURCE_TOMCAT_USER} "${HA_RSCTMP}/${TOMCAT_NAME}_tomcatstate/"
+ fi
+ CATALINA_PID="${HA_RSCTMP}/${TOMCAT_NAME}_tomcatstate/catalina.pid"
+fi
+
+MAX_STOP_TIME="${OCF_RESKEY_max_stop_time}"
+
+TOMCAT_START_OPTS="${OCF_RESKEY_tomcat_start_opts}"
+TOMCAT_START_SCRIPT="${OCF_RESKEY_tomcat_start_script}"
+CATALINA_OPTS="-Dname=$TOMCAT_NAME ${OCF_RESKEY_catalina_opts}"
+CATALINA_TMPDIR="${OCF_RESKEY_catalina_tmpdir}"
+CATALINA_ROTATE_LOG="${OCF_RESKEY_catalina_rotate_log}"
+CATALINA_ROTATETIME="${OCF_RESKEY_catalina_rotatetime}"
+JAVA_ENDORSED_DIRS="${OCF_RESKEY_java_endorsed_dirs}"
+LOGGING_CONFIG="${OCF_RESKEY_logging_config}"
+LOGGING_MANAGER="${OCF_RESKEY_logging_manager}"
+
+LSB_STATUS_STOPPED=3
+if [ $# -ne 1 ]; then
+ usage
+ exit $OCF_ERR_ARGS
+fi
+case "$COMMAND" in
+ meta-data) metadata_tomcat; exit $OCF_SUCCESS;;
+ help|usage) usage; exit $OCF_SUCCESS;;
+esac
+
+if [ ! -d "$JAVA_HOME" -o ! -d "$CATALINA_HOME" -o ! -d "$CATALINA_BASE" ]; then
+ case $COMMAND in
+ stop) exit $OCF_SUCCESS;;
+ monitor) exit $OCF_NOT_RUNNING;;
+ status) exit $LSB_STATUS_STOPPED;;
+ esac
+ ocf_exit_reason "JAVA_HOME or CATALINA_HOME or CATALINA_BASE does not exist."
+ exit $OCF_ERR_INSTALLED
+fi
+
+export JAVA_HOME JAVA_OPTS CATALINA_HOME CATALINA_BASE CATALINA_OUT CATALINA_PID CATALINA_OPTS CATALINA_TMPDIR JAVA_ENDORSED_DIRS LOGGING_CONFIG LOGGING_MANAGER
+
+JAVA=${JAVA_HOME}/bin/java
+
+if [ ! -x "$JAVA" ]; then
+ case $COMMAND in
+ stop) exit $OCF_SUCCESS;;
+ monitor) exit $OCF_NOT_RUNNING;;
+ status) exit $LSB_STATUS_STOPPED;;
+ esac
+ ocf_exit_reason "java command does not exist."
+ exit $OCF_ERR_INSTALLED
+fi
+
+ROTATELOGS=""
+if ocf_is_true ${CATALINA_ROTATE_LOG}; then
+ # Look for rotatelogs/rotatelogs2
+ if [ -x /usr/sbin/rotatelogs ]; then
+ ROTATELOGS=/usr/sbin/rotatelogs
+ elif [ -x /usr/sbin/rotatelogs2 ]; then
+ ROTATELOGS=/usr/sbin/rotatelogs2
+ fi
+fi
+
+#
+# ------------------
+# the main script
+# ------------------
+#
+case "$COMMAND" in
+ start)
+ ocf_log debug "[$TOMCAT_NAME] Enter tomcat start"
+ start_tomcat
+ func_status=$?
+ ocf_log debug "[$TOMCAT_NAME] Leave tomcat start $func_status"
+ exit $func_status
+ ;;
+ stop)
+ ocf_log debug "[$TOMCAT_NAME] Enter tomcat stop"
+ stop_tomcat
+ func_status=$?
+ ocf_log debug "[$TOMCAT_NAME] Leave tomcat stop $func_status"
+ exit $func_status
+ ;;
+ status)
+ if monitor_tomcat; then
+ echo tomcat instance $TOMCAT_NAME is running
+ exit $OCF_SUCCESS
+ else
+ echo tomcat instance $TOMCAT_NAME is stopped
+ exit $OCF_NOT_RUNNING
+ fi
+ exit $?
+ ;;
+ monitor)
+ #ocf_log debug "[$TOMCAT_NAME] Enter tomcat monitor"
+ monitor_tomcat
+ func_status=$?
+ #ocf_log debug "[$TOMCAT_NAME] Leave tomcat monitor $func_status"
+ exit $func_status
+ ;;
+ meta-data)
+ metadata_tomcat
+ exit $?
+ ;;
+ validate-all)
+ validate_all_tomcat
+ exit $?
+ ;;
+ usage|help)
+ usage
+ exit $OCF_SUCCESS
+ ;;
+ *)
+ usage
+ exit $OCF_ERR_UNIMPLEMENTED
+ ;;
+esac
+