cluster: RHEL59 - rgmanager: Update the Oracle resource agents to support Oracle 11g

Ryan McCabe rmccabe at fedoraproject.org
Mon May 20 18:21:46 UTC 2013


Gitweb:        http://git.fedorahosted.org/git/?p=cluster.git;a=commitdiff;h=3ac6fa12877780c28b07c9d2402687f878ba374e
Commit:        3ac6fa12877780c28b07c9d2402687f878ba374e
Parent:        c830187908b759b5b5203efc0fa441fc401b7f1b
Author:        Ryan McCabe <rmccabe at redhat.com>
AuthorDate:    Thu May 16 16:51:55 2013 -0400
Committer:     Ryan McCabe <rmccabe at redhat.com>
CommitterDate: Mon May 20 14:21:13 2013 -0400

rgmanager: Update the Oracle resource agents to support Oracle 11g

Add Oracle 11g support to the orainstance, oralistener, and oracledb
resource agents.

Resolves: rhbz#964991

Signed-off-by: Ryan McCabe <rmccabe at redhat.com>
---
 rgmanager/src/resources/oracledb.sh    |  428 ++++++++++++++++++++------------
 rgmanager/src/resources/orainstance.sh |  298 +++++++++++++---------
 rgmanager/src/resources/oralistener.sh |  224 ++++++++++-------
 3 files changed, 578 insertions(+), 372 deletions(-)

diff --git a/rgmanager/src/resources/oracledb.sh b/rgmanager/src/resources/oracledb.sh
index bcb367f..2bbb807 100755
--- a/rgmanager/src/resources/oracledb.sh
+++ b/rgmanager/src/resources/oracledb.sh
@@ -1,22 +1,27 @@
 #!/bin/bash
 #
-# Copyright 2003-2004, 2006-2008 Red Hat, Inc.
+# Copyright (C) 1997-2003 Sistina Software, Inc.  All rights reserved.
+# Copyright (C) 2004-2013 Red Hat, Inc.  All rights reserved.
+#
+# 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #
 # Author(s):
 #     Hardy Merrill <hmerrill at redhat.com>
 #     Lon Hohberger <lhh at redhat.com>
 #     Michael Moon <Michael dot Moon at oracle.com>
-#
-# This program is Open Source software.  You may modify and/or redistribute
-# it persuant to the terms of the Open Software License version 2.1, which
-# is available from the following URL and is included herein by reference:
-#
-# 	http://opensource.org/licenses/osl-2.1.php
-#
-# chkconfig: 345 99 01
-# description: Service script for starting/stopping      \
-#	       Oracle(R) Database 10g on                 \
-#		        Red Hat Enterprise Linux 5
+#     Ryan McCabe <rmccabe at redhat.com>
 #
 # NOTES:
 #
@@ -35,15 +40,16 @@
 # Oracle is a registered trademark of Oracle Corporation.
 # Oracle9i is a trademark of Oracle Corporation.
 # Oracle10g is a trademark of Oracle Corporation.
+# Oracle11g is a trademark of Oracle Corporation.
 # All other trademarks are property of their respective owners.
 #
 
-. /etc/init.d/functions
+. $(dirname $0)/ocf-shellfuncs
+. $(dirname $0)/utils/config-utils.sh
+. $(dirname $0)/utils/messages.sh
+. $(dirname $0)/utils/ra-skelet.sh
 
-#
-# Source stuff from /etc/sysconfig, but this may be overridden if
-# this is being called as a cluster resource agent instead.
-#. /etc/sysconfig/oracledb
+. /etc/init.d/functions
 
 declare SCRIPT="`basename $0`"
 declare SCRIPTDIR="`dirname $0`"
@@ -122,6 +128,15 @@ declare -r	DB_PROCNAMES="pmon"
 declare -r	LSNR_PROCNAME="tnslsnr"
 #declare -r	LSNR_PROCNAME="tnslsnrXX" # testing
 
+# clulog will not log messages when run by the oracle user.
+# This is a hack to work around that.
+if [ "`id -u`" = "`id -u $ORACLE_USER`" ]; then
+	ocf_log() {
+		prio=$1
+		shift
+		logger -i -p daemon."$prio" -- "$*"
+	}
+fi
 
 ##########################################################
 # (Hopefully) No user-serviceable parts below this line. #
@@ -134,10 +149,10 @@ meta_data()
     <version>1.0</version>
 
     <longdesc lang="en">
-	Oracle 10g Failover Instance
+	Oracle 10g/11g Failover Instance
     </longdesc>
     <shortdesc lang="en">
-	Oracle 10g Failover Instance
+	Oracle 10g/11g Failover Instance
     </shortdesc>
 
     <parameters>
@@ -164,7 +179,6 @@ meta_data()
 	    <content type="string"/>
         </parameter>
 
-
         <parameter name="user" required="1">
 	    <longdesc lang="en">
 		Oracle user name.  This is the user name of the Oracle
@@ -191,8 +205,10 @@ meta_data()
 	    <longdesc lang="en">
 		This is the Oracle installation type:
 		base - Database Instance and Listener only
+		base-11g - Oracle11g Database Instance and Listener Only
 		base-em (or 10g) - Database, Listener, Enterprise Manager,
 				   and iSQL*Plus
+		base-em-11g - Database, Listener, Enterprise Manager dbconsole
 		ias (or 10g-ias) - Internet Application Server (Infrastructure)
 	    </longdesc>
             <shortdesc lang="en">
@@ -230,7 +246,7 @@ meta_data()
 	<action name="monitor" depth="10" timeout="30" interval="30"/>
 
 	<action name="meta-data" timeout="5"/>
-	<action name="verify-all" timeout="5"/>
+	<action name="validate-all" timeout="5"/>
     </actions>
 
     <special tag="rgmanager">
@@ -240,84 +256,55 @@ meta_data()
 EOT
 }
 
-
-#
-# "action"-like macro supporting functions
-#
-faction()
-{
-	echo -n "$1"
-	shift
-	$*
-	if [ $? -eq 0 ]; then
-		echo_success
-		echo
-		return 0
-	fi
-
-	echo_failure
-	echo
-	return 1
-}
-
-
 #
-# Start Oracle9i (database portion)
+# Start Oracle9i/10g/11g (database portion)
 #
 start_db()
 {
-	declare tmpfile
-	declare logfile
 	declare -i rv
+	declare startup_cmd
+	declare startup_stdout
 
-	tmpfile=$(mktemp /tmp/$SCRIPT-start.tmp.XXXXXX)
-	logfile=$(mktemp /tmp/$SCRIPT-start.log.XXXXXX)
+	ocf_log info "Starting Oracle DB $ORACLE_SID"
 
-	#
 	# Set up our sqlplus script.  Basically, we're trying to 
 	# capture output in the hopes that it's useful in the case
 	# that something doesn't work properly.
-	#
-	echo "startup" > $tmpfile
-	echo "quit" >> $tmpfile
-
-	sqlplus "/ as sysdba" < $tmpfile &> $logfile
+	startup_cmd="set heading off;\nstartup;\nquit;\n"
+	startup_stdout=$(echo -e "$startup_cmd" | sqlplus -S "/ as sysdba")
 	rv=$?
 
-	# Dump logfile to /var/log/messages
-	initlog -q -c "cat $logfile"
-	
+	# Dump output to syslog for debugging
+	ocf_log debug "[$ORACLE_SID] [$rv] sent $startup_cmd"
+	ocf_log debug "[$ORACLE_SID] [$rv] got $startup_stdout"
+
 	if [ $rv -ne 0 ]; then
-		echo "ORACLE_HOME Incorrectly set?"
-		echo "See $logfile for more information."
-		return 1
+	    ocf_log error "Starting Oracle DB $ORACLE_SID failed, sqlplus returned $rv"
+	    return 1
 	fi
 
-	# 
 	# If we see:
 	# ORA-.....: failure, we failed
-	#
-
-	rm -f $tmpfile
-	grep -q "^ORA-" $logfile
-	if [ $? -eq 0 ]; then
-		rm -f $tmpfile
-	echo "ORACLE_SID Incorrectly set?"
-		echo "See $logfile for more information."
-		return 1
+	# Troubleshooting:
+	#   ORA-00845 - Try rm -f /dev/shm/ora_*
+	#   ORA-01081 - Try echo -e 'shutdown abort;\nquit;'|sqlplus "/ as sysdba"
+	if [[ "$startup_stdout" =~ "ORA-" ]] || [[ "$startup_stdout" =~ "failure" ]]; then
+	    ocf_log error "Starting Oracle DB $ORACLE_SID failed, found errors in stdout"
+	    return 1
 	fi
 
+	ocf_log info "Started Oracle DB $ORACLE_SID successfully"
 	return 0
 }
 
 
 #
