Gitweb: http://git.fedorahosted.org/git/?p=cluster.git;a=commitdiff;h=3ac6fa12877780... Commit: 3ac6fa12877780c28b07c9d2402687f878ba374e Parent: c830187908b759b5b5203efc0fa441fc401b7f1b Author: Ryan McCabe rmccabe@redhat.com AuthorDate: Thu May 16 16:51:55 2013 -0400 Committer: Ryan McCabe rmccabe@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@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
cluster-commits@lists.stg.fedorahosted.org