[Cluster-devel] cluster/rgmanager/src/resources SAPDatabase SA ...
rmccabe at sourceware.org
rmccabe at sourceware.org
Fri May 11 02:30:28 UTC 2007
CVSROOT: /cvs/cluster
Module name: cluster
Branch: RHEL5
Changes by: rmccabe at sourceware.org 2007-05-11 02:30:27
Modified files:
rgmanager/src/resources: SAPDatabase SAPInstance
Log message:
Convert \r\n line breaks to \n
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/SAPDatabase.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.1&r2=1.1.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/rgmanager/src/resources/SAPInstance.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.1.2.1&r2=1.1.2.2
--- cluster/rgmanager/src/resources/SAPDatabase 2007/05/09 19:07:02 1.1.2.1
+++ cluster/rgmanager/src/resources/SAPDatabase 2007/05/11 02:30:27 1.1.2.2
@@ -1,698 +0,0 @@
-#!/bin/sh
-#
-# SAPDatabase
-#
-# Description: Manages any type of SAP supported database instance
-# as a High-Availability OCF compliant resource.
-#
-# Author: Alexander Krauth, October 2006
-# Support: liunx at sap.com
-# License: GNU General Public License (GPL)
-# Copyright: (c) 2006 Alexander Krauth
-#
-# An example usage:
-# See usage() function below for more details...
-#
-# OCF instance parameters:
-# OCF_RESKEY_SID
-# OCF_RESKEY_DIR_EXECUTABLE (optional, well known directories will be searched by default)
-# OCF_RESKEY_DBTYPE
-# OCF_RESKEY_NETSERVICENAME (optional, non standard name of Oracle Listener)
-# OCF_RESKEY_DBJ2EE_ONLY (optional, default is false)
-# OCF_RESKEY_DIR_BOOTSTRAP (optional, if non standard J2EE server directory)
-# OCF_RESKEY_DIR_SECSTORE (optional, if non standard J2EE secure store directory)
-#
-# ToDo:
-# Remove all the database dependend stuff from the agent and use
-# saphostcontrol daemon as soon as SAP will release it.
-#
-#######################################################################
-# Initialization:
-
-if [ -f /usr/lib/heartbeat/ocf-shellfuncs ]; then
- . /usr/lib/heartbeat/ocf-shellfuncs
-elif [ -f /usr/share/cluster/ocf-shellfuncs ]; then
- . /usr/share/cluster/ocf-shellfuncs
-else
- echo Could not find ocf-shellfuncs!
- exit 1
-fi
-
-#######################################################################
-
-SH=/bin/sh
-
-usage() {
- methods=`sapdatabase_methods`
- methods=`echo $methods | tr ' ' '|'`
- cat <<-!
- usage: $0 ($methods)
-
- $0 manages a SAP database of any type as an HA resource.
- Currently Oracle, MaxDB and DB/2 UDB are supported.
- ABAP databases as well as JAVA only databases are supported.
-
- The 'start' operation starts the instance.
- The 'stop' operation stops the instance.
- The 'status' operation reports whether the instance is running
- The 'monitor' operation reports whether the instance seems to be working
- The 'validate-all' operation reports whether the parameters are valid
- The 'methods' operation reports on the methods $0 supports
-
- !
-}
-
-meta_data() {
- cat <<END
-<?xml version="1.0"?>
-<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
-<resource-agent name="SAPDatabase">
-<version>1.2</version>
-
-<longdesc lang="en">
-Resource script for SAP databases. It manages a SAP database of any type as an HA resource.
-</longdesc>
-<shortdesc lang="en">SAP database resource agent</shortdesc>
-
-<parameters>
- <parameter name="SID" unique="1" required="1">
- <longdesc lang="en">The unique SAP system identifier. e.g. P01</longdesc>
- <shortdesc lang="en">SAP system ID</shortdesc>
- <content type="string" default="" />
- </parameter>
- <parameter name="DIR_EXECUTABLE" unique="1" required="0">
- <longdesc lang="en">The full qualified path where to find sapstartsrv and sapcontrol.</longdesc>
- <shortdesc lang="en">path of sapstartsrv and sapcontrol</shortdesc>
- <content type="string" default="" />
- </parameter>
- <parameter name="DBTYPE" unique="1" required="1">
- <longdesc lang="en">The name of the database vendor you use. Set either: ORA,DB6,ADA</longdesc>
- <shortdesc lang="en">database vendor</shortdesc>
- <content type="string" default="" />
- </parameter>
- <parameter name="NETSERVICENAME" unique="1" required="0">
- <longdesc lang="en">The Oracle TNS listener name.</longdesc>
- <shortdesc lang="en">listener name</shortdesc>
- <content type="string" default="" />
- </parameter>
- <parameter name="DBJ2EE_ONLY" unique="1" required="0">
- <longdesc lang="en">If you do not have a ABAP stack installed in the SAP database, set this to TRUE</longdesc>
- <shortdesc lang="en">only JAVA stack installed</shortdesc>
- <content type="boolean" default="false"/>
- </parameter>
- <parameter name="DIR_BOOTSTRAP" unique="1" required="0">
- <longdesc lang="en">The full qualified path where to find the J2EE instance bootstrap directory. e.g. /usr/sap/P01/J00/j2ee/cluster/bootstrap</longdesc>
- <shortdesc lang="en">path to j2ee bootstrap directory</shortdesc>
- <content type="string" default="" />
- </parameter>
- <parameter name="DIR_SECSTORE" unique="1" required="0">
- <longdesc lang="en">The full qualified path where to find the J2EE security store directory. e.g. /usr/sap/P01/SYS/global/security/lib/tools</longdesc>
- <shortdesc lang="en">path to j2ee secure store directory</shortdesc>
- <content type="string" default="" />
- </parameter>
-</parameters>
-
-<actions>
-<action name="start" timeout="1800" />
-<action name="stop" timeout="1800" />
-<action name="status" timeout="60" />
-<action name="monitor" depth="0" timeout="60" interval="120" start-delay="180" />
-<action name="validate-all" timeout="5" />
-<action name="meta-data" timeout="5" />
-<action name="methods" timeout="5" />
-</actions>
-</resource-agent>
-END
-}
-
-trap_handler() {
- rm -f $TEMPFILE
- exit $OCF_ERR_GENERIC
-}
-
-
-#
-# listener_start: Start the given listener
-#
-listener_start() {
- orasid="ora`echo $SID | tr [:upper:] [:lower:]`"
- rc=$OCF_SUCCESS
- output=`echo "lsnrctl start $NETSERVICENAME" | su - $orasid 2>&1`
- if [ $? -eq 0 ]
- then
- ocf_log info "Oracle Listener $NETSERVICENAME started: $output"
- rc=$OCF_SUCCESS
- else
- ocf_log err "Oracle Listener $NETSERVICENAME start failed: $output"
- rc=$OCF_ERR_GENERIC
- fi
- return $rc
-}
-
-#
-# listener_stop: Stop the given listener
-#
-listener_stop() {
- orasid="ora`echo $SID | tr [:upper:] [:lower:]`"
- rc=$OCF_SUCCESS
- if
- listener_status
- then
- : listener is running, trying to stop it later...
- else
- return $OCF_SUCCESS
- fi
- output=`echo "lsnrctl stop $NETSERVICENAME" | su - $orasid 2>&1`
- if [ $? -eq 0 ]
- then
- ocf_log info "Oracle Listener $NETSERVICENAME stopped: $output"
- else
- ocf_log err "Oracle Listener $NETSERVICENAME stop failed: $output"
- rc=$OCF_ERR_GENERIC
- fi
- return $rc
-}
-
-#
-# listener_status: is the given listener running?
-#
-listener_status() {
- orasid="ora`echo $SID | tr [:upper:] [:lower:]`"
- # Note: ps cuts off it's output at column $COLUMNS, so "ps -ef" can not be used here
- # as the output might be to long.
- cnt=`ps efo args --user $orasid | grep $NETSERVICENAME | grep -c tnslsnr`
- if [ $cnt -eq 1 ]
- then
- rc=$OCF_SUCCESS
- else
- ocf_log info "listener process not running for $NETSERVICENAME for $SID"
- rc=$OCF_ERR_GENERIC
- fi
- return $rc
-}
-
-#
-# x_server_start: Start the given x_server
-#
-x_server_start() {
- rc=$OCF_SUCCESS
- output=`echo "x_server start" | su - $sidadm 2>&1`
- if [ $? -eq 0 ]
- then
- ocf_log info "MaxDB x_server start: $output"
- rc=$OCF_SUCCESS
- else
- ocf_log err "MaxDB x_server start failed: $output"
- rc=$OCF_ERR_GENERIC
- fi
- return $rc
-}
-
-#
-# x_server_stop: Stop the x_server
-#
-x_server_stop() {
- rc=$OCF_SUCCESS
- output=`echo "x_server stop" | su - $sidadm 2>&1`
- if [ $? -eq 0 ]
- then
- ocf_log info "MaxDB x_server stop: $output"
- else
- ocf_log err "MaxDB x_server stop failed: $output"
- rc=$OCF_ERR_GENERIC
- fi
- return $rc
-}
-
-#
-# x_server_status: is the x_server running?
-#
-x_server_status() {
- sdbuser=`ls -ld /sapdb/$SID | awk '{print $3}'`
- # Note: ps cuts off it's output at column $COLUMNS, so "ps -ef" can not be used here
- # as the output might be to long.
- cnt=`ps efo args --user $sdbuser | grep -c vserver`
- if [ $cnt -eq 1 ]
- then
- rc=$OCF_SUCCESS
- else
- ocf_log info "x_server process not running"
- rc=$OCF_ERR_GENERIC
- fi
- return $rc
-}
-
-#
-# oracle_stop: Stop the Oracle database without any condition
-#
-oracle_stop() {
-echo '#!/bin/sh
-LOG=$HOME/stopdb.log
-date > $LOG
-
-if [ -x "${ORACLE_HOME}/bin/sqlplus" ]
-then
- SRVMGRDBA_EXE="${ORACLE_HOME}/bin/sqlplus"
-else
- echo "Can not find executable sqlplus" >> $LOG
- exit 1
-fi
-
-$SRVMGRDBA_EXE /NOLOG >> $LOG << !
-connect / as sysdba
-shutdown immediate
-exit
-!
-rc=$?
-cat $LOG
-exit $rc' > $TEMPFILE
-
-chmod 700 $TEMPFILE
-chown $sidadm $TEMPFILE
-
-su - $sidadm -c $TEMPFILE
-retcode=$?
-rm -f $TEMPFILE
-
-if [ $retcode -eq 0 ]; then
- sapdatabase_status
- if [ $? -ne $OCF_NOT_RUNNING ]; then
- retcode=1
- fi
-fi
-
-return $retcode
-}
-
-#
-# maxdb_stop: Stop the MaxDB database without any condition
-#
-maxdb_stop() {
-if [ $DBJ2EE_ONLY -eq 1 ]; then
- userkey=c_J2EE
-else
- userkey=c
-fi
-
-echo "#!/bin/sh
-LOG=\$HOME/stopdb.log
-date > \$LOG
-echo \"Stop database with xuserkey >$userkey<\" >> \$LOG
-dbmcli -U ${userkey} db_offline >> \$LOG 2>&1
-exit \$?" > $TEMPFILE
-
-chmod 700 $TEMPFILE
-chown $sidadm $TEMPFILE
-
-su - $sidadm -c $TEMPFILE
-retcode=$?
-rm -f $TEMPFILE
-
-if [ $retcode -eq 0 ]; then
- sapdatabase_status
- if [ $? -ne $OCF_NOT_RUNNING ]; then
- retcode=1
- fi
-fi
-
-return $retcode
-}
-
-#
-# db6udb_stop: Stop the DB2/UDB database without any condition
-#
-db6udb_stop() {
-echo '#!/bin/sh
-LOG=$HOME/stopdb.log
-date > $LOG
-echo "Shut down the database" >> $LOG
-$INSTHOME/sqllib/bin/db2 deactivate database $DB2DBDFT |tee -a $LOG 2>&1
-$INSTHOME/sqllib/adm/db2stop force |tee -a $LOG 2>&1
-exit $?' > $TEMPFILE
-
-chmod 700 $TEMPFILE
-chown $sidadm $TEMPFILE
-
-su - $sidadm -c $TEMPFILE
-retcode=$?
-rm -f $TEMPFILE
-
-if [ $retcode -eq 0 ]; then
- sapdatabase_status
- if [ $? -ne $OCF_NOT_RUNNING ]; then
- retcode=1
- fi
-fi
-
-return $retcode
-}
-
-#
-# methods: What methods/operations do we support?
-#
-sapdatabase_methods() {
- cat <<-!
- start
- stop
- status
- monitor
- validate-all
- methods
- meta-data
- usage
- !
-}
-
-
-#
-# sapdatabase_start : Start the SAP database
-#
-sapdatabase_start() {
- case $DBTYPE in
- ADA) x_server_start
- ;;
- ORA) listener_start
- ;;
- esac
-
- output=`su - $sidadm -c $SAPSTARTDB`
- if [ $? -eq 0 ]
- then
- ocf_log info "SAP database $SID started: $output"
- rc=$OCF_SUCCESS
- else
- ocf_log err "SAP database $SID start failed: $output"
- rc=$OCF_ERR_GENERIC
- fi
- return $rc
-}
-
-#
-# sapdatabase_stop: Stop the SAP database
-#
-sapdatabase_stop() {
-
- # use of the stopdb kernel script is not possible, because there are to may checks in that
- # script. We want to stop the database regardless of anything.
- #output=`su - $sidadm -c $SAPSTOPDB`
-
- case $DBTYPE in
- ORA) output=`oracle_stop`
- ;;
- ADA) output=`maxdb_stop`
- ;;
- DB6) output=`db6udb_stop`
- ;;
- esac
-
- if [ $? -eq 0 ]
- then
- ocf_log info "SAP database $SID stopped: $output"
- rc=$OCF_SUCCESS
- else
- ocf_log err "SAP database $SID stop failed: $output"
- rc=$OCF_ERR_GENERIC
- fi
-
- case $DBTYPE in
- ORA) listener_stop
- ;;
- ADA) x_server_stop
- ;;
- esac
- return $rc
-}
-
-
-#
-# sapdatabase_monitor: Can the given database instance do anything useful?
-#
-sapdatabase_monitor() {
- rc=$OCF_SUCCESS
-
- case $DBTYPE in
- ADA) x_server_status
- if [ $? -ne $OCF_SUCCESS ]; then x_server_start; fi
- ;;
- ORA) listener_status
- if [ $? -ne $OCF_SUCCESS ]; then listener_start; fi
- ;;
- esac
-
- if [ $DBJ2EE_ONLY -eq 0 ]
- then
- output=`echo "$SAPDBCONNECT -d -w /dev/null" | su $sidadm 2>&1`
- if [ $? -le 4 ]
- then
- rc=$OCF_SUCCESS
- else
- rc=$OCF_NOT_RUNNING
- fi
- else
- DB_JARS=""
- if [ -f "$BOOTSTRAP"/bootstrap.properties ]; then
- DB_JARS=`cat $BOOTSTRAP/bootstrap.properties | grep -i rdbms.driverLocation | sed -e 's/\\\:/:/g' | awk -F= '{print $2}'`
- fi
- IAIK_JCE="$SECSTORE"/iaik_jce.jar
- IAIK_JCE_EXPORT="$SECSTORE"/iaik_jce_export.jar
- EXCEPTION="$BOOTSTRAP"/exception.jar
- LOGGING="$BOOTSTRAP"/logging.jar
- OPENSQLSTA="$BOOTSTRAP"/opensqlsta.jar
- TC_SEC_SECSTOREFS="$BOOTSTRAP"/tc_sec_secstorefs.jar
- JDDI="$BOOTSTRAP"/../server0/bin/ext/jdbdictionary/jddi.jar
- ANTLR="$BOOTSTRAP"/../server0/bin/ext/antlr/antlr.jar
- FRAME="$BOOTSTRAP"/../server0/bin/system/frame.jar
-
- # only start jdbcconnect when all jars available
- if [ -f "$EXCEPTION" -a -f "$LOGGING" -a -f "$OPENSQLSTA" -a -f "$TC_SEC_SECSTOREFS" -a -f "$JDDI" -a -f "$ANTLR" -a -f "$FRAME" -a -f "$SAPDBCONNECT" ]
- then
- output=`eval java -cp ".:$FRAME:$ANTLR:$JDDI:$IAIK_JCE_EXPORT:$IAIK_JCE:$EXCEPTION:$LOGGING:$OPENSQLSTA:$TC_SEC_SECSTOREFS:$DB_JARS:$SAPDBCONNECT" com.sap.inst.jdbc.connect.JdbcCon -sec $SID:$SID`
- if [ $? -le 0 ]
- then
- rc=$OCF_SUCCESS
- else
- rc=$OCF_NOT_RUNNING
- fi
- else
- output="Cannot find all jar files needed for database monitoring."
- rc=$OCF_ERR_GENERIC
- fi
- fi
-
- if [ $rc -ne $OCF_SUCCESS ]
- then
- ocf_log err "The SAP database $SID ist not running: $output"
- fi
- return $rc
-}
-
-
-#
-# sapdatabase_status: Are there any database processes on this host ?
-#
-sapdatabase_status() {
- case $DBTYPE in
- ADA) SEARCH="$SID/db/pgm/kernel"
- SUSER=`ls -ld /sapdb/$SID | awk '{print $3}'`
- SNUM=2
- ;;
- ORA) SEARCH="ora_[a-z][a-z][a-z][a-z]_"
- SUSER="ora`echo $SID | tr [:upper:] [:lower:]`"
- SNUM=4
- ;;
- DB6) SEARCH="db2[a-z][a-z][a-z][a-z][a-z]"
- SUSER="db2`echo $SID | tr [:upper:] [:lower:]`"
- SNUM=5
- ;;
- esac
-
- # Note: ps cuts off it's output at column $COLUMNS, so "ps -ef" can not be used here
- # as the output might be to long.
- cnt=`ps efo args --user $SUSER | grep -c "$SEARCH"`
- if [ $cnt -ge $SNUM ]
- then
- rc=$OCF_SUCCESS
- else
- # ocf_log info "Database Instance $SID is not running on `hostname`"
- rc=$OCF_NOT_RUNNING
- fi
- return $rc
-}
-
-
-#
-# sapdatabase_vaildate: Check the symantic of the input parameters
-#
-sapdatabase_vaildate() {
- rc=$OCF_SUCCESS
- if [ `echo "$SID" | grep -c '^[A-Z][A-Z0-9][A-Z0-9]$'` -ne 1 ]
- then
- ocf_log err "Parsing parameter SID: '$SID' is not a valid system ID!"
- rc=$OCF_ERR_ARGS
- fi
-
- case "$DBTYPE" in
- ORA|ADA|DB6) ;;
- *) ocf_log err "Parsing parameter DBTYPE: '$DBTYPE' is not a supported database type!"
- rc=$OCF_ERR_ARGS ;;
- esac
-
- return $rc
-}
-
-
-#
-# 'main' starts here...
-#
-
-if
- ( [ $# -ne 1 ] )
-then
- usage
- exit $OCF_ERR_ARGS
-fi
-
-# Set a tempfile and make sure to clean it up again
-TEMPFILE="/tmp/SAPDatabase.tmp"
-trap trap_handler INT TERM
-
-# These operations don't require OCF instance parameters to be set
-case "$1" in
- meta-data) meta_data
- exit $OCF_SUCCESS;;
-
- usage) usage
- exit $OCF_SUCCESS;;
-
- methods) sapdatabase_methods
- exit $?;;
-
- *);;
-esac
-
-US=`id -u -n`
-US=`echo $US`
-if
- [ $US != root ]
-then
- ocf_log err "$0 must be run as root"
- exit $OCF_ERR_PERM
-fi
-
-# mandatory parameter check
-if [ -z "$OCF_RESKEY_SID" ]; then
- ocf_log err "Please set OCF_RESKEY_SID to the SAP system id!"
- exit $OCF_ERR_ARGS
-fi
-SID=`echo "$OCF_RESKEY_SID"`
-
-if [ -z "$OCF_RESKEY_DBTYPE" ]; then
- ocf_log err "Please set OCF_RESKEY_DBTYPE to the database vendor specific tag (ORA,ADA,DB6)!"
- exit $OCF_ERR_ARGS
-fi
-DBTYPE="$OCF_RESKEY_DBTYPE"
-
-# optional OCF parameters, we try to guess which directories are correct
-EXESTARTDB="startdb"
-EXESTOPDB="stopdb"
-EXEDBCONNECT="R3trans"
-if [ -z "$OCF_RESKEY_DBJ2EE_ONLY" ]; then
- DBJ2EE_ONLY=0
-else
- case "$OCF_RESKEY_DBJ2EE_ONLY" in
- 1|true|TRUE|yes|YES) DBJ2EE_ONLY=1
- EXESTARTDB="startj2eedb"
- EXESTOPDB="stopj2eedb"
- EXEDBCONNECT="jdbcconnect.jar"
- ;;
- 0|false|FALSE|no|NO) DBJ2EE_ONLY=0;;
- *) ocf_log err "Parsing parameter DBJ2EE_ONLY: '$DBJ2EE_ONLY' is not a boolean value!"
- exit $OCF_ERR_ARGS ;;
- esac
-fi
-
-if [ -z "$OCF_RESKEY_NETSERVICENAME" ]; then
- case "$DBTYPE" in
- ORA|ora) NETSERVICENAME="LISTENER";;
- *) NETSERVICENAME="";;
- esac
-else
- NETSERVICENAME="$OCF_RESKEY_NETSERVICENAME"
-fi
-
-PATHLIST="
-$OCF_RESKEY_DIR_EXECUTABLE
-/usr/sap/$SID/*/exe
-/usr/sap/$SID/SYS/exe/run
-/sapmnt/$SID/exe
-"
-DIR_EXECUTABLE=""
-for EXEPATH in $PATHLIST
-do
- SAPSTARTDB=`which $EXEPATH/$EXESTARTDB 2> /dev/null`
- if [ $? -eq 0 ]
- then
- MYPATH=`echo "$SAPSTARTDB" | head -1`
- MYPATH=`dirname "$MYPATH"`
- if [ -x $MYPATH/$EXESTARTDB -a -x $MYPATH/$EXESTOPDB -a -x $MYPATH/$EXEDBCONNECT ]
- then
- DIR_EXECUTABLE=$MYPATH
- SAPSTARTDB=$MYPATH/$EXESTARTDB
- SAPSTOPDB=$MYPATH/$EXESTOPDB
- SAPDBCONNECT=$MYPATH/$EXEDBCONNECT
- break
- fi
- fi
-done
-if [ -z "$DIR_EXECUTABLE" ]
-then
- ocf_log err "Cannot find $EXESTARTDB,$EXESTOPDB and $EXEDBCONNECT executable, please set DIR_EXECUTABLE parameter!"
- exit $OCF_ERR_GENERIC
-fi
-
-if [ $DBJ2EE_ONLY -eq 1 ]
-then
- if [ -n "$OCF_RESKEY_DIR_BOOTSTRAP" ]
- then
- BOOTSTRAP="$OCF_RESKEY_DIR_BOOTSTRAP"
- else
- BOOTSTRAP=`echo /usr/sap/$SID/*/j2ee/cluster/bootstrap | head -1`
- fi
-
- if [ -n "$OCF_RESKEY_DIR_SECSTORE" ]
- then
- SECSTORE="$OCF_RESKEY_DIR_SECSTORE"
- else
- SECSTORE=/usr/sap/$SID/SYS/global/security/lib/tools
- fi
-fi
-
-# as root user we need the library path to the SAP kernel to be able to call executables
-if [ `echo $LD_LIBRARY_PATH | grep -c "^$DIR_EXECUTABLE\>"` -eq 0 ]; then
- LD_LIBRARY_PATH=$DIR_EXECUTABLE:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH
-fi
-sidadm="`echo $SID | tr [:upper:] [:lower:]`adm"
-
-# What kind of method was invoked?
-case "$1" in
-
- start) sapdatabase_start
- exit $?;;
-
- stop) sapdatabase_stop
- exit $?;;
-
- monitor)
- sapdatabase_monitor
- exit $?;;
-
- status)
- sapdatabase_status
- exit $?;;
-
- validate-all) sapdatabase_vaildate
- exit $?;;
-
- *) sapdatabase_methods
- exit $OCF_ERR_UNIMPLEMENTED;;
-esac
--- cluster/rgmanager/src/resources/SAPInstance 2007/05/09 19:07:02 1.1.2.1
+++ cluster/rgmanager/src/resources/SAPInstance 2007/05/11 02:30:27 1.1.2.2
@@ -1,406 +0,0 @@
-#!/bin/sh
-#
-# SAPInstance
-#
-# Description: Manages a single SAP Instance as a High-Availability
-# resource. One SAP Instance is defined by one
-# SAP Instance-Profile. start/stop handels all services
-# of the START-Profile, status and monitor care only
-# about essential services.
-#
-# Author: Alexander Krauth, June 2006
-# Support: liunx at sap.com
-# License: GNU General Public License (GPL)
-# Copyright: (c) 2006 Alexander Krauth
-#
-# An example usage:
-# See usage() function below for more details...
-#
-# OCF instance parameters:
-# OCF_RESKEY_InstanceName
-# OCF_RESKEY_DIR_EXECUTABLE (optional, well known directories will be searched by default)
-# OCF_RESKEY_DIR_PROFILE (optional, well known directories will be searched by default)
-# OCF_RESKEY_START_PROFILE (optional, well known directories will be searched by default)
-#
-#######################################################################
-# Initialization:
-
-if [ -f /usr/lib/heartbeat/ocf-shellfuncs ]; then
- . /usr/lib/heartbeat/ocf-shellfuncs
-elif [ -f /usr/share/cluster/ocf-shellfuncs ]; then
- . /usr/share/cluster/ocf-shellfuncs
-else
- echo Could not find ocf-shellfuncs!
- exit 1
-fi
-
-#######################################################################
-
-SH=/bin/sh
-
-usage() {
- methods=`sapinstance_methods`
- methods=`echo $methods | tr ' ' '|'`
- cat <<-!
- usage: $0 ($methods)
-
- $0 manages a SAP Instance as an HA resource.
-
- The 'start' operation starts the instance.
- The 'stop' operation stops the instance.
- The 'status' operation reports whether the instance is running
- The 'monitor' operation reports whether the instance seems to be working
- The 'validate-all' operation reports whether the parameters are valid
- The 'methods' operation reports on the methods $0 supports
-
- !
-}
-
-meta_data() {
- cat <<END
-<?xml version="1.0"?>
-<!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
-<resource-agent name="SAPInstance">
-<version>1.6</version>
-
-<longdesc lang="en">
-Resource script for SAP. It manages a SAP Instance as an HA resource.
-</longdesc>
-<shortdesc lang="en">SAP instance resource agent</shortdesc>
-
-<parameters>
- <parameter name="InstanceName" unique="1" required="1">
- <longdesc lang="en">The full qualified SAP instance name. e.g. P01_DVEBMGS00_sapp01ci</longdesc>
- <shortdesc lang="en">instance name: SID_INSTANCE_VIR-HOSTNAME</shortdesc>
- <content type="string" default="" />
- </parameter>
- <parameter name="DIR_EXECUTABLE" unique="1" required="0">
- <longdesc lang="en">The full qualified path where to find sapstartsrv and sapcontrol.</longdesc>
- <shortdesc lang="en">path of sapstartsrv and sapcontrol</shortdesc>
- <content type="string" default="" />
- </parameter>
- <parameter name="DIR_PROFILE" unique="1" required="0">
- <longdesc lang="en">The full qualified path where to find the SAP START profile.</longdesc>
- <shortdesc lang="en">path of start profile</shortdesc>
- <content type="string" default="" />
- </parameter>
- <parameter name="START_PROFILE" unique="1" required="0">
- <longdesc lang="en">The name of the SAP START profile.</longdesc>
- <shortdesc lang="en">start profile name</shortdesc>
- <content type="string" default="" />
- </parameter>
-</parameters>
-
-<actions>
-<action name="start" timeout="180" />
-<action name="stop" timeout="240" />
-<action name="status" timeout="60" />
-<action name="monitor" depth="0" timeout="60" interval="120" start-delay="240" />
-<action name="validate-all" timeout="5" />
-<action name="meta-data" timeout="5" />
-<action name="methods" timeout="5" />
-</actions>
-</resource-agent>
-END
-}
-
-
-#
-# methods: What methods/operations do we support?
-#
-sapinstance_methods() {
- cat <<-!
- start
- stop
- status
- monitor
- validate-all
- methods
- meta-data
- usage
- !
-}
-
-
-#
-# check_sapstartsrv : Before using sapcontrol we make sure that the sapstartsrv is running for the correct instance.
-# We cannot use sapinit and the /usr/sap/sapservices file in case of an enquerep instance,
-# because then we have two instances with the same instance number.
-#
-check_sapstartsrv() {
- restart=0
- output=`$SAPCONTROL -nr $InstanceNr -function ParameterValue INSTANCE_NAME -format script`
- if [ $? -eq 0 ]
- then
- runninginst=`echo "$output" | grep '^0 : ' | cut -d' ' -f3`
- if [ "$runninginst" != "$InstanceName" ]
- then
- ocf_log warn "sapstartsrv is running for instance $runninginst, that service will be killed"
- restart=1
- fi
- else
- ocf_log warn "sapstartsrv is not running for instance $SID-$InstanceName, it will be started now"
- restart=1
- fi
-
- if [ -z "$runninginst" ]; then runninginst=$InstanceName; fi
-
- if [ $restart -eq 1 ]
- then
- pkill -9 -f "sapstartsrv.*$runninginst"
- $SAPSTARTSRV pf=$SAPSTARTPROFILE -D -u $sidadm
-
- ocf_log info "sapstartsrv for instance $SID-$InstanceName was restarted !"
- fi
-
- return 0
-}
-
-
-#
-# sapinstance_start : Start the SAP instance
-#
-sapinstance_start() {
- check_sapstartsrv
-
- output=`$SAPCONTROL -nr $InstanceNr -function Start`
- if [ $? -eq 0 ]
- then
- output=`$SAPCONTROL -nr $InstanceNr -function WaitforStarted 3600 1`
- if [ $? -eq 0 ]
- then
- ocf_log info "SAP Instance $SID-$InstanceName started: $output"
- rc=$OCF_SUCCESS
- else
- ocf_log err "SAP Instance $SID-$InstanceName start failed: $output"
- rc=$OCF_ERR_GENERIC
- fi
- else
- ocf_log err "SAP Instance $SID-$InstanceName start failed: $output"
- rc=$OCF_ERR_GENERIC
- fi
- return $rc
-}
-
-#
-# sapinstance_stop: Stop the SAP instance
-#
-sapinstance_stop() {
- check_sapstartsrv
-
- output=`$SAPCONTROL -nr $InstanceNr -function Stop`
- if [ $? -eq 0 ]
- then
- output=`$SAPCONTROL -nr $InstanceNr -function WaitforStopped 3600 1`
- if [ $? -eq 0 ]
- then
- ocf_log info "SAP Instance $SID-$InstanceName stopped: $output"
- rc=$OCF_SUCCESS
- else
- ocf_log err "SAP Instance $SID-$InstanceName stop failed: $output"
- rc=$OCF_ERR_GENERIC
- fi
- else
- ocf_log err "SAP Instance $SID-$InstanceName stop failed: $output"
- rc=$OCF_ERR_GENERIC
- fi
- return $rc
-}
-
-
-#
-# sapinstance_monitor: Can the given SAP instance do anything useful?
-#
-sapinstance_monitor() {
- check_sapstartsrv
-
- rc=$OCF_SUCCESS
- count=0
- LOCALHOST=`hostname`
- output=`$SAPCONTROL -nr $InstanceNr -host $LOCALHOST -function GetProcessList -format script`
-
- # we have to parse the output, because the returncode doesn't tell anything about the instance status
- for SERVNO in `echo "$output" | grep '^[0-9] ' | cut -d' ' -f1 | sort -u`
- do
- COLOR=`echo "$output" | grep "^$SERVNO dispstatus: " | cut -d' ' -f3`
- SERVICE=`echo "$output" | grep "^$SERVNO name: " | cut -d' ' -f3`
- STATE=0
-
- case $COLOR in
- GREEN|YELLOW) STATE=$OCF_SUCCESS;;
- *) STATE=$OCF_NOT_RUNNING;;
- esac
-
- case $SERVICE in
- disp+work|msg_server|enserver|enrepserver)
- if [ $STATE -eq $OCF_NOT_RUNNING ]
- then
- ocf_log err "SAP instance service $SERVICE is not running with status $COLOR !"
- rc=$STATE
- fi
- count=1;;
- *);;
- esac
- done
-
- if [ $count -eq 0 -a $rc -eq $OCF_SUCCESS ]
- then
- ocf_log err "The SAP instance does not run any services which this RA could monitor!"
- rc=$OCF_ERR_ARGS
- fi
-
- return $rc
-}
-
-#
-# sapinstance_vaildate: Check the symantic of the input parameters
-#
-sapinstance_vaildate() {
- rc=$OCF_SUCCESS
- if [ `echo "$SID" | grep -c '^[A-Z][A-Z0-9][A-Z0-9]$'` -ne 1 ]
- then
- ocf_log err "Parsing instance profile name: '$SID' is not a valid system ID!"
- rc=$OCF_ERR_ARGS
- fi
-
- if [ `echo "$InstanceName" | grep -c '^[A-Z].*[0-9][0-9]$'` -ne 1 ]
- then
- ocf_log err "Parsing instance profile name: '$InstanceName' is not a valid instance name!"
- rc=$OCF_ERR_ARGS
- fi
-
- if [ `echo "$InstanceNr" | grep -c '^[0-9][0-9]$'` -ne 1 ]
- then
- ocf_log err "Parsing instance profile name: '$InstanceNr' is not a valid instance number!"
- rc=$OCF_ERR_ARGS
- fi
-
- if [ `echo "$SAPVIRHOST" | grep -c '^[A-Za-z][A-Za-z0-9_-]*$'` -ne 1 ]
- then
- ocf_log err "Parsing instance profile name: '$SAPVIRHOST' is not a valid hostname!"
- rc=$OCF_ERR_ARGS
- fi
-
- return $rc
-}
-
-
-#
-# 'main' starts here...
-#
-
-if
- ( [ $# -ne 1 ] )
-then
- usage
- exit $OCF_ERR_ARGS
-fi
-
-# These operations don't require OCF instance parameters to be set
-case "$1" in
- meta-data) meta_data
- exit $OCF_SUCCESS;;
-
- usage) usage
- exit $OCF_SUCCESS;;
-
- methods) sapinstance_methods
- exit $?;;
-
- *);;
-esac
-
-US=`id -u -n`
-US=`echo $US`
-if
- [ $US != root ]
-then
- ocf_log err "$0 must be run as root"
- exit $OCF_ERR_PERM
-fi
-
-# parameter check
-if [ -z "$OCF_RESKEY_InstanceName" ]
-then
- ocf_log err "Please set OCF_RESKEY_InstanceName to the name to the SAP instance profile!"
- exit $OCF_ERR_ARGS
-fi
-
-SID=`echo "$OCF_RESKEY_InstanceName" | cut -d_ -f1`
-InstanceName=`echo "$OCF_RESKEY_InstanceName" | cut -d_ -f2`
-InstanceNr=`echo "$InstanceName" | sed 's/.*\([0-9][0-9]\)$/\1/'`
-SAPVIRHOST=`echo "$OCF_RESKEY_InstanceName" | cut -d_ -f3`
-
-# optional OCF parameters, we try to guess which directories are correct
-if [ -z "$OCF_RESKEY_DIR_EXECUTABLE" ]
-then
- if [ -x /usr/sap/$SID/$InstanceName/exe/sapstartsrv -a -x /usr/sap/$SID/$InstanceName/exe/sapcontrol ]
- then
- DIR_EXECUTABLE="/usr/sap/$SID/$InstanceName/exe"
- SAPSTARTSRV="/usr/sap/$SID/$InstanceName/exe/sapstartsrv"
- SAPCONTROL="/usr/sap/$SID/$InstanceName/exe/sapcontrol"
- elif [ -x /usr/sap/$SID/SYS/exe/run/sapstartsrv -a -x /usr/sap/$SID/SYS/exe/run/sapcontrol ]
- then
- DIR_EXECUTABLE="/usr/sap/$SID/SYS/exe/run"
- SAPSTARTSRV="/usr/sap/$SID/SYS/exe/run/sapstartsrv"
- SAPCONTROL="/usr/sap/$SID/SYS/exe/run/sapcontrol"
- else
- ocf_log err "Cannot find sapstartsrv and sapcontrol executable, please set DIR_EXECUTABLE parameter!"
- exit $OCF_ERR_GENERIC
- fi
-else
- DIR_EXECUTABLE="$OCF_RESKEY_DIR_EXECUTABLE"
- SAPSTARTSRV="$OCF_RESKEY_DIR_EXECUTABLE/sapstartsrv"
- SAPCONTROL="$OCF_RESKEY_DIR_EXECUTABLE/sapcontrol"
-fi
-
-if [ -z "$OCF_RESKEY_DIR_PROFILE" ]
-then
- if [ -d /usr/sap/$SID/SYS/profile/ ]
- then
- DIR_PROFILE="/usr/sap/$SID/SYS/profile"
- else
- ocf_log err "Expected /usr/sap/$SID/SYS/profile/ to be a directory, please set DIR_PROFILE parameter!"
- exit $OCF_ERR_GENERIC
- fi
-else
- DIR_PROFILE="$OCF_RESKEY_DIR_PROFILE"
-fi
-
-if [ -z "$OCF_RESKEY_START_PROFILE" ]
-then
- SAPSTARTPROFILE="$DIR_PROFILE/START_${InstanceName}_${SAPVIRHOST}"
- if [ ! -r $SAPSTARTPROFILE ]
- then
- ocf_log err "Expected $SAPSTARTPROFILE to be the instance START profile, please set START_PROFILE parameter!"
- exit $OCF_ERR_GENERIC
- fi
-else
- SAPSTARTPROFILE="$OCF_RESKEY_START_PROFILE"
-fi
-
-# as root user we need the library path to the SAP kernel to be able to call sapcontrol
-if [ `echo $LD_LIBRARY_PATH | grep -c "^$DIR_EXECUTABLE\>"` -eq 0 ]; then
- LD_LIBRARY_PATH=$DIR_EXECUTABLE:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH
-fi
-sidadm="`echo $SID | tr [:upper:] [:lower:]`adm"
-
-# What kind of method was invoked?
-case "$1" in
-
- start) sapinstance_start
- exit $?;;
-
- stop) sapinstance_stop
- exit $?;;
-
- status|monitor)
- sapinstance_monitor
- exit $?;;
-
- validate-all) sapinstance_vaildate
- exit $?;;
-
- *) sapinstance_methods
- exit $OCF_ERR_UNIMPLEMENTED;;
-esac
More information about the Cluster-devel
mailing list