-# Stop Oracle9i (database portion)
+# Stop Oracle (database portion)
 #
 stop_db()
 {
-	declare tmpfile
-	declare logfile
+	declare stop_cmd
+	declare stop_stdout
 	declare -i rv
 	declare how_shutdown="$1"
 
@@ -325,38 +312,30 @@ stop_db()
 		how_shutdown="immediate"
 	fi
 
-	tmpfile=$(mktemp /tmp/$SCRIPT-stop.tmp.XXXXXX)
-	logfile=$(mktemp /tmp/$SCRIPT-stop.log.XXXXXX)
+	ocf_log info "Stopping Oracle DB $ORACLE_SID $how_shutdown"
 
 	# Setup for Stop ...
-	echo "shutdown $how_shutdown" > $tmpfile
-	echo "quit" >> $tmpfile
-
-	sqlplus "/ as sysdba" < $tmpfile &> $logfile
+	stop_cmd="set heading off;\nshutdown $how_shutdown;\nquit;\n"
+	stop_stdout=$(echo -e "$stop_cmd" | sqlplus -S "/ as sysdba")
 	rv=$?
 
-	# Dump logfile to /var/log/messages
-	initlog -q -c "cat $logfile"
-	
+	# Log stdout of the stop command
+	ocf_log debug "[$ORACLE_SID] sent stop command $stop_cmd"
+	ocf_log debug "[$ORACLE_SID] got $stop_stdout"
+
+	# sqlplus returned failure. We'll return failed to rhcs
 	if [ $rv -ne 0 ]; then
-		echo "ORACLE_HOME Incorrectly set?"
-		echo "See $logfile for more information."
-		return 1
+	    ocf_log error "Stopping Oracle DB $ORACLE_SID failed, sqlplus returned $rv"
+	    return 1
 	fi
 
-	# 
-	# If we see 'failure' in the log, we're done.
-	#
-	rm -f $tmpfile
-	grep -q "^ORA-" $logfile
-	if [ $? -eq 0 ]; then
-		echo_failure
-		echo
-		echo "Possible reason: ORACLE_SID Incorrectly set."
-		echo "See $logfile for more information."
-		return 1
+	# If we see 'ORA-' or 'failure' in stdout, we're done.
+	if [[ "$startup_stdout" =~ "ORA-" ]] || [[ "$startup_stdout" =~ "failure" ]]; then
+	    ocf_log error "Stopping Oracle DB $ORACLE_SID failed, errors in stdout"
+	    return 1
 	fi
 
+	ocf_log info "Stopped Oracle DB $ORACLE_SID successfully"
 	return 0
 }
 
@@ -372,12 +351,15 @@ force_cleanup()
 	# Patch from Shane Bradley to fix 471266
 	pids=`ps ax | grep $ORACLE_HOME | grep "ora_.*_${ORACLE_SID}" | grep -v grep | awk '{print $1}'`
 
-	initlog -n $SCRIPT -s "<err> Not all Oracle processes exited cleanly, killing"
-	
+	ocf_log error "Not all Oracle processes for $ORACLE_SID exited cleanly, killing"
+
 	for pid in $pids; do
 		kill -9 $pid
-		if [ $? -eq 0 ]; then
-			initlog -n $SCRIPT -s "Killed $pid"
+		rv=$?
+		if [ $rv -eq 0 ]; then
+			ocf_log info "Cleanup $ORACLE_SID Killed PID $pid"
+		else
+			ocf_log error "Cleanup $ORACLE_SID Kill PID $pid failed: $rv"
 		fi
 	done
 
@@ -392,14 +374,19 @@ force_cleanup()
 exit_idle()
 {
 	declare -i n=0
+
+	ocf_log debug "Waiting for Oracle processes for $ORACLE_SID to terminate..."
 	while ps ax | grep $ORACLE_HOME | grep -q -v grep; do
 		if [ $n -ge 90 ]; then
+			ocf_log debug "Timed out while waiting for Oracle processes for $ORACLE_SID to terminate"
 			force_cleanup
 			return 0
 		fi
 		sleep 1
 		((n++))
 	done
+
+	ocf_log debug "All Oracle processes for $ORACLE_SID have terminated"
 	return 0
 }
 
@@ -438,24 +425,27 @@ get_db_status()
 		for (( i=$RESTART_RETRIES ; i; i-- )) ; do
 			# this db process is down - stop and
 			# (re)start all ora_XXXX_$ORACLE_SID processes
-			initlog -q -n $SCRIPT -s "Restarting Oracle Database..."
+			ocf_log info "Restarting Oracle Database $ORACLE_SID"
 			stop_db immediate
-			if [ $? != 0 ] ; then
+			if [ $? -ne 0 ] ; then
 				# stop failed - return 1
+				ocf_log error "Error stopping Oracle Database $ORACLE_SID"
 				return 1
 			fi
 
 			start_db
-			if [ $? == 0 ] ; then
+			if [ $? -eq 0 ] ; then
 				# ora_XXXX_$ORACLE_SID processes started
 				# successfully, so break out of the
 				# stop/start # 'for' loop
+				ocf_log info "Restarted Oracle Database $ORACLE_SID successfully"
 				break
 			fi
 		done
 
 		if [ $i -eq 0 ]; then
 			# stop/start's failed - return 1 (failure)
+			ocf_log error "Failed to restart Oracle Database $ORACLE_SID after $RESTART_RETRIES tries"
 			return 1
 		fi
 	done
@@ -471,42 +461,46 @@ get_lsnr_status()
 	declare -i subsys_lock=$1
 	declare -i rv
 
-	status $LSNR_PROCNAME
+	ocf_log debug "Checking status for listener $ORACLE_LISTENER"
+	lsnrctl status "$ORACLE_LISTENER" >& /dev/null
 	rv=$?
-	if [ $rv == 0 ] ; then
+	if [ $rv -eq 0 ] ; then
+		ocf_log debug "Listener $ORACLE_LISTENER is up"
 		return 0 # Listener is running fine
 	fi
 
-	#
 	# We're not supposed to be running, and we are,
 	# in fact, not running.  Return 3
-	#
 	if [ $subsys_lock -ne 0 ]; then
+		ocf_log debug "Listener $ORACLE_LISTENER is stopped as expected"
 		return 3
 	fi
 
-	#
 	# Listener is NOT running (but should be) - try to restart
-	#
 	for (( i=$RESTART_RETRIES ; i; i-- )) ; do
-
-		action "Restarting Oracle listener:" lsnrctl start \
-					$ORACLE_LISTENER
-		lsnrctl status $ORACLE_LISTENER >& /dev/null
-		if [ $? == 0 ] ; then
+		ocf_log info "Listener $ORACLE_LISTENER is down, attempting to restart"
+		lsnrctl start "$ORACLE_LISTENER" >& /dev/null
+		lsnrctl status "$ORACLE_LISTENER" >& /dev/null
+		if [ $? -eq 0 ] ; then
+			ocf_log info "Listener $ORACLE_LISTENER was restarted successfully"
 			break # Listener was (re)started and is running fine
 		fi
 	done
 
 	if [ $i -eq 0 ]; then
 		# stop/start's failed - return 1 (failure)
