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