summaryrefslogtreecommitdiffstats
path: root/rgmanager/src/resources/ASEHAagent.sh.in
diff options
context:
space:
mode:
Diffstat (limited to 'rgmanager/src/resources/ASEHAagent.sh.in')
-rw-r--r--rgmanager/src/resources/ASEHAagent.sh.in900
1 files changed, 900 insertions, 0 deletions
diff --git a/rgmanager/src/resources/ASEHAagent.sh.in b/rgmanager/src/resources/ASEHAagent.sh.in
new file mode 100644
index 0000000..5fe807b
--- /dev/null
+++ b/rgmanager/src/resources/ASEHAagent.sh.in
@@ -0,0 +1,900 @@
+#!@BASH_SHELL@
+
+#
+# Sybase Availability Agent for Red Hat Cluster v15.0.2
+# Copyright (C) - 2007
+# Sybase, Inc. All rights reserved.
+#
+# Sybase Availability Agent for Red Hat Cluster v15.0.2 is licensed
+# under the GNU General Public License Version 2.
+#
+# Author(s):
+# Jian-ping Hui <jphui@sybase.com>
+#
+# Description: Service script for starting/stopping/monitoring \
+# Sybase Adaptive Server on: \
+# Red Hat Enterprise Linux 5 ES \
+# Red Hat Enterprise Linux 5 AS
+#
+# NOTES:
+#
+# (1) Before running this script, we assume that user has installed
+# Sybase ASE 15.0.2 or higher version on the machine. Please
+# customize your configuration in /etc/cluster/cluster.conf according
+# to your actual environment. We assume the following files exist before
+# you start the service:
+# /$sybase_home/SYBASE.sh
+# /$sybase_home/$sybase_ase/install/RUN_$server_name
+#
+# (2) You can customize the interval value in the meta-data section if needed:
+# <action name="start" timeout="300" />
+# <action name="stop" timeout="300" />
+#
+# <!-- Checks to see if it''s mounted in the right place -->
+# <action name="status" interval="30" timeout="100" />
+# <action name="monitor" interval="30" timeout="100" />
+#
+# <!--Checks to see if we can read from the mountpoint -->
+# <action name="status" depth="10" timeout="100" interval="120" />
+# <action name="monitor" depth="10" timeout="100" interval="120" />
+#
+# <action name="meta-data" timeout="5" />
+# <action name="validate-all" timeout="5" />
+# The timeout value is not supported by Redhat in RHCS5.0.
+#
+# (3) This script should be put under /usr/share/cluster. Its owner should be "root" with
+# execution permission.
+#
+
+. /etc/init.d/functions
+. $(dirname $0)/ocf-shellfuncs
+
+PROG=${0}
+
+export LD_POINTER_GUARD=0
+
+#######################################################################################
+# Declare some variables we will use in the script. Please don't change their values. #
+#######################################################################################
+declare login_string=""
+declare RUNSERVER_SCRIPT=$OCF_RESKEY_sybase_home/$OCF_RESKEY_sybase_ase/install/RUN_$OCF_RESKEY_server_name
+declare CONSOLE_LOG=$OCF_RESKEY_sybase_home/$OCF_RESKEY_sybase_ase/install/$OCF_RESKEY_server_name.log
+
+##################################################################################################
+# This function will be called by rgmanager to get the meta data of resource agent "ASEHAagent". #
+# NEVER CHANGE ANYTHING IN THIS FUNCTION.
+##################################################################################################
+meta_data()
+{
+ cat <<EOT
+<?xml version="1.0" ?>
+<resource-agent name="ASEHAagent" version="rgmanager 2.0">
+ <version>1.0</version>
+
+ <longdesc lang="en">
+ Sybase ASE Failover Instance
+ </longdesc>
+ <shortdesc lang="en">
+ Sybase ASE Failover Instance
+ </shortdesc>
+
+ <parameters>
+ <parameter name="name" unique="1" primary="1">
+ <longdesc lang="en">
+ Instance name of resource agent "ASEHAagent"
+ </longdesc>
+ <shortdesc lang="en">
+ name
+ </shortdesc>
+ <content type="string" />
+ </parameter>
+
+ <parameter name="sybase_home" required="1">
+ <longdesc lang="en">
+ The home directory of sybase products
+ </longdesc>
+ <shortdesc lang="en">
+ SYBASE home directory
+ </shortdesc>
+ <content type="string" />
+ </parameter>
+
+ <parameter name="sybase_ase" required="1">
+ <longdesc lang="en">
+ The directory name under sybase_home where ASE products are installed
+ </longdesc>
+ <shortdesc lang="en">
+ SYBASE_ASE directory name
+ </shortdesc>
+ <content type="string" default="ASE-15_0" />
+ </parameter>
+
+ <parameter name="sybase_ocs" required="1">
+ <longdesc lang="en">
+ The directory name under sybase_home where OCS products are installed, i.e. ASE-15_0
+ </longdesc>
+ <shortdesc lang="en">
+ SYBASE_OCS directory name
+ </shortdesc>
+ <content type="string" default="OCS-15_0" />
+ </parameter>
+
+ <parameter name="server_name" required="1">
+ <longdesc lang="en">
+ The ASE server name which is configured for the HA service
+ </longdesc>
+ <shortdesc lang="en">
+ ASE server name
+ </shortdesc>
+ <content type="string" />
+ </parameter>
+
+ <parameter name="login_file" required="1">
+ <longdesc lang="en">
+ The full path of login file which contains the login/password pair
+ </longdesc>
+ <shortdesc lang="en">
+ Login file
+ </shortdesc>
+ <content type="string" />
+ </parameter>
+
+ <parameter name="interfaces_file" required="1">
+ <longdesc lang="en">
+ The full path of interfaces file which is used to start/access the ASE server
+ </longdesc>
+ <shortdesc lang="en">
+ Interfaces file
+ </shortdesc>
+ <content type="string" />
+ </parameter>
+
+ <parameter name="sybase_user" required="1">
+ <longdesc lang="en">
+ The user who can run ASE server
+ </longdesc>
+ <shortdesc lang="en">
+ Sybase user
+ </shortdesc>
+ <content type="string" default="sybase" />
+ </parameter>
+
+ <parameter name="shutdown_timeout" required="1">
+ <longdesc lang="en">
+ The maximum seconds to wait for the ASE server to shutdown before killing the process directly
+ </longdesc>
+ <shortdesc>
+ Shutdown timeout value
+ </shortdesc>
+ <content type="integer" default="0" />
+ </parameter>
+
+ <parameter name="start_timeout" required="1">
+ <longdesc lang="en">
+ The maximum seconds to wait for an ASE server to complete before determining that the server had failed to start
+ </longdesc>
+ <shortdesc lang="en">
+ Start timeout value
+ </shortdesc>
+ <content type="integer" default="0" />
+ </parameter>
+
+ <parameter name="deep_probe_timeout" required="1">
+ <longdesc lang="en">
+ The maximum seconds to wait for the response of ASE server before determining that the server had no response while running deep probe
+ </longdesc>
+ <shortdesc lang="en">
+ Deep probe timeout value
+ </shortdesc>
+ <content type="integer" default="0" />
+ </parameter>
+ </parameters>
+ <actions>
+ <action name="start" timeout="300" />
+ <action name="stop" timeout="300" />
+
+ <!-- Checks to see if it''s mounted in the right place -->
+ <action name="status" interval="30" timeout="100" />
+ <action name="monitor" interval="30" timeout="100" />
+
+ <!--Checks to see if we can read from the mountpoint -->
+ <action name="status" depth="10" timeout="100" interval="120" />
+ <action name="monitor" depth="10" timeout="100" interval="120" />
+
+ <action name="meta-data" timeout="5" />
+ <action name="validate-all" timeout="5" />
+ </actions>
+
+ <special tag="rgmanager">
+ </special>
+</resource-agent>
+EOT
+}
+
+##################################################################################################
+# Function Name: verify_all #
+# Parameter: None #
+# Return value: #
+# 0 SUCCESS #
+# OCF_ERR_ARGS Parameters are invalid #
+# Description: Do some validation on the user-configurable stuff at the beginning of the script. #
+##################################################################################################
+verify_all()
+{
+ ocf_log debug "ASEHAagent: Start 'verify_all'"
+
+ # Check if the parameter 'sybase_home' is set.
+ if [[ -z "$OCF_RESKEY_sybase_home" ]]
+ then
+ ocf_log err "ASEHAagent: The parameter 'sybase_home' is not set."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the parameter 'sybase_home' is a valid path.
+ if [[ ! -d $OCF_RESKEY_sybase_home ]]
+ then
+ ocf_log err "ASEHAagent: The sybase_home '$OCF_RESKEY_sybase_home' doesn't exist."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the script file SYBASE.sh exists
+ if [[ ! -f $OCF_RESKEY_sybase_home/SYBASE.sh ]]
+ then
+ ocf_log err "ASEHAagent: The file $OCF_RESKEY_sybase_home/SYBASE.sh is required to run this script. Failed to run the script."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the parameter 'sybase_ase' is set.
+ if [[ -z "$OCF_RESKEY_sybase_ase" ]]
+ then
+ ocf_log err "ASEHAagent: The parameter 'sybase_ase' is not set."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the directory /$OCF_RESKEY_sybase_home/$OCF_RESKEY_sybase_ase exists.
+ if [[ ! -d $OCF_RESKEY_sybase_home/$OCF_RESKEY_sybase_ase ]]
+ then
+ ocf_log err "ASEHAagent: The directory '$OCF_RESKEY_sybase_home/$OCF_RESKEY_sybase_ase' doesn't exist."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the parameter 'sybase_ocs' is set.
+ if [[ -z "$OCF_RESKEY_sybase_ocs" ]]
+ then
+ ocf_log err "ASEHAagent: The parameter 'sybase_ocs' is not set."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the directory /$OCF_RESKEY_sybase_home/$OCF_RESKEY_sybase_ocs exists.
+ if [[ ! -d $OCF_RESKEY_sybase_home/$OCF_RESKEY_sybase_ocs ]]
+ then
+ ocf_log err "ASEHAagent: The directory '$OCF_RESKEY_sybase_home/$OCF_RESKEY_sybase_ocs' doesn't exist."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the parameter 'server_name' is set.
+ if [[ -z "$OCF_RESKEY_server_name" ]]
+ then
+ ocf_log err "ASEHAagent: The parameter 'server_name' is not set."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the Run_server file exists.
+ if [[ ! -f $RUNSERVER_SCRIPT ]]
+ then
+ ocf_log err "ASEHAagent: The file $RUNSERVER_SCRIPT doesn't exist. The sybase directory may be incorrect."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the parameter 'login_file' is set.
+ if [[ -z "$OCF_RESKEY_login_file" ]]
+ then
+ ocf_log err "ASEHAagent: The parameter 'login_file' is not set."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the login file exist.
+ if [[ ! -f $OCF_RESKEY_login_file ]]
+ then
+ ocf_log err "ASEHAagent: The login file '$OCF_RESKEY_login_file' doesn't exist."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the parameter 'sybase_user' is set
+ if [[ -z "$OCF_RESKEY_sybase_user" ]]
+ then
+ ocf_log err "ASEHAagent: The parameter 'sybase_user' is not set."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the user 'sybase_user' exist
+ id -u $OCF_RESKEY_sybase_user
+ if [[ $? != 0 ]]
+ then
+ ocf_log err "ASEHAagent: The user '$OCF_RESKEY_sybase_user' doesn't exist in the system."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the parameter 'interfaces_file' is set
+ if [[ -z "$OCF_RESKEY_interfaces_file" ]]
+ then
+ ocf_log err "ASEHAagent: The parameter 'interfaces_file' is not set."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the file 'interfaces_file' exists
+ if [[ ! -f $OCF_RESKEY_interfaces_file ]]
+ then
+ ocf_log err "ASEHAagent: The interfaces file '$OCF_RESKEY_interfaces_file' doesn't exist."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the parameter 'shutdown_timeout' is a valid value
+ if [[ $OCF_RESKEY_shutdown_timeout -eq 0 ]]
+ then
+ ocf_log err "ASEHAagent: The parameter 'shutdown_timeout' is not set. Its value cannot be zero."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the parameter 'start_timeout' is a valid value
+ if [[ $OCF_RESKEY_start_timeout -eq 0 ]]
+ then
+ ocf_log err "ASEHAagent: The parameter 'start_timeout' is not set. Its value cannot be zero."
+ return $OCF_ERR_ARGS
+ fi
+
+ # Check if the parameter 'deep_probe_timeout' is a valid value
+ if [[ $OCF_RESKEY_deep_probe_timeout -eq 0 ]]
+ then
+ ocf_log err "ASEHAagent: The parameter 'deep_probe_timeout' is not set. Its value cannot be zero."
+ return $OCF_ERR_ARGS
+ fi
+
+ ocf_log debug "ASEHAagent: End 'verify_all' successfully."
+
+ return 0
+}
+
+################################################################################################################
+# Function name: get_login_string #
+# Parameter: None #
+# Return value: #
+# 0 SUCCESS #
+# 1 FAIL #
+# Description: Analyze the login_file to format the login string. This function will set the global variable #
+# "login_string". If the login/password is clear text, the "login_string" will become to "-Ulogin #
+# -Ppassword" if there is no error. If there are any errors in this function, the string #
+# "login_string" will be still empty. In current stage, the encrypted string is not supported #
+# because "haisql" is not available on this platform. #
+################################################################################################################
+get_login_string()
+{
+ tmpstring=""
+ login_sting=""
+
+ # Read the first column. The valid value will be "normal" or "encrypted". Any other values are invalid.
+ login_type=`head -1 $OCF_RESKEY_login_file | awk '{print $1}'`
+ if [[ $login_type = "normal" ]]
+ then
+ # The login/password pair is saved in clear text.
+ # Abstract the login/password from the line.
+ tmpstring=`head -1 $OCF_RESKEY_login_file | awk '{print $2}'`
+
+ # Abstract "user" from the string.
+ user=`echo $tmpstring | awk -F'/' '{print $1}'`
+ # Check if the "user" string is NULL. If it is NULL, it means this is not a valid user.
+ if [[ -z $user ]]
+ then
+ ocf_log err "ASEHAagent: Login username is not specified in the file '$OCF_RESKEY_login_file'"
+ return 1
+ fi
+
+ # Abstract "password" from the string.
+ passwd=`echo $tmpstring | awk -F'/' '{print $2}'`
+
+ # Format the "login_string".
+ login_string="-U$user -P$passwd"
+ else
+ # The login_type is invalid value.
+ ocf_log err "ASEHAagent: Login type specified in the file $OCF_RESKEY_login_file is not 'normal' or 'encrypted' which are only supported values."
+ return 1
+ fi
+
+ # The "login_file" has been analyzed successfully. Now, the value of "login_string" contains the login/password information.
+ return 0
+}
+
+##############################################################################################
+# Function name: ase_start #
+# Parameter: None #
+# Return value: #
+# 0 SUCCESS #
+# 1 FAIL #
+# Description: This function is used to start the ASE server in primary or secondary server. #
+##############################################################################################
+ase_start()
+{
+ ocf_log debug "ASEHAagent: Start 'ase_start'"
+
+ # Check if the server is running. If yes, return SUCCESS directly. Otherwise, continue the start work.
+ ase_is_running
+ if [[ $? = 0 ]]
+ then
+ # The server is running.
+ ocf_log info "ASEHAagent: Server is running. Start is success."
+ return 0
+ fi
+
+ # The server is not running. We need to start it.
+ # If the log file existed, delete it.
+ if [[ -f $CONSOLE_LOG ]]
+ then
+ rm -f $CONSOLE_LOG
+ fi
+
+ ocf_log debug "ASEHAagent: Starting '$OCF_RESKEY_server_name'..."
+
+ # Run runserver script to start the server. Since this script will be run by root and ASE server
+ # needs to be run by another user, we need to change the user to sybase_user first. Then, run
+ # the script to start the server.
+ su $OCF_RESKEY_sybase_user -c ksh << EOF
+ # set required SYBASE environment by running SYBASE.sh.
+ . $OCF_RESKEY_sybase_home/SYBASE.sh
+ # Run the RUNSERVER_SCRIPT to start the server.
+ . $RUNSERVER_SCRIPT > $CONSOLE_LOG 2>&1 &
+EOF
+
+ # Monitor every 1 seconds if the server has
+ # recovered, until RECOVERY_TIMEOUT.
+ t=0
+ while [[ $t -le $OCF_RESKEY_start_timeout ]]
+ do
+ grep -s "Recovery complete." $CONSOLE_LOG > /dev/null 2>&1
+ if [[ $? != 0 ]]
+ then
+ # The server has not completed the recovery. We need to continue to monitor the recovery
+ # process.
+ t=`expr $t + 1`
+ else
+ # The server has completed the recovery.
+ ocf_log info "ASEHAagent: ASE server '$OCF_RESKEY_server_name' started successfully."
+ break
+ fi
+ sleep 1
+ done
+
+ # If $t is larger than start_timeout, it means the ASE server cannot start in given time. Otherwise, it
+ # means the ASE server has started successfully.
+ if [[ $t -gt $OCF_RESKEY_start_timeout ]]
+ then
+ # The server cannot start in specified time. We think the start is failed.
+ ocf_log err "ASEHAagent: Failed to start ASE server '$OCF_RESKEY_server_name'. Please check the server error log $CONSOLE_LOG for possible problems."
+ return 1
+ fi
+
+ ocf_log debug "ASEHAagent: End 'ase_start' successfully."
+
+ return 0
+}
+
+#############################################################################################
+# Function name: ase_stop #
+# Parameter: None #
+# Return value: #
+# 0 SUCCESS #
+# 1 FAIL #
+# Description: This function is used to stop the ASE server in primary or secondary server. #
+#############################################################################################
+ase_stop()
+{
+ ocf_log debug "ASEHAagent: Start 'ase_stop'"
+
+ # Check if the ASE server is still running.
+ ase_is_running
+ if [[ $? != 0 ]]
+ then
+ # The ASE server is not running. We need not to shutdown it.
+ ocf_log info "ASEHAagent: The dataserver $OCF_RESKEY_server_name is not running."
+ return 0
+ fi
+
+ # Call get_login_string() to parse the login/password string
+ get_login_string
+ if [[ $? = 1 ]]
+ then
+ # The login account cannot be used. So we will kill the process directly.
+ ocf_log info "ASEHAagent: Cannot parse the login file $OCF_RESKEY_login_file. Kill the processes of ASE directly."
+ # Kill the OS processes immediately.
+ kill_ase 0
+ return $?
+ fi
+
+ # Just in case things are hung, start a process that will wait for the
+ # timeout period, then kill any remaining porcesses. We'll need to
+ # monitor this process (set -m), so we can terminate it later if it is
+ # not needed.
+ set -m
+ $PROG kill &
+ KILL_PID=$! # If successful, we will also terminate watchdog process
+
+ # Run "shutdown with nowait" from isql command line to shutdown the server
+ su $OCF_RESKEY_sybase_user -c ksh << EOF
+ # set required SYBASE environment by running SYBASE.sh.
+ . $OCF_RESKEY_sybase_home/SYBASE.sh
+ # Run "shutdown with nowait" to shutdown the server immediately.
+ (echo "use master" ; echo go ; echo "shutdown with nowait"; echo go) | \
+ \$SYBASE/\$SYBASE_OCS/bin/isql $login_string -S$OCF_RESKEY_server_name -I$OCF_RESKEY_interfaces_file &
+EOF
+
+ sleep 5
+
+ # Check if the server has been shut down successfully
+ t=0
+ while [[ $t -lt $OCF_RESKEY_shutdown_timeout ]]
+ do
+ # Search "ueshutdown: exiting" in the server log. If found, it means the server has been shut down.
+ # Otherwise, we need to wait.
+ tail $CONSOLE_LOG | grep "ueshutdown: exiting" > /dev/null 2>&1
+ if [[ $? != 0 ]]
+ then
+ # The shutdown is still in processing. Wait...
+ sleep 2
+ t=`expr $t+2`
+ else
+ # The shutdown is success.
+ ocf_log info "ASEHAagent: ASE server '$OCF_RESKEY_server_name' shutdown with isql successfully."
+ break
+ fi
+ done
+
+ # If $t is larger than shutdown_timeout, it means the ASE server cannot be shut down in given time. We need
+ # to wait for the background kill process to kill the OS processes directly.
+ if [[ $t -ge $OCF_RESKEY_shutdown_timeout ]]
+ then
+ ocf_log err "ASEHAagent: Shutdown of '$OCF_RESKEY_server_name' from isql failed. Server is either down or unreachable."
+ fi
+
+ # Here, the ASE server has been shut down by isql command or killed by background process. We need to do
+ # further check to make sure all processes have gone away before saying shutdown is complete. This stops the
+ # other node from starting up the package before it has been stopped and the file system has been unmounted.
+
+ # Get all processes ids from log file
+ declare -a ENGINE_ALL=(`sed -n -e '/engine /s/^.*os pid \([0-9]*\).*online$/\1/p' $CONSOLE_LOG`)
+ typeset -i num_procs=${#ENGINE_ALL[@]}
+
+ # We cannot find any process id from log file. It may be because the log file is corrupted or be deleted.
+ # In this case, we determine the shutdown is failed.
+ if [[ "${ENGINE_ALL[@]}" = "" ]]
+ then
+ ocf_log err "ASEHAagent: Unable to find the process id from $CONSOLE_LOG."
+ ocf_log err "ASEHAagent: Stop ASE server failed."
+ return 1
+ fi
+
+ # Monitor the system processes to make sure all ASE related processes have gone away.
+ while true
+ do
+ # To every engine process, search it in system processes list. If it is not in the
+ # list, it means this process has gone away. Otherwise, we need to wait for it is
+ # killed by background process.
+ for i in ${ENGINE_ALL[@]}
+ do
+ ps -fu $OCF_RESKEY_sybase_user | awk '{print $2}' | grep $i | grep -v grep
+ if [[ $? != 0 ]]
+ then
+ ocf_log debug "ASEHAagent: $i process has stopped."
+ c=0
+ while (( c < $num_procs ))
+ do
+ if [[ ${ENGINE_ALL[$c]} = $i ]]
+ then
+ unset ENGINE_ALL[$c]
+ c=$num_procs
+ fi
+ (( c = c + 1 ))
+ done
+ fi
+ done
+
+ # To here, all processes should have gone away.
+ if [[ ${ENGINE_ALL[@]} = "" ]]
+ then
+ #
+ # Looks like shutdown was successful, so kill the
+ # script to kill any hung processes, which we started earlier.
+ # Check to see if the script is still running. If jobs
+ # returns that the script is done, then we don't need to kill
+ # it.
+ #
+ job=$(jobs | grep -v Done)
+ if [[ ${job} != "" ]]
+ then
+ ocf_log debug "ASEHAagent: Killing the kill_ase script."
+
+ kill -15 $KILL_PID > /dev/null 2>&1
+ fi
+ break
+ fi
+ sleep 5
+ done
+
+ ocf_log debug "ASEHAagent: End 'ase_stop'."
+
+ return 0
+}
+
+####################################################################################
+# Function name: ase_is_running #
+# Parameter: None #
+# Return value: #
+# 0 ASE server is running #
+# 1 ASE server is not running or there are errors #
+# Description: This function is used to check if the ASE server is still running . #
+####################################################################################
+ase_is_running()
+{
+ # If the error log doesn't exist, we can say there is no ASE is running.
+ if [[ ! -f $CONSOLE_LOG ]]
+ then
+ return 1
+ fi
+
+ # The error log file exists. Check if the engine 0 is alive.
+ ENGINE_0=(`sed -n -e '/engine 0/s/^.*os pid \([0-9]*\).*online$/\1/p' $CONSOLE_LOG`)
+ if [[ "$ENGINE_0" = "" ]]
+ then
+ # The engine 0 is down.
+ return 1
+ else
+ kill -s 0 $ENGINE_0 > /dev/null 2>&1
+ if [[ $? != 0 ]]
+ then
+ # The engine 0 is not running.
+ return 1
+ else
+ # The engine 0 is running.
+ return 0
+ fi
+ fi
+
+ return 1
+}
+
+####################################################################################
+# Function name: kill_ase #
+# Parameter: #
+# DELAY The seconds to wait before killing the ASE processes. 0 means #
+# kill the ASE processes immediately. #
+# Return value: None #
+# 1 ASE server is not running or there are errors #
+# Description: This function is used to check if the ASE server is still running . #
+####################################################################################
+kill_ase()
+{
+ ocf_log debug "ASEHAagent: Start 'kill_ase'."
+
+ DELAY=$1
+
+ # Wait for sometime before sending a kill signal.
+ t=0
+ while [[ $t -lt $DELAY ]]
+ do
+ sleep 1
+ t=`expr $t+1`
+ done
+
+ # Get the process ids from log file
+ declare -a ENGINE_ALL=`sed -n -e '/engine /s/^.*os pid \([0-9]*\).*online$/\1/p' $CONSOLE_LOG`
+
+ # If there is no process id found in the log file, we need not to continue.
+ if [[ "${ENGINE_ALL[@]}" = "" ]]
+ then
+ ocf_log err "ASEHAagent: Unable to find the process id from $CONSOLE_LOG."
+ return
+ fi
+
+ # Kill the datasever process(es)
+ for pid in ${ENGINE_ALL[@]}
+ do
+ kill -9 $pid > /dev/null 2>&1
+ if [[ $? != 0 ]]
+ then
+ ocf_log info "ASEHAagent: kill_ase function did NOT find process $pid running."
+ else
+ ocf_log info "ASEHAagent: kill_ase function did find process $pid running. Sent SIGTERM."
+ fi
+ done
+
+ ocf_log debug "ASEHAagent: End 'kill_ase'."
+}
+
+
+#######################################################################################
+# Function name: terminate #
+# Parameter: None #
+# Return value: Always be 1 #
+# Description: This function is called automatically after this script is terminated. #
+#######################################################################################
+terminate()
+{
+ ocf_log debug "ASEHAagent: This monitor script has been signaled to terminate."
+ exit 1
+}
+
+#####################################################################################
+# Function name: ase_status #
+# Parameter: #
+# 0 Level 0 probe. In this level, we just check if engine 0 is alive #
+# 10 Level 10 probe. In this level, we need to probe if the ASE server #
+# still has response. #
+# Return value: #
+# 0 The server is still alive #
+# 1 The server is down #
+# Description: This function is used to check if the ASE server is still running. #
+#####################################################################################
+ase_status()
+{
+ ocf_log debug "ASEHAagent: Start 'ase_status'."
+
+ # Step 1: Check if the engine 0 is alive
+ ase_is_running
+ if [[ $? = 1 ]]
+ then
+ # ASE is down. Return fail to rgmanager to trigger the failover process.
+ ocf_log err "ASEHAagent: ASE server is down."
+ return 1
+ fi
+
+ # ASE process is still alive.
+ # Step2: If this is level 10 probe, We need to check if the ASE server still has response.
+ if [[ $1 -gt 0 ]]
+ then
+ ocf_log debug "ASEHAagent: Need to run deep probe."
+ # Run deep probe
+ deep_probe
+ if [[ $? = 1 ]]
+ then
+ # Deep probe failed. This means the server has been down.
+ ocf_log err "ASEHAagent: Deep probe found the ASE server is down."
+ return 1
+ fi
+ fi
+
+ ocf_log debug "ASEHAagent: End 'ase_status'."
+
+ return 0
+}
+
+####################################################################################
+# Function name: deep_probe #
+# Parameter: None #
+# Return value: #
+# 0 ASE server is alive #
+# 1 ASE server is down #
+# Description: This function is used to run deep probe to make sure the ASE server #
+# still has response. #
+####################################################################################
+deep_probe()
+{
+ declare -i rv
+
+ ocf_log debug "ASEHAagent: Start 'deep_probe'."
+
+ # Declare two temporary files which will be used in this probe.
+ tmpfile1="$(mktemp /tmp/ASEHAagent.1.XXXXXX)"
+ tmpfile2="$(mktemp /tmp/ASEHAagent.2.XXXXXX)"
+
+ # Get the login_string by analyzing the login_file.
+ get_login_string
+ if [[ $? = 1 ]]
+ then
+ # Login string cannot be fetched. Cannot continue the deep probe.
+ ocf_log err "ASEHAagent: Cannot run the deep probe because of incorrect login file $OCF_RESKEY_login_file. Deep probe failed."
+ return 1
+ fi
+
+ rm -f $tmpfile1
+ rm -f $tmpfile2
+
+ # The login file is correct. We have gotten the login account and password from it.
+ # Run isql command in background.
+ su $OCF_RESKEY_sybase_user -c ksh << EOF
+ # set required SYBASE environment by running SYBASE.sh.
+ . $OCF_RESKEY_sybase_home/SYBASE.sh
+ # Run a very simple SQL statement to make sure the server is still ok. The output will be put to
+ # tmpfile1.
+ (echo "select 1"; echo "go") |
+ \$SYBASE/\$SYBASE_OCS/bin/isql $login_string -S$OCF_RESKEY_server_name -I$OCF_RESKEY_interfaces_file -t $OCF_RESKEY_deep_probe_timeout -e -o$tmpfile1 &
+ # Record the isql command process id to temporary file. If the isql is hung, we need this process id
+ # to kill the hung process.
+ echo \$! > $tmpfile2
+EOF
+
+ declare -i t=0
+
+ # Monitor the output file tmpfile1.
+ while [[ $t -lt $OCF_RESKEY_deep_probe_timeout ]]
+ do
+ # If the SQL statement is executed successfully, we will get the following output:
+ # 1> select 1
+ #
+ # -----------
+ # 1
+ #
+ # (1 row affected)
+ # So, we determine if the execution is success by searching the keyword "(1 row affected)".
+ grep "(1 row affected)" $tmpfile1
+ if [[ $? = 0 ]]
+ then
+ ocf_log debug "ASEHAagent: Deep probe sucess."
+ break
+ else
+ sleep 1
+ t=`expr $t+1`
+ fi
+ done
+
+ # If $t is larger than deep_probe_timeout, it means the isql command line cannot finish in given time.
+ # This means the deep probe failed. We need to kill the isql process manually.
+ if [[ $t -ge $OCF_RESKEY_deep_probe_timeout ]]
+ then
+ ocf_log err "ASEHAagent: Deep probe fail. The dataserver has no response."
+
+ # Read the process id of isql process from tmpfile2
+ pid=`cat $tmpfile2 | awk '{print $1}'`
+
+ rm -f $tmpfile1
+ rm -f $tmpfile2
+
+ # Kill the isql process directly.
+ kill -9 $pid
+ return 1
+ fi
+
+ rm -f $tmpfile1
+ rm -f $tmpfile2
+
+ ocf_log debug "ASEHAagent: End 'deep_probe'."
+
+ return 0
+}
+
+trap terminate SIGTERM
+
+#############################
+# Do some real work here... #
+#############################
+case $1 in
+ start)
+ verify_all || exit 1
+ ase_start
+ exit $?
+ ;;
+ stop)
+ verify_all || exit 1
+ ase_stop
+ exit $?
+ ;;
+ status | monitor)
+ verify_all || exit 1
+ ase_status $OCF_CHECK_LEVEL
+ exit $?
+ ;;
+ kill)
+ kill_ase $OCF_RESKEY_shutdown_timeout
+ ;;
+ meta-data)
+ meta_data
+ exit $?
+ ;;
+ validate-all)
+ verify_all
+ exit $?
+ ;;
+ *)
+ echo "Usage: $SCRIPT {start|stop|monitor|status|validate-all|meta-data}"
+ exit $OCF_ERR_UNIMPLEMENTED
+ ;;
+esac
+exit 0
+