+		ocf_log error "Failed to restart listener $ORACLE_LISTENER after $RESTART_RETRIES tries"
 		return 1
 	fi
 
-	status $LSNR_PROCNAME
-	if [ $? != 0 ] ; then
+	lsnrctl_stdout=$(lsnrctl status "$ORACLE_LISTENER")
+	rv=$?
+	if [ $rv -ne 0 ] ; then
+		ocf_log error "Starting listener $ORACLE_LISTENER failed: $rv output $lsnrctl_stdout"
 		return 1 # Problem restarting the Listener
 	fi
+
+	ocf_log info "Listener $ORACLE_LISTENER started successfully"
 	return 0 # Success restarting the Listener
 }
 
@@ -541,12 +535,12 @@ get_opmn_proc_status()
 		_status=`echo $_status | cut -f2 -d' '`
 		if [ "${_status}" == "Alive" ] || [ "${_status}" == "Init" ]; then
 			if [ $i -lt $RESTART_RETRIES ] ; then
-				echo "  $comp$type_pretty restarted"
+				ocf_log info "$comp$type_pretty restarted"
 			fi
-			echo "  $comp$type_pretty (pid $_pid) is running..."
+			ocf_log info "$comp$type_pretty (pid $_pid) is running..."
 			break
 		else
-			echo "  $comp$type_pretty is stopped"
+			ocf_log info "$comp$type_pretty is stopped"
 
 			#
 			# Try to restart it, but don't worry if we fail.  OPMN
@@ -564,6 +558,7 @@ get_opmn_proc_status()
 
 	if [ $i -eq 0 ]; then
 		# restarts failed - return 1 (failure)
+		ocf_log error "Failed to restart OPMN process $comp"
 		return 1
 	fi
 
@@ -584,7 +579,7 @@ get_opmn_status()
 		#
 		# OPMN not running??
 		#
-		echo "opmn is stopped"
+		ocf_log info "OPMN is stopped"
 
 		if [ $subsys_lock -eq 0 ]; then
 			#
@@ -600,8 +595,8 @@ get_opmn_status()
 	#
 	# Print out the PIDs for everyone.
 	#
-	echo "opmn is running..."
-	echo "opmn components:"
+	ocf_log info "OPMN is running..."
+	ocf_log info "opmn components:"
 
 	#
 	# Check the OPMN-managed processes
@@ -615,6 +610,7 @@ get_opmn_status()
 	# restarted.
 	#
 	if [ $ct_errors -ne 0 ]; then
+		ocf_log error "$ct_errors errors occurred while restarting OPMN-managed processes"
 		return 1
 	fi
 	return 0
@@ -659,10 +655,7 @@ update_status()
 #
 oops()
 {
-	echo "Please configure this script ($0) to"
-	echo "match your installation."
-	echo 
-	echo "    $1 failed validation checks."
+	ocf_log error "$ORACLE_SID: Fatal: $1 failed validation checks"
 	exit 1
 }
 
@@ -673,6 +666,8 @@ oops()
 #
 validation_checks()
 {
+	ocf_log debug "Validating configuration for $ORACLE_SID"
+
 	#
 	# If the oracle user doesn't exist, we're done.
 	#
@@ -701,8 +696,12 @@ validation_checks()
 		ORACLE_TYPE="base-em"
 	elif [ "$ORACLE_TYPE" = "10g-ias" ] || [ "$ORACLE_TYPE" = "ias" ]; then
 		ORACLE_TYPE="ias"
+	elif [ "$ORACLE_TYPE" = "11g" ] || [ "$ORACLE_TYPE" = "base-em-11g" ]; then
+		ORACLE_TYPE="base-em-11g"
+	elif [ "$ORACLE_TYPE" = "base-11g" ]; then
+		ORACLE_TYPE="base-11g"
 	else
-		oops ORACLE_TYPE
+		oops "ORACLE_TYPE $ORACLE_TYPE"
 	fi
 
 	#
@@ -715,7 +714,7 @@ validation_checks()
 	# Oracle needs to be run as the Oracle user, not root!
 	#
 	if [ "`id -u`" = "0" ]; then
-		echo "Restarting $0 as $ORACLE_USER."
+		#echo "Restarting $0 as $ORACLE_USER."
 		#
 		# Breaks on RHEL5 
 		# exec sudo -u $ORACLE_USER $0 $*
@@ -727,75 +726,191 @@ validation_checks()
 	#
 	# If we're not root and not the Oracle user, we're done.
 	#
-	[ "`id -u`" = "`id -u $ORACLE_USER`" ] || exit 1
-	[ "`id -g`" = "`id -g $ORACLE_USER`" ] || exit 1
+	[ "`id -u`" = "`id -u $ORACLE_USER`" ] || oops "not ORACLE_USER after su"
+	[ "`id -g`" = "`id -g $ORACLE_USER`" ] || oops "not ORACLE_GROUP after su"
 
 	#
 	# Go home.
 	#
-	cd $ORACLE_HOME
+	cd "$ORACLE_HOME"
 
+	ocf_log debug "Validation checks for $ORACLE_SID succeeded"
 	return 0
 }
 
 
 #
-# Start Oracle9i Application Server Infrastructure
+# Start Oracle 9i/10g/11g Application Server Infrastructure
 #
 start_oracle()
 {
-	faction "Starting Oracle Database:" start_db || return 1
-	action "Starting Oracle Listener:" lsnrctl start $ORACLE_LISTENER || return 1
+	ocf_log info "Starting service $ORACLE_SID"
+
+	start_db
+	rv=$?
+	if [ $rv -ne 0 ]; then
+		ocf_log error "Starting service $ORACLE_SID failed"
+		return 1
+	fi
+
+	ocf_log info "Starting listener $ORACLE_LISTENER"
+	lsnrctl_stdout=$(lsnrctl start "$ORACLE_LISTENER")
+	rv=$?
+	if [ $rv -ne 0 ]; then
+		ocf_log debug "[$ORACLE_SID] Listener $ORACLE_LISTENER start returned $rv output $lsnrctl_stdout"
+		ocf_log error "Starting service $ORACLE_SID failed"
+		return 1
+	fi
 
 	if [ "$ORACLE_TYPE" = "base-em" ]; then
-		action "Starting iSQL*Plus:" isqlplusctl start || return 1
-		action "Starting Oracle EM DB Console:" emctl start dbconsole || return 1
+		ocf_log info "Starting iSQL*Plus for $ORACLE_SID"
+		isqlplusctl start
+		if [ $? -ne 0 ]; then
+			ocf_log error "iSQL*Plus startup for $ORACLE_SID failed"
+			ocf_log error "Starting service $ORACLE_SID failed"
+			return 1
+		else
+			ocf_log info "iSQL*Plus startup for $ORACLE_SID succeeded"
+		fi
+
+		ocf_log info "Starting Oracle EM DB Console for $ORACLE_SID"
+		emctl start dbconsole
+		if [ $? -ne 0 ]; then
+			ocf_log error "Oracle EM DB Console startup for $ORACLE_SID failed"
+			ocf_log error "Starting service $ORACLE_SID failed"
+			return 1
+		else
+			ocf_log info "Oracle EM DB Console startup for $ORACLE_SID succeeded"
+		fi
 	elif [ "$ORACLE_TYPE" = "ias" ]; then
-		action "Starting Oracle EM:" emctl start em || return 1
-		action "Starting iAS Infrastructure:" opmnctl startall || return 1
+		ocf_log info "Starting Oracle EM for $ORACLE_SID"
+		emctl start em
+		if [ $? -ne 0 ]; then
+			ocf_log error "Oracle EM startup for $ORACLE_SID failed"
+			ocf_log error "Starting service $ORACLE_SID failed"
+			return 1
+		else
+			ocf_log info "Oracle EM startup for $ORACLE_SID succeeded"
+		fi
+
+		ocf_log info "Starting iAS Infrastructure for $ORACLE_SID"
+		opmnctl startall
+		if [ $? -ne 0 ]; then
+			ocf_log error "iAS Infrastructure startup for $ORACLE_SID failed"
+			ocf_log error "Starting service $ORACLE_SID failed"
+			return 1
+		else
+			ocf_log info "iAS Infrastructure startup for $ORACLE_SID succeeded"
+		fi
+	elif [ "$ORACLE_TYPE" = "base-em-11g" ]; then
+		ocf_log info "Starting Oracle EM DB Console for $ORACLE_SID"
+		emctl start dbconsole
+		if [ $? -ne 0 ]; then
+			ocf_log error "Oracle EM DB Console startup for $ORACLE_SID failed"
+			ocf_log error "Starting service $ORACLE_SID failed"
+			return 1
+		else
+			ocf_log info "Oracle EM DB Console startup for $ORACLE_SID succeeded"
+		fi
 	fi
 
 	if [ -n "$LOCKFILE" ]; then
-		touch $LOCKFILE
+		touch "$LOCKFILE"
 	fi
+
+	ocf_log info "Starting service $ORACLE_SID completed successfully"
 	return 0
 }
 
 
 #
