diff --git a/heartbeat/tomcat b/heartbeat/tomcat index 95cc49e..4fafdaa 100755 --- a/heartbeat/tomcat +++ b/heartbeat/tomcat @@ -33,8 +33,8 @@ # 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_home/logs/catalina.out -# OCF_RESKEY_catalina_pid - A PID file name of Tomcat. Default is OCF_RESKEY_catalina_home/logs/catalina.pid +# 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. @@ -86,11 +86,14 @@ isalive_tomcat() # 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, use that + # 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" - # race conditions on PID file being removed by stopping tomcat... - pid=`head -n 1 $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 @@ -103,6 +106,22 @@ isalive_tomcat() } ############################################################################ +# 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 +} + +############################################################################ # Check tomcat process and service availability monitor_tomcat() { @@ -110,32 +129,51 @@ monitor_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 } ############################################################################ +# Startup rotatelogs process +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() { - # Look for rotatelogs/rotatelogs2 - if [ -x /usr/sbin/rotatelogs ]; then - ROTATELOGS=/usr/sbin/rotatelogs - elif [ -x /usr/sbin/rotatelogs2 ]; then - ROTATELOGS=/usr/sbin/rotatelogs2 - else - ocf_log warn "rotatelogs command not found." - return 1 + # 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_log err "$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_HOME"/temp/* "$CATALINA_OUT" + 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 - # -s is required because tomcat5.5's login shell is /bin/false - su - -s /bin/sh $RESOURCE_TOMCAT_USER \ - -c "$ROTATELOGS -l \"$CATALINA_HOME/logs/catalina_%F.log\" $CATALINA_ROTATETIME" \ - < "$CATALINA_OUT" > /dev/null 2>&1 & + start_rotatelogs } ############################################################################ @@ -154,16 +192,25 @@ cat<<-END_TOMCAT_COMMAND export JAVA_ENDORSED_DIRS="${JAVA_ENDORSED_DIRS}" export LOGGING_CONFIG="${LOGGING_CONFIG}" export LOGGING_MANAGER="${LOGGING_MANAGER}" - $CATALINA_HOME/bin/catalina.sh $@ + export TOMCAT_CFG=${TOMCAT_CFG} + $TOMCAT_START_SCRIPT $@ END_TOMCAT_COMMAND } attemptTomcatCommand() { - if [ "$RESOURCE_TOMCAT_USER" = RUNASIS ]; then - "$CATALINA_HOME/bin/catalina.sh" $@ >> "$TOMCAT_CONSOLE" 2>&1 + if [ -n "$REDIRECT_DEFAULT_CONFIG" ]; then + export TOMCAT_CFG=$(mktemp ${HA_RSCTMP}/tomcat-tmp-XXXXX.cfg) + fi + + if [ "$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 } ############################################################################ @@ -175,7 +222,7 @@ start_tomcat() validate_all_tomcat || exit $? monitor_tomcat - if [ $? = $OCF_SUCCESS ]; then + if [ $? -eq $OCF_SUCCESS ]; then return $OCF_SUCCESS fi @@ -183,12 +230,13 @@ start_tomcat() rm -f $CATALINA_PID #ocf_log debug "catalina.out rotation FLG = ${CATALINA_ROTATE_LOG}" - if [ ${CATALINA_ROTATE_LOG} = "YES" ]; then + if ocf_is_true ${CATALINA_ROTATE_LOG}; then rotate_catalina_out - if [ $? = 0 ]; then + if [ $? -eq 0 ]; then ocf_log debug "Rotate catalina.out succeeded." else - ocf_log warn "Rotate catalina.out failed. Starting tomcat without catalina.out rotation." + ocf_log err "Rotate catalina.out failed. Avoid starting tomcat without catalina.out rotation." + return $OCF_ERR_GENERIC fi fi @@ -199,7 +247,7 @@ start_tomcat() while true; do monitor_tomcat - if [ $? = $OCF_SUCCESS ]; then + if [ $? -eq $OCF_SUCCESS ]; then break fi ocf_log debug "start_tomcat[$TOMCAT_NAME]: retry monitor_tomcat" @@ -213,7 +261,14 @@ start_tomcat() # Stop Tomcat stop_tomcat() { - RA_TIMEOUT=$((OCF_RESKEY_CRM_meta_timeout/1000)) + 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 @@ -232,17 +287,23 @@ stop_tomcat() echo "`date "+%Y/%m/%d %T"`: stop ###########################" >> "$TOMCAT_CONSOLE" - attemptTomcatCommand stop $STOP_TIMEOUT -force + 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 $lapse_sec + 1` - ocf_log debug "stop_tomcat[$TOMCAT_NAME]: stop failed, killing with SIGKILL ($lapse_sec)" - kill -KILL $rememberedPID + 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 [ ${CATALINA_ROTATE_LOG} = "YES" ]; then + if ocf_is_true ${CATALINA_ROTATE_LOG}; then rm -f "$CATALINA_PID" "${CATALINA_OUT}" else rm -f "$CATALINA_PID" @@ -305,7 +366,7 @@ and killing Tomcat. DEPRECATED. Does not retry. The user who starts Tomcat. The user who starts Tomcat - + @@ -345,7 +406,7 @@ Java JVM options used on start and stop. - + Home directory of Tomcat. @@ -365,7 +426,7 @@ Instance directory of Tomcat Log file name of Tomcat -Log file name of Tomcat, defaults to catalina_home/logs/catalina.out +Log file name of Tomcat, defaults to catalina_base/logs/catalina.out @@ -377,6 +438,14 @@ A PID file name for Tomcat. + + +Absolute path to the custom tomcat start script to use. + +Tomcat start script location + + + Tomcat start options. @@ -406,7 +475,7 @@ Temporary directory of Tomcat Rotate catalina.out flag. Rotate catalina.out flag - + @@ -458,46 +527,42 @@ END validate_all_tomcat() { + local port + local rc=$OCF_SUCCESS ocf_log info "validate_all_tomcat[$TOMCAT_NAME]" - misconfigured=0 - notinstalled=0 - wrongpermissions=0 - check_binary $WGET + if [ -z "${TOMCAT_START_SCRIPT}" ]; then + ocf_log err "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_log err "max_stop_time must be set to a value greater than 0." - misconfigured=1 + rc=$OCF_ERR_CONFIGURED fi - if [[ "$RESOURCE_STATUSURL" =~ :[0-9][0-9]* ]]; then + 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_HOME/conf/server.xml" - if [ "$port" -gt 0 ]; then - grep "port=\"$port\"" $CATALINA_HOME/conf/server.xml > /dev/null 2>&1 - if [ $? -ne 0 ]; then - ocf_log err "Your configured status URL specifies a port ($port), but the server does not have a connector listening to that port in $CATALINA_HOME/conf/server.xml" - notinstalled=1 - fi + 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_log err "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 [ $misconfigured -gt 0 ]; then - return $OCF_ERR_CONFIGURED - fi - - if [ $notinstalled -gt 0 ]; then - return $OCF_ERR_INSTALLED - fi - - if [ $wrongpermissions -gt 0 ]; then - return $OCF_ERR_PERM + if ocf_is_true ${CATALINA_ROTATE_LOG}; then + if [ ! -x "$ROTATELOGS" ]; then + ocf_log err "rotatelogs command does not exist." + rc=$OCF_ERR_INSTALLED + fi fi - return $OCF_SUCCESS + return $rc } # As we stop tomcat, it removes it's own pid file...we still want to know what it was @@ -515,18 +580,28 @@ memorize_pid() COMMAND=$1 TOMCAT_NAME="${OCF_RESKEY_tomcat_name-tomcat}" TOMCAT_CONSOLE="${OCF_RESKEY_script_log-/var/log/$TOMCAT_NAME.log}" -RESOURCE_TOMCAT_USER="${OCF_RESKEY_tomcat_user-RUNASIS}" +RESOURCE_TOMCAT_USER="${OCF_RESKEY_tomcat_user-root}" RESOURCE_STATUSURL="${OCF_RESKEY_statusurl-http://127.0.0.1:8080}" 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_HOME/logs/catalina.out}" -CATALINA_PID="${OCF_RESKEY_catalina_pid-$CATALINA_HOME/logs/catalina.pid}" +CATALINA_OUT="${OCF_RESKEY_catalina_out-$CATALINA_BASE/logs/catalina.out}" + +CATALINA_PID=$OCF_RESKEY_catalina_pid +if [ -z "$CATALINA_PID" ]; 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-NO}" @@ -545,6 +620,15 @@ case "$COMMAND" in help|usage) usage; exit $OCF_SUCCESS;; esac +if [ -z "${TOMCAT_START_SCRIPT}" ]; then + if [ -e "$CATALINA_HOME/bin/catalina.sh" ]; then + TOMCAT_START_SCRIPT="$CATALINA_HOME/bin/catalina.sh" + elif [ -e "/usr/sbin/tomcat" ]; then + REDIRECT_DEFAULT_CONFIG=1 + TOMCAT_START_SCRIPT="/usr/sbin/tomcat" + fi +fi + if [ ! -d "$JAVA_HOME" -o ! -d "$CATALINA_HOME" -o ! -d "$CATALINA_BASE" ]; then case $COMMAND in stop) exit $OCF_SUCCESS;; @@ -569,6 +653,16 @@ if [ ! -x "$JAVA" ]; then 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 diff --git a/tools/ocft/fedora/tomcat b/tools/ocft/fedora/tomcat index 7b1283e..4226329 100644 --- a/tools/ocft/fedora/tomcat +++ b/tools/ocft/fedora/tomcat @@ -13,11 +13,13 @@ CONFIG VARIABLE # Adjust accrding to your configuration catalina_home=/usr/share/tomcat - java_home=/usr/lib/jvm/jre-openjdk + java_home=/usr/lib/jvm/jre + tomcat_user=tomcat CASE-BLOCK required_args_tomcat Env OCF_RESKEY_catalina_home=${catalina_home} Env OCF_RESKEY_java_home=${java_home} + Env OCF_RESKEY_tomcat_user=${tomcat_user} CASE-BLOCK args_clear Unenv OCF_RESKEY_catalina_home @@ -33,22 +35,22 @@ CASE-BLOCK prepare_tomcat # Test CASE # -#CASE "normal start tomcat require_args (user:user)" -# Include prepare_tomcat -# AgentRun start OCF_SUCCESS -# AgentRun monitor OCF_SUCCESS -# AgentRun stop OCF_SUCCESS -# AgentRun monitor OCF_NOT_RUNNING -# Include args_clear +CASE "normal start tomcat require_args (user:user)" + Include prepare_tomcat + AgentRun start OCF_SUCCESS + AgentRun monitor OCF_SUCCESS + AgentRun stop OCF_SUCCESS + AgentRun monitor OCF_NOT_RUNNING + Include args_clear -#CASE "normal start tomcat require_args (user:root)" -# Include prepare_tomcat -# Unenv OCF_RESKEY_tomcat_user -# AgentRun start OCF_SUCCESS -# AgentRun monitor OCF_SUCCESS -# AgentRun stop OCF_SUCCESS -# AgentRun monitor OCF_NOT_RUNNING -# Include args_clear +CASE "normal start tomcat require_args (user:root)" + Include prepare_tomcat + Unenv OCF_RESKEY_tomcat_user + AgentRun start OCF_SUCCESS + AgentRun monitor OCF_SUCCESS + AgentRun stop OCF_SUCCESS + AgentRun monitor OCF_NOT_RUNNING + Include args_clear CASE "error start tomcat no catalina_home" Include prepare_tomcat