-# Stop Oracle9i Application Server Infrastructure
+# Stop Oracle 9i/10g/11g Application Server Infrastructure
 #
 stop_oracle()
 {
+	ocf_log info "Stopping service $ORACLE_SID"
+
 	if ! [ -e "$ORACLE_HOME/bin/lsnrctl" ]; then
-		echo "Oracle Listener Control is not available"
-		echo "    ($ORACLE_HOME not mounted?)"
+		ocf_log error "Oracle Listener Control is not available ($ORACLE_HOME not mounted?)"
 		return 0
 	fi
 
 	if [ "$ORACLE_TYPE" = "base-em" ]; then
-		action "Stopping Oracle EM DB Console:" emctl stop dbconsole || return 1
-		action "Stopping iSQL*Plus:" isqlplusctl stop || return 1
+		ocf_log info "Stopping Oracle EM DB Console for $ORACLE_SID"
+		emctl stop dbconsole
+		if [ $? -ne 0 ]; then
+			ocf_log error "Stopping Oracle EM DB Console for $ORACLE_SID failed"
+			ocf_log error "Stopping service $ORACLE_SID failed"
+			return 1
+		else
+			ocf_log info "Stopping Oracle EM DB Console for $ORACLE_SID succeeded"
+		fi
+
+		ocf_log info "Stopping iSQL*Plus for $ORACLE_SID"
+		isqlplusctl stop
+		if [ $? -ne 0 ]; then
+			ocf_log error "Stopping iSQL*Plus for $ORACLE_SID failed"
+			ocf_log error "Stopping service $ORACLE_SID failed"
+			return 1
+		else
+			ocf_log info "Stopping iSQL*Plus for $ORACLE_SID succeeded"
+		fi
 	elif [ "$ORACLE_TYPE" = "ias" ]; then
-		action "Stopping iAS Infrastructure:" opmnctl stopall || return 1
-		action "Stopping Oracle EM:" emctl stop em || return 1
+		ocf_log info "Stopping iAS Infrastructure for $ORACLE_SID"
+		opmnctl stopall
+		if [ $? -ne 0 ]; then
+			ocf_log error "Stopping iAS Infrastructure for $ORACLE_SID failed"
+			ocf_log error "Stopping service $ORACLE_SID failed"
+			return 1
+		else
+			ocf_log info "Stopping iAS Infrastructure for $ORACLE_SID succeeded"
+		fi
+
+		ocf_log info "Stopping Oracle EM for $ORACLE_SID"
+		emctl stop em
+		if [ $? -ne 0 ]; then
+			ocf_log error "Stopping Oracle EM for $ORACLE_SID failed"
+			ocf_log error "Stopping service $ORACLE_SID failed"
+			return 1
+		else
+			ocf_log info "Stopping Oracle EM for $ORACLE_SID succeeded"
+		fi
+	elif [ "$ORACLE_TYPE" = "base-em-11g" ]; then
+		ocf_log info "Stopping Oracle EM DB Console for $ORACLE_SID"
+		emctl stop dbconsole
+		if [ $? -ne 0 ]; then
+			ocf_log error "Stopping Oracle EM DB Console for $ORACLE_SID failed"
+			ocf_log error "Stopping service $ORACLE_SID failed"
+			return 1
+		else
+			ocf_log info "Stopping Oracle EM DB Console for $ORACLE_SID succeeded"
+		fi
 	fi
 
-	faction "Stopping Oracle Database:" stop_db immediate 
+	stop_db immediate || stop_db abort
 	if [ $? -ne 0 ]; then
-		faction "Stopping Oracle Database (hard):" stop_db abort || return 1
+		ocf_log error "Stopping service $ORACLE_SID failed"
+		return 1
 	fi
 
-	action "Stopping Oracle Listener:" lsnrctl stop $ORACLE_LISTENER
-	faction "Waiting for all Oracle processes to exit:" exit_idle 
+	ocf_log info "Stopping listener $ORACLE_LISTENER for $ORACLE_SID"
+	lsnrctl_stdout=$(lsnrctl stop "$ORACLE_LISTENER")
+	rv=$?
+	if [ $? -ne 0 ]; then
+		ocf_log error "Listener $ORACLE_LISTENER stop failed for $ORACLE_SID: $rv output $lsnrctl_stdout"
+		# XXX - failure?
+	fi
 
+	exit_idle 
 	if [ $? -ne 0 ]; then
-		echo "WARNING: Not all Oracle processes exited cleanly"
+		ocf_log warning "WARNING: Not all Oracle processes exited cleanly for $ORACLE_SID"
 	fi
 
 	if [ -n "$LOCKFILE" ]; then
-		rm -f $LOCKFILE
+		rm -f "$LOCKFILE"
 	fi
+
+	ocf_log info "Stopping service $ORACLE_SID succeeded"
 	return 0
 }
 
@@ -823,10 +938,12 @@ status_oracle()
 	declare -i subsys_lock=1
 	declare -i last 
 
+	ocf_log debug "Checking status for $ORACLE_SID depth $depth"
+
 	#
 	# Check for lock file.  Crude and rudimentary, but it works
 	#
-	if [ -z "$LOCKFILE" ] || [ -f $LOCKFILE ]; then
+	if [ -z "$LOCKFILE" ] || [ -f "$LOCKFILE" ]; then
 		subsys_lock=0 
 	fi
 
@@ -840,9 +957,9 @@ status_oracle()
 	update_status $? $last
 	last=$?
 	
-	if [ "$ORACLE_TYPE" = "base-em" ]; then
+	if [ "$ORACLE_TYPE" = "base-em" ] || [ "$ORACLE_TYPE" = "base-em-11g" ]; then
 		# XXX Add isqlplus status check?!
-		emctl status dbconsole 2>&1 | grep "is running"
+		emctl status dbconsole >&/dev/null
 		update_status $? $last
 		last=$?
 	elif [ "$ORACLE_TYPE" = "ias" ]; then
@@ -857,9 +974,10 @@ status_oracle()
 	# file back. XXX - this kosher?
 	#
 	if [ $last -eq 0 ] && [ $subsys_lock -ne 0 ]; then
-		touch $LOCKFILE
+		touch "$LOCKFILE"
 	fi
 
+	ocf_log debug "Status returning $last for $ORACLE_SID"
 	return $last
 }
 
diff --git a/rgmanager/src/resources/orainstance.sh b/rgmanager/src/resources/orainstance.sh
index a9f690d..ac71a92 100755
--- a/rgmanager/src/resources/orainstance.sh
+++ b/rgmanager/src/resources/orainstance.sh
@@ -1,11 +1,12 @@
 #!/bin/bash
 #
-# Copyright 2003-2004, 2006-2007 Red Hat, Inc.
+# Copyright 2003-2004, 2006-2013 Red Hat, Inc.
 #
 # Author(s):
 #     Hardy Merrill <hmerrill at redhat.com>
 #     Lon Hohberger <lhh at redhat.com>
 #     Michael Moon <Michael dot Moon at oracle.com>
+#     Ryan McCabe <rmccabe at redhat.com>
 #
 # This program is Open Source software.  You may modify and/or redistribute
 # it persuant to the terms of the Open Software License version 2.1, which
@@ -13,11 +14,6 @@
 #
 # 	http://opensource.org/licenses/osl-2.1.php
 #
-# chkconfig: 345 99 01
-# description: Service script for starting/stopping      \
-#	       Oracle(R) Database 10g on                 \
-#		        Red Hat Enterprise Linux 5
-#
 # NOTES:
 #
 # (1) You can comment out the LOCKFILE declaration below.  This will prevent
@@ -35,6 +31,7 @@
 # Oracle is a registered trademark of Oracle Corporation.
 # Oracle9i is a trademark of Oracle Corporation.
 # Oracle10g is a trademark of Oracle Corporation.
+# Oracle11g is a trademark of Oracle Corporation.
 # All other trademarks are property of their respective owners.
 #
 #
@@ -48,6 +45,12 @@
 # - SysV init support removed. Only usable with rgmanager
 #
 
+# Grab the global RHCS helper functions
+. $(dirname $0)/ocf-shellfuncs
+. $(dirname $0)/utils/config-utils.sh
+. $(dirname $0)/utils/messages.sh
+. $(dirname $0)/utils/ra-skelet.sh
+
 . /etc/init.d/functions
 
 declare SCRIPT="`basename $0`"
@@ -60,60 +63,64 @@ ORACLE_SID=$OCF_RESKEY_name
 
 # Optional parameters with default values
 LISTENERS=$OCF_RESKEY_listeners
-LOCKFILE="/tmp/.oracle10g-${ORACLE_SID}.lock"
+LOCKFILE="$ORACLE_HOME/.orainstance-${ORACLE_SID}.lock"
 [ -n "$OCF_RESKEY_lockfile" ] && LOCKFILE=$OCF_RESKEY_lockfile
 
 export LISTENERS ORACLE_USER ORACLE_HOME ORACLE_SID LOCKFILE
 export LD_LIBRARY_PATH=$ORACLE_HOME/lib
-export PATH=$ORACLE_HOME/bin:$PATH
+export PATH=$ORACLE_HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin
 
 declare -i	RESTART_RETRIES=3
 declare -r	DB_PROCNAMES="pmon"
 declare -r	LSNR_PROCNAME="tnslsnr"
 
+# clulog will not log messages when run by the oracle user.
+# This is a hack to work around that.
+if [ "`id -u`" = "`id -u $ORACLE_USER`" ]; then
+	ocf_log() {
+		prio=$1
+		shift
+		logger -i -p daemon."$prio" -- "$*"
+	}
+fi
 
 #
 # Start Oracle (database portion)
 #
 start_db() {
-	declare tmpfile
-	declare logfile
 	declare -i rv
+	declare startup_cmd
+	declare startup_stdout
 
-	tmpfile=/tmp/$SCRIPT-start.$$
-	logfile=/tmp/$SCRIPT-start.log.$$
+	ocf_log info "Starting Oracle DB $ORACLE_SID"
 
 	# Set up our sqlplus script.  Basically, we're trying to 
 	# capture output in the hopes that it's useful in the case
 	# that something doesn't work properly.
-	echo "startup" > $tmpfile
-	echo "quit" >> $tmpfile
-
-	sqlplus "/ as sysdba" < $tmpfile > $logfile
+	startup_cmd="set heading off;\nstartup;\nquit;\n"
+	startup_stdout=$(echo -e "$startup_cmd" | sqlplus -S "/ as sysdba")
 	rv=$?
 
-	rm -f $tmpfile
-
-	# Dump logfile to /var/log/messages
-	initlog -q -c "cat $logfile"
+	# Dump output to syslog for debugging
+	ocf_log debug "[$ORACLE_SID] [$rv] sent $startup_cmd"
+	ocf_log debug "[$ORACLE_SID] [$rv] got $startup_stdout"
 	
 	if [ $rv -ne 0 ]; then
-        rm -f $logfile
-        initlog -n $SCRIPT -q -s "sqlplus returned 1, failed"
+		ocf_log error "Starting Oracle DB $ORACLE_SID failed, sqlplus returned $rv"
 		return 1
 	fi
 
 	# If we see:
 	# ORA-.....: failure, we failed
-	grep -q "^ORA-" $logfile
-	rv=$?
-
-    rm -f $logfile
-	if [ $rv -eq 0 ]; then
-        initlog -n $SCRIPT -q -s "found failure in stdout, returning 1"
+	# Troubleshooting:
+	#   ORA-00845 - Try rm -f /dev/shm/ora_*
+	#   ORA-01081 - Try echo -e 'shutdown abort;\nquit;'|sqlplus "/ as sysdba"
+	if [[ "$startup_stdout" =~ "ORA-" ]] || [[ "$startup_stdout" =~ "failure" ]]; then
+		ocf_log error "Starting Oracle DB $ORACLE_SID failed, found errors in stdout"
 		return 1
 	fi
 
+	ocf_log info "Started Oracle DB $ORACLE_SID successfully"
 	return 0
 }
 
@@ -122,49 +129,47 @@ start_db() {
 # Stop Oracle (database portion)
 #
 stop_db() {
-	declare tmpfile
-	declare logfile
+	declare stop_cmd
+	declare stop_stdout
 	declare -i rv
+	declare how_shutdown="$1"
 
-	tmpfile=/tmp/$SCRIPT-stop.$$
-	logfile=/tmp/$SCRIPT-stop.log.$$
+	if [ -z "$1" ]; then
+		how_shutdown="immediate"
+	fi
 
-    ora_procname="ora_${DB_PROCNAMES}_${ORACLE_SID}"
-    status $ora_procname
-    if [ $? -ne 0 ]; then
-        # No pmon process found, db already down
-        return 0
-    fi
+	ocf_log info "Stopping Oracle DB $ORACLE_SID $how_shutdown"
 
-	# Setup for Stop ...
-	echo "shutdown immediate" > $tmpfile
-	echo "quit" >> $tmpfile
+	ora_procname="ora_${DB_PROCNAMES}_${ORACLE_SID}"
+	status $ora_procname
+	if [ $? -ne 0 ]; then
+		ocf_log debug "no pmon process -- DB $ORACLE_SID already stopped"
+		# No pmon process found, db already down
+		return 0
+	fi
 
-	sqlplus "/ as sysdba" < $tmpfile > $logfile
+	# Setup for Stop ...
+	stop_cmd="set heading off;\nshutdown $how_shutdown;\nquit;\n"
+	stop_stdout=$(echo -e "$stop_cmd" | sqlplus -S "/ as sysdba")
 	rv=$?
 
-	rm -f $tmpfile
-
-	# Dump logfile to /var/log/messages
-	initlog -q -c "cat $logfile"
+	# Log stdout of the stop command
+	ocf_log debug "[$ORACLE_SID] sent stop command $stop_cmd"
+	ocf_log debug "[$ORACLE_SID] got $stop_stdout"
 	
-    # sqlplus returned failure. We'll return failed to rhcs
+	# sqlplus returned failure. We'll return failed to rhcs
 	if [ $rv -ne 0 ]; then
-        rm -f $logfile
-        initlog -n $SCRIPT -q -s "sqlplus returned 1, failed"
+		ocf_log error "Stopping Oracle DB $ORACLE_SID failed, sqlplus returned $rv"
 		return 1
 	fi
 
-	grep -q "^ORA-" $logfile
-    rv=$?
-    rm -f $logfile
-
-	# If we see 'failure' in the log, we're done.
-	if [ $rv -eq 0 ]; then
-        initlog -n $SCRIPT -q -s "found failure in stdout, returning 1"
+	# If we see 'ORA-' or 'failure' in stdout, we're done.
+	if [[ "$startup_stdout" =~ "ORA-" ]] || [[ "$startup_stdout" =~ "failure" ]]; then
+		ocf_log error "Stopping Oracle DB $ORACLE_SID failed, errors in stdout"
 		return 1
 	fi
 
+	ocf_log info "Stopped Oracle DB $ORACLE_SID successfully"
 	return 0
 }
 
@@ -176,14 +181,17 @@ force_cleanup() {
 	declare pids
 	declare pid
 
-	pids=`ps ax | grep $ORACLE_SID | grep -v grep | awk '{print $1}'`
-
-	initlog -n $SCRIPT -s "<err> Not all Oracle processes exited cleanly, killing"
+	ocf_log error "Not all Oracle processes for $ORACLE_SID exited cleanly, killing"
 	
+	pids=`ps ax | grep "ora_.*_${ORACLE_SID}" | grep -v grep | awk '{print $1}'`
+
 	for pid in $pids; do
 		kill -9 $pid
-		if [ $? -eq 0 ]; then
-			initlog -n $SCRIPT -s "Killed $pid"
+		rv=$?
+		if [ $rv -eq 0 ]; then
+			ocf_log info "Cleanup $ORACLE_SID Killed PID $pid"
+		else
+			ocf_log error "Cleanup $ORACLE_SID Kill PID $pid failed: $rv"
 		fi
 	done
 
@@ -197,14 +205,18 @@ force_cleanup() {
 exit_idle() {
 	declare -i n=0
 	
+	ocf_log debug "Waiting for Oracle processes for $ORACLE_SID to terminate..."
 	while ps ax | grep $ORACLE_SID | grep -q -v $LSNR_PROCNAME | grep -q -v grep; do
 		if [ $n -ge 90 ]; then
+			ocf_log debug "Timed out while waiting for Oracle processes for $ORACLE_SID to terminate"
 			force_cleanup
 			return 0
 		fi
 		sleep 1
 		((n++))
 	done
+
+	ocf_log debug "All Oracle processes for $ORACLE_SID have terminated"
 	return 0
 }
 
@@ -219,6 +231,8 @@ get_db_status() {
 	declare -i rv=0
 	declare ora_procname
 
+	ocf_log debug "Checking status of DB $ORACLE_SID"
+
 	for procname in $DB_PROCNAMES ; do
 		ora_procname="ora_${procname}_${ORACLE_SID}"
 		
@@ -231,30 +245,34 @@ get_db_status() {
 		# We're not supposed to be running, and we are,
 		# in fact, not running...
 		if [ $subsys_lock -ne 0 ]; then
+			ocf_log debug "DB $ORACLE_SID is already stopped"
 			return 3
 		fi
 
 		for (( i=$RESTART_RETRIES ; i; i-- )) ; do
 			# this db process is down - stop and
 			# (re)start all ora_XXXX_$ORACLE_SID processes
-			initlog -q -n $SCRIPT -s "Restarting Oracle Database..."
+			ocf_log info "Restarting Oracle Database $ORACLE_SID"
 			stop_db
 
 			start_db
-			if [ $? == 0 ] ; then
+			if [ $? -eq 0 ] ; then
 				# ora_XXXX_$ORACLE_SID processes started
 				# successfully, so break out of the
 				# stop/start # 'for' loop
+				ocf_log info "Restarted Oracle DB $ORACLE_SID successfully"
 				break
 			fi
 		done
 
 		if [ $i -eq 0 ]; then
 			# stop/start's failed - return 1 (failure)
-            initlog -q -n $SCRIPT -s "Restart failed, retuning 1"
+			ocf_log error "Failed to restart Oracle DB $ORACLE_SID after $RESTART_RETRIES tries"
 			return 1
 		fi
 	done
+
+	ocf_log debug "Checking status of DB $ORACLE_SID success"
 	return 0
 }
 
@@ -265,41 +283,48 @@ get_db_status() {
 get_lsnr_status() {
 	declare -i subsys_lock=$1
 	declare -i rv
-    declare -r LISTENER=$3
+	declare -r LISTENER=$3
 
-    lsnrctl status $LISTENER >& /dev/null
+	ocf_log debug "Checking status for listener $LISTENER"
+	lsnrctl status "$LISTENER" >& /dev/null
 	rv=$?
-	if [ $rv == 0 ] ; then
+	if [ $rv -eq 0 ] ; then
+		ocf_log debug "Listener $LISTENER is up"
 		return 0 # Listener is running fine
 	fi
 
 	# We're not supposed to be running, and we are,
 	# in fact, not running.  Return 3
 	if [ $subsys_lock -ne 0 ]; then
+		ocf_log debug "Listener $LISTENER is stopped as expected"
 		return 3
 	fi
 
 	# Listener is NOT running (but should be) - try to restart
 	for (( i=$RESTART_RETRIES ; i; i-- )) ; do
-        initlog -n $SCRIPT -q -s "Restarting Oracle listener ($LISTENER)"
-		lsnrctl start $LISTENER
-		lsnrctl status $LISTENER >& /dev/null
-		if [ $? == 0 ] ; then
+		ocf_log info "Listener $LISTENER is down, attempting to restart"
+		lsnrctl start "$LISTENER" >& /dev/null
+		lsnrctl status "$LISTENER" >& /dev/null
+		if [ $? -eq 0 ]; then
+			ocf_log info "Listener $LISTENER was restarted successfully"
 			break # Listener was (re)started and is running fine
 		fi
 	done
 
 	if [ $i -eq 0 ]; then
 		# stop/start's failed - return 1 (failure)
-        initlog -n $SCRIPT -q -s "Listener restart failed, retuning 1"
+		ocf_log error "Failed to restart listener $LISTENER after $RESTART_RETRIES tries"
 		return 1
 	fi
 
-    lsnrctl status $LISTENER >& /dev/null
-	if [ $? != 0 ] ; then
-        initlog -n $SCRIPT -q -s "Listener status failed, retuning 1"
+	lsnrctl_stdout=$(lsnrctl status "$LISTENER")
+	rv=$?
+	if [ $rv -ne 0 ] ; then
+		ocf_log error "Starting listener $LISTENER failed: $rv output $lsnrctl_stdout"
 		return 1 # Problem restarting the Listener
 	fi
+
+	ocf_log info "Listener $LISTENER started successfully"
 	return 0 # Success restarting the Listener
 }
 
@@ -329,7 +354,7 @@ update_status() {
 	fi
 
 	if [ $old_status -ne $new_status ]; then
-        initlog -n $SCRIPT -q -s "$old_status vs $new_status - returning 1"
+		ocf_log error "Error: $old_status vs $new_status for $ORACLE_SID - returning 1"
 		return 1
 	fi
 
@@ -341,11 +366,7 @@ update_status() {
 # Print an error message to the user and exit.
 #
 oops() {
-	#echo "Please configure this script ($0) to"
-	#echo "match your installation."
-	#echo 
-	#echo "    $1 failed validation checks."
-    initlog -n $SCRIPT -q -s "$1 failed validation checks"
+	ocf_log error "$ORACLE_SID: Fatal: $1 failed validation checks"
 	exit 1
 }
 
@@ -355,16 +376,18 @@ oops() {
 # script.
 #
 validation_checks() {
+	ocf_log debug "Validating configuration for $ORACLE_SID"
+
 	# If the oracle user doesn't exist, we're done.
 	[ -n "$ORACLE_USER" ] || oops "ORACLE_USER"
 	id -u $ORACLE_USER > /dev/null || oops "ORACLE_USER"
-	id -g $ORACLE_USER > /dev/null || oops "ORACLE_USER"
+	id -g $ORACLE_USER > /dev/null || oops "ORACLE_GROUP"
 
 	# If the oracle home isn't a directory, we're done
-	[ -n "$ORACLE_HOME" ] || oops ORACLE_HOME
+	[ -n "$ORACLE_HOME" ] || oops "ORACLE_HOME"
 
 	# If the oracle SID is NULL, we're done
-	[ -n "$ORACLE_SID" ] || oops ORACLE_SID
+	[ -n "$ORACLE_SID" ] || oops "ORACLE_SID"
 
 	# Super user? Automatically change UID and exec as oracle user.
 	# Oracle needs to be run as the Oracle user, not root!
@@ -374,12 +397,13 @@ validation_checks() {
 	fi
 
 	# If we're not root and not the Oracle user, we're done.
-	[ "`id -u`" = "`id -u $ORACLE_USER`" ] || exit 1
-	[ "`id -g`" = "`id -g $ORACLE_USER`" ] || exit 1
+	[ "`id -u`" = "`id -u $ORACLE_USER`" ] || oops "not ORACLE_USER after su"
+	[ "`id -g`" = "`id -g $ORACLE_USER`" ] || oops "not ORACLE_GROUP after su"
 
 	# Go home.
-	cd $ORACLE_HOME
+	cd "$ORACLE_HOME"
 
+	ocf_log debug "Validation checks for $ORACLE_SID succeeded"
 	return 0
 }
 
@@ -388,20 +412,31 @@ validation_checks() {
 # Start Oracle
 #
 start_oracle() {
-    initlog -n $SCRIPT -q -s "Starting Oracle Database"
-	start_db || return 1
-	
-    for LISTENER in ${LISTENERS}; do
-        logfile=/tmp/$SCRIPT-lsn-$$.log
-        initlog -n $SCRIPT -q -s "Starting Oracle Listener $LISTENER"
-        lsnrctl start $LISTENER > $logfile
-        initlog -q -c "cat $logfile"
-        rm -f $logfile
-    done
+	ocf_log info "Starting service $ORACLE_SID"
+
+	start_db
+	rv=$?
+	if [ $rv -ne 0 ]; then
+		ocf_log error "Starting service $ORACLE_SID failed"
+		return 1
+	fi
+
+	for LISTENER in ${LISTENERS}; do
+		ocf_log info "Starting listener $LISTENER"
+		lsnrctl_stdout=$(lsnrctl start "$LISTENER")
+		rv=$?
+		if [ $rv -ne 0 ]; then
+			ocf_log debug "[$ORACLE_SID] Listener $LISTENER start returned $rv output $lsnrctl_stdout"
+			ocf_log error "Starting service $ORACLE_SID failed"
+			return 1
+		fi
+	done
 
 	if [ -n "$LOCKFILE" ]; then
-		touch $LOCKFILE
+		touch "$LOCKFILE"
 	fi
+
+	ocf_log info "Starting service $ORACLE_SID completed successfully"
 	return 0
 }
 
@@ -410,30 +445,42 @@ start_oracle() {
 # Stop Oracle
 #
 stop_oracle() {
+	ocf_log info "Stopping service $ORACLE_SID"
+
 	if ! [ -e "$ORACLE_HOME/bin/lsnrctl" ]; then
-		initlog -n $SCRIPT -q -s "Oracle Listener Control is not available ($ORACLE_HOME not mounted?)"
+		ocf_log error "Oracle Listener Control is not available ($ORACLE_HOME not mounted?)"
+		# XXX should this return 1?
 		return 0
 	fi
 
-    initlog -n $SCRIPT -q -s "Stopping Oracle Database"
-    stop_db || return 1
+	stop_db || stop_db abort
+	if [ $? -ne 0 ]; then
+		ocf_log error "Unable to stop DB for $ORACLE_SID"
+		return 1
+	fi
 
-	
-    for LISTENER in ${LISTENERS}; do
-        initlog -n $SCRIPT -q -s "Stopping Oracle Listener $LISTENER"
-        lsnrctl stop $LISTENER
-    done
+	for LISTENER in ${LISTENERS}; do
+		ocf_log info "Stopping listener $LISTENER for $ORACLE_SID"
+		lsnrctl_stdout=$(lsnrctl stop "$LISTENER")
+		rv=$?
+		if [ $? -ne 0 ]; then
+			ocf_log error "Listener $LISTENER stop failed for $ORACLE_SID: $rv output $lsnrctl_stdout"
+			# XXX - failure?
+		fi
+	done
 
-    initlog -n $SCRIPT -q -s "Waiting for all Oracle processes to exit"
-    exit_idle
+	exit_idle
 
 	if [ $? -ne 0 ]; then
-		initlog -n $SCRIPT -q -s "WARNING: Not all Oracle processes exited cleanly"
+		ocf_log error "WARNING: Not all Oracle processes exited cleanly for $ORACLE_SID"
+		# XXX - failure?
 	fi
 
 	if [ -n "$LOCKFILE" ]; then
-		rm -f $LOCKFILE
+		rm -f "$LOCKFILE"
 	fi
+
+	ocf_log info "Stopping service $ORACLE_SID succeeded"
 	return 0
 }
 
@@ -461,8 +508,10 @@ status_oracle() {
 	declare -i last 
 	declare -i depth=$1
 
+	ocf_log debug "Checking status for $ORACLE_SID depth $depth"
+
 	# Check for lock file. Crude and rudimentary, but it works
-	if [ -z "$LOCKFILE" ] || [ -f $LOCKFILE ]; then
+	if [ -z "$LOCKFILE" ] || [ -f "$LOCKFILE" ]; then
 		subsys_lock=0 
 	fi
 
@@ -472,18 +521,19 @@ status_oracle() {
 	last=$?
 
 	# Check & report listener status
-    for LISTENER in ${LISTENERS}; do
-        get_lsnr_status $subsys_lock $depth $LISTENER
-        update_status $? $last
-        last=$?
-    done
+	for LISTENER in ${LISTENERS}; do
+		get_lsnr_status $subsys_lock $depth "$LISTENER"
+		update_status $? $last
+		last=$?
+	done
 	
 	# No lock file, but everything's running.  Put the lock
 	# file back. XXX - this kosher?
 	if [ $last -eq 0 ] && [ $subsys_lock -ne 0 ]; then
-		touch $LOCKFILE
+		touch "$LOCKFILE"
 	fi
 
+	ocf_log debug "Status returning $last for $ORACLE_SID"
 	return $last
 }
 
@@ -493,22 +543,22 @@ status_oracle() {
 ########################
 
 case $1 in
-    meta-data)
-        cat `echo $0 | sed 's/^\(.*\)\.sh$/\1.metadata/'`
-        exit 0
-        ;;
+	meta-data)
+		cat `echo $0 | sed 's/^\(.*\)\.sh$/\1.metadata/'`
+		exit 0
+		;;
 	start)
-        validation_checks $*
+		validation_checks $*
 		start_oracle
 		exit $?
 		;;
 	stop)
-        validation_checks $*
+		validation_checks $*
 		stop_oracle
 		exit $?
 		;;
 	status|monitor)
-        validation_checks $*
+		validation_checks $*
 		status_oracle $OCF_CHECK_LEVEL
 		exit $?
 		;;
diff --git a/rgmanager/src/resources/oralistener.sh b/rgmanager/src/resources/oralistener.sh
index 3d6b839..30b8e06 100755
--- a/rgmanager/src/resources/oralistener.sh
+++ b/rgmanager/src/resources/oralistener.sh
@@ -1,7 +1,5 @@
 #!/bin/bash
 #
-# $Id: oralistener.sh 127 2009-08-21 09:17:52Z hevirtan $
-#
 # Red Hat Cluster Suite resource agent for controlling Oracle 10g
 # listener instances. This script will start, stop and monitor running
 # listeners.
@@ -12,6 +10,24 @@
 #
 # monitor:  Will check that the listener is OK by calling lsnrctl status
 #
+#
+# Copyright (C) 1997-2003 Sistina Software, Inc.  All rights reserved.
+# Copyright (C) 2004-2013 Red Hat, Inc.  All rights reserved.
+#
+# 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
 
 # Grab the global RHCS helper functions
 . $(dirname $0)/ocf-shellfuncs
@@ -27,126 +43,148 @@ LISTENER=$OCF_RESKEY_name
 
 LC_ALL=C
 LANG=C
-PATH=/bin:/sbin:/usr/bin:/usr/sbin:$ORACLE_HOME/bin
-export LC_ALL LANG PATH ORACLE_HOME
+PATH=$ORACLE_HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin
+export LC_ALL LANG PATH ORACLE_USER ORACLE_HOME
+
+# clulog will not log messages when run by the oracle user.
+# This is a hack to work around that.
+if [ "`id -u`" = "`id -u $ORACLE_USER`" ]; then
+	ocf_log() {
+		prio=$1
+		shift
+		logger -i -p daemon."$prio" -- "$*"
+	}
+fi
 
 verify_all() {
-    clog_service_verify $CLOG_INIT
-
-    if [ -z "$OCF_RESKEY_name" ]; then
-        clog_service_verify $CLOG_FAILED "Invalid name of service (listener name)"
-        return $OCF_ERR_ARGS
-    fi
-
-    if [ -z "$OCF_RESKEY_home" ]; then
-        clog_service_verify $CLOG_FAILED "No Oracle home specified."
-        return $OCF_ERR_ARGS
-    fi
-
-    if [ -z "$OCF_RESKEY_user" ]; then
-        clog_service_verify $CLOG_FAILED "No Oracle username specified."
-        return $OCF_ERR_ARGS
-    fi
-        
-    # Make sure the lsnrctl binary is in our $PATH
-    if [ ! -x $(which lsnrctl) ]; then
-        clog_service_verify $CLOG_FAILED "oralistener:${OCF_RESKEY_home}: Unable to locate lsnrctl command from path! ($PATH)"
-        return $OCF_ERR_GENERIC
-    fi
-
-    clog_service_verify $CLOG_SUCCEED
-    return 0
-}
+	ocf_log debug "Validating configuration for $LISTENER"
 
-start () {
-    clog_service_start $CLOG_INIT
-    
-    logfile="/tmp/oracle_lsn.$$"
-    su -p - $ORACLE_USER -c "lsnrctl start $LISTENER > $logfile"
+	if [ -z "$OCF_RESKEY_name" ]; then
+		ocf_log error "Validation for $LISTENER failed: Invalid name of service (listener name)"
+		return $OCF_ERR_ARGS
+	fi
 
-    initlog -q -c "cat $logfile"
-    rm -f $logfile
+	if [ -z "$OCF_RESKEY_home" ]; then
+		ocf_log error "Validation for $LISTENER failed: No Oracle home specified."
+		return $OCF_ERR_ARGS
+	fi
 
-    clog_service_start $CLOG_SUCCEED
-    return 0
+	if [ -z "$OCF_RESKEY_user" ]; then
+		ocf_log error "Validation for $LISTENER failed: No Oracle username specified."
+		return $OCF_ERR_ARGS
+	fi
+ 
+	# Super user? Automatically change UID and exec as oracle user.
+	# Oracle needs to be run as the Oracle user, not root!
+	if [ "`id -u`" = "0" ]; then
+		su $OCF_RESKEY_user -c "$0 $*"
+		exit $?
+	fi
+
+	# Make sure the lsnrctl binary is in our $PATH
+	if [ ! -x $(which lsnrctl) ]; then
+		ocf_log error "Validation for $LISTENER failed: Unable to locate lsnrctl command from path! ($PATH)"
+		return $OCF_ERR_GENERIC
+	fi
+
+	ocf_log debug "Validation checks for $LISTENER succeeded"
+	return 0
+}
+
+start() {
+	ocf_log info "Starting listener $LISTENER"
+	lsnrctl_stdout=$(lsnrctl start "$LISTENER")
+	if [ $? -ne 0 ]; then
+		ocf_log error "start listener $LISTENER failed $lsnrctl_stdout"
+		return $OCF_ERR_GENERIC
+	fi
+
+	ocf_log info "Listener $LISTENER started successfully"
+	return 0
 }
  
-stop () {
-    clog_service_stop $CLOG_INIT
-    
-    logfile="/tmp/oracle_lsn.$$"
-    su -p - $ORACLE_USER -c "lsnrctl stop $LISTENER > $logfile"
+stop() {
+	ocf_log info "Stopping listener $LISTENER"
 
-    initlog -q -c "cat $logfile"
-    rm -f $logfile
+	lsnrctl_stdout=$(lsnrctl stop "$LISTENER")
+	if [ $? -ne 0 ]; then
+		ocf_log debug "stop listener $LISTENER failed $lsnrctl_stdout"
+		return $OCF_ERR_GENERIC
+	fi
 
-    clog_service_stop $CLOG_SUCCEED
-    return 0
+	ocf_log info "Listener $LISTENER stopped successfully"
+	return 0
 }
  
-monitor () {
-    clog_service_status $CLOG_INIT
-    
-    su -p - $ORACLE_USER -c "lsnrctl status $LISTENER"
-    rv=$?
-    if [ $rv == 0 ]; then
-        clog_service_status $CLOG_SUCCEED
-	    return 0 # Listener is running fine
-    else
-        clog_service_status $CLOG_FAILED
-        return $OCF_ERR_GENERIC
-    fi
+monitor() {
+	declare -i depth=$1
+
+	ocf_log debug "Checking status for listener $LISTENER depth $depth"
+	lsnrctl status "$LISTENER" >& /dev/null
+	if [ $? -ne 0 ]; then
+		ocf_log error "Listener $LISTENER not running"
+		return $OCF_ERR_GENERIC
+	fi
+
+	ocf_log debug "Listener $LISTENER is up"
+	return 0 # Listener is running fine
 }
 
 recover() {
+	ocf_log debug "Recovering listener $LISTENER"
+
 	for (( i=$RESTART_RETRIES ; i; i-- )); do
 		start
-		if [ $? == 0 ] ; then
-		    break
+		if [ $? -eq 0 ] ; then
+			ocf_log debug "Restarted listener $LISTENER successfully"
+			break
 		fi
 	done
 
 	if [ $i -eq 0 ]; then
 		# stop/start's failed - return 1 (failure)
+		ocf_log debug "Failed to restart listener $LISTENER after $RESTART_RETRIES tries"
 		return 1
 	fi
 
-    status
-	if [ $? != 0 ] ; then
+	status
+	if [ $? -ne 0 ] ; then
+		ocf_log debug "Failed to restart listener $LISTENER"
 		return 1 # Problem restarting the Listener
 	fi
 
+	ocf_log debug "Restarted listener $LISTENER successfully"
 	return 0 # Success restarting the Listener
 }
 
 case $1 in
-    meta-data)
-        cat `echo $0 | sed 's/^\(.*\)\.sh$/\1.metadata/'`
-        exit 0
-        ;;
-    verify-all)
-        verify_all
-        exit $?
-        ;;
-    start)
-        verify_all && start
-        exit $?
-        ;;
-    stop)
-        verify_all && stop
-        exit $?
-        ;;
-    recover)
-        verify_all && recover
-        exit $?
-        ;;
-    status|monitor)
-        verify_all
-        monitor
-        exit $?
-        ;;
-    *)
-        echo "Usage: $0 {start|stop|recover|monitor|status|meta-data|verify-all}"
-        exit $OCF_ERR_GENERIC
-        ;;
+	meta-data)
+		cat `echo $0 | sed 's/^\(.*\)\.sh$/\1.metadata/'`
+		exit 0
+		;;
+	verify-all)
+		verify_all $*
+		exit $?
+		;;
+	start)
+		verify_all $* && start
+		exit $?
+		;;
+	stop)
+		verify_all $* && stop
+		exit $?
+		;;
+	recover)
+		verify_all $* && recover
+		exit $?
+		;;
+	status|monitor)
+		verify_all $*
+		monitor $OCF_CHECK_LEVEL
+		exit $?
+		;;
+	*)
+		echo "Usage: $0 {start|stop|recover|monitor|status|meta-data|verify-all}"
+		exit $OCF_ERR_GENERIC
+		;;
 esac


More information about the cluster-commits mailing list