diff --git a/rgmanager/src/resources/Makefile.am b/rgmanager/src/resources/Makefile.am index 862bdf5d2..de88c6907 100644 --- a/rgmanager/src/resources/Makefile.am +++ b/rgmanager/src/resources/Makefile.am @@ -1,118 +1,119 @@ # # Copyright (C) 2004-2011 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. # MAINTAINERCLEANFILES = Makefile.in SUBDIRS = utils TARGET = fs.sh RESOURCES = service.sh ip.sh nfsclient.sh nfsexport.sh \ script.sh netfs.sh clusterfs.sh smb.sh \ apache.sh openldap.sh samba.sh mysql.sh \ postgres-8.sh tomcat-5.sh lvm.sh \ vm.sh SAPInstance SAPDatabase named.sh db2.sh \ ASEHAagent.sh drbd.sh nfsserver.sh \ tomcat-6.sh orainstance.sh oralistener.sh oracledb.sh \ - bind-mount.sh + bind-mount.sh oradg.sh METADATA = apache.metadata openldap.metadata samba.metadata \ mysql.metadata postgres-8.metadata \ tomcat-5.metadata named.metadata lvm.metadata \ drbd.metadata tomcat-6.metadata \ - orainstance.metadata oralistener.metadata + orainstance.metadata oralistener.metadata \ + oradg.metadata HELPERS = ocf-shellfuncs svclib_nfslock \ lvm_by_lv.sh lvm_by_vg.sh DTD = ra-api-1-modified.dtd XSL = ra2man.xsl ra2ref.xsl ra2rng.xsl RESRNG = resources.rng.head resources.rng.mid resources.rng.tail EXTRA_DIST = $(TARGET:=.in) \ $(RESOURCES) \ $(METADATA) \ $(HELPERS) \ $(DTD) \ $(XSL) \ $(RESRNG) rasdir = ${CLUSTERDATA} ras_SCRIPTS = $(TARGET) \ $(RESOURCES) \ $(HELPERS) ras_DATA = $(METADATA) rngdir = ${CLUSTERDATA}/relaxng rng_DATA = $(DTD) $(XSL) $(RESRNG) $(TARGET): cat $@.in | sed \ -e 's#@''LOGDIR@#${LOGDIR}#g' \ > $@.out chmod +x $@.out mv $@.out $@ clean-local: rm -f $(TARGET) resources.rng ras-validation: $(RESOURCES) $(TARGET) $(DTD) @echo Validating resource agent meta-data @for f in $(RESOURCES); do \ echo " $(abs_srcdir)/$$f "; \ bash $(abs_srcdir)/$$f meta-data | xmllint --dtdvalid \ $(abs_srcdir)/$(DTD) --noout -; \ if [ $$? -ne 0 ]; then exit 1; fi \ done @for f in $(TARGET); do \ echo " $(abs_builddir)/$$f "; \ bash $(abs_builddir)/$$f meta-data | xmllint --dtdvalid \ $(abs_srcdir)/$(DTD) --noout -; \ if [ $$? -ne 0 ]; then exit 1; fi \ done # # Schema maintenance. Run 'make resources.rng' and paste it in to # config/tools/xml/cluster.rng.in where it says 'autogenerated'. # # resources.rng.* should never be distributed by themselves. # resources.rng: $(RESOURCES) $(TARGET) utils/config-utils.sh resources.rng: $(XSL) $(RESRNG) rm -f resources.rng cat resources.rng.head >> resources.rng @echo Generating per-resource RelaxNG information... @for f in $(RESOURCES) $(TARGET); do \ echo " ./$$f"; \ bash ./$$f meta-data | xsltproc ra2rng.xsl - >> resources.rng; \ done cat resources.rng.mid >> resources.rng @echo Generating per-resource RelaxNG reference information... @for f in $(RESOURCES) $(TARGET); do \ echo " ./$$f"; \ bash ./$$f meta-data | xsltproc ra2ref.xsl - >> resources.rng; \ done cat resources.rng.tail >> resources.rng utils/config-utils.sh: make -C utils config-utils.sh diff --git a/rgmanager/src/resources/oradg.metadata b/rgmanager/src/resources/oradg.metadata new file mode 100644 index 000000000..2f8f044a3 --- /dev/null +++ b/rgmanager/src/resources/oradg.metadata @@ -0,0 +1,107 @@ + + + + + + 1.0 + + + Oracle Data Guard Failover Instance + + + Oracle Data Guard Failover Instance + + + + + + Instance name (SID) of oracle instance + + + Oracle SID + + + + + + + Oracle user name. This is the user name of the Oracle + user which the Oracle instance runs as. + + + Oracle User Name + + + + + + + This is the Oracle database home directory. + This is configured when you install Oracle. + + + Oracle Home Directory + + + + + + + List of Oracle listeners which will be started with + the database instance. Listener names are separated by + whitespace. Defaults to empty which disables listeners. + + + Oracle listeners + + + + + + + Virtual hostname for DB Console startup + + + Virtual hostname for DB Console + + + + + + + Location for lockfile which will be used for checking if + the Oracle should be running or not. Defaults to location + under /tmp. + + + Pathname for lockfile + + + + + + + Full path to the directory that contains the Oracle + listener tnsnames.ora configuration file. The shell + variable TNS_ADMIN is set to the value provided. + + + Full path to the directory containing tnsnames.ora + + + + + + + + + + + + + + + + + diff --git a/rgmanager/src/resources/oradg.sh b/rgmanager/src/resources/oradg.sh new file mode 100755 index 000000000..778712692 --- /dev/null +++ b/rgmanager/src/resources/oradg.sh @@ -0,0 +1,660 @@ +#!/bin/bash +# +# Copyright 2003-2004, 2006-2013 Red Hat, Inc. +# +# Author(s): +# Hardy Merrill +# Lon Hohberger +# Michael Moon +# Ryan McCabe +# +# 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 +# +# NOTES: +# +# (1) You can comment out the LOCKFILE declaration below. This will prevent +# the need for this script to access anything outside of the ORACLE_HOME +# path. +# +# (2) You MUST customize ORACLE_USER, ORACLE_HOME, ORACLE_SID, and +# ORACLE_HOSTNAME to match your installation if not running from within +# rgmanager. +# +# (3) Do NOT place this script in shared storage; place it in ORACLE_USER's +# home directory in non-clustered environments and /usr/share/cluster +# in rgmanager/Red Hat cluster environments. +# +# 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. +# +# +# $Id: oradg.sh 127 2009-08-21 09:17:52Z hevirtan $ +# +# Original version is distributed with RHCS. The modifications include +# the following minor changes: +# - Meta-data moved to a dedicated file +# - Support for multiple listeners +# - Disabled EM +# - 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`" +declare SCRIPTDIR="`dirname $0`" + +# Required parameters from rgmanager +ORACLE_USER=$OCF_RESKEY_user +ORACLE_HOME=$OCF_RESKEY_home +ORACLE_SID=$OCF_RESKEY_name +[ -n "$OCF_RESKEY_tns_admin" ] && export TNS_ADMIN=$OCF_RESKEY_tns_admin + +# Optional parameters with default values +LISTENERS=$OCF_RESKEY_listeners +LOCKFILE="$ORACLE_HOME/.orainstance-${ORACLE_SID}.lock" +[ -n "$OCF_RESKEY_vhost" ] && ORACLE_HOSTNAME=$OCF_RESKEY_vhost +[ -n "$OCF_RESKEY_lockfile" ] && LOCKFILE=$OCF_RESKEY_lockfile + +export LISTENERS ORACLE_USER ORACLE_HOME ORACLE_SID LOCKFILE ORACLE_HOSTNAME +export LD_LIBRARY_PATH=$ORACLE_HOME/lib +export PATH=$ORACLE_HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin + +#declare -i RESTART_RETRIES=3 +declare -i RESTART_RETRIES=0 +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 -i rv + declare startup_cmd + declare startup_stdout + + 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. + + startup_stdout=$(sqlplus "/ as sysdba" << EOF +set serveroutput on +startup mount; + +declare + rol varchar(20); +begin + select database_role into rol from v\$database; + + dbms_output.put_line('Database role is ' || rol); + if (rol = 'PHYSICAL STANDBY') then + return; + end if; + + execute immediate 'alter database open'; +end; +/ + +select database_role, open_mode from v\$database; +set heading off; +set serveroutput off; +spool /tmp/dgstatus.${ORACLE_SID}; +select open_mode from v\$database; +spool off; +EOF +) + rv=$? + + # Data Guard Modification 2 - Remove deprecated parameter error from startup_stdout + startup_stdout=$(echo $startup_stdout | sed 's/ORA-32004//g') + + # 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 + ocf_log error "Starting Oracle DB $ORACLE_SID failed, sqlplus returned $rv" + return 1 + fi + + # If we see: + # ORA-.....: failure, we failed + # 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 Oracle (database portion) +# +stop_db() { + declare stop_cmd + declare stop_stdout + declare -i rv + declare how_shutdown="$1" + + if [ -z "$1" ]; then + how_shutdown="immediate" + fi + + ocf_log info "Stopping Oracle DB $ORACLE_SID $how_shutdown" + + 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 + + # Setup for Stop ... + stop_cmd="set heading off;\nshutdown $how_shutdown;\nquit;\n" + stop_stdout=$(echo -e "$stop_cmd" | sqlplus -S "/ as sysdba") + rv=$? + + # 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 + ocf_log error "Stopping Oracle DB $ORACLE_SID failed, sqlplus returned $rv" + return 1 + fi + + # 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 +} + + +# +# Destroy any remaining processes with refs to $ORACLE_SID +# +force_cleanup() { + declare pids + declare pid + + 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 + 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 + + return 0 +} + + +# +# Wait for oracle processes to exit. Time out after 60 seconds +# +exit_idle() { + declare -i n=0 + + ocf_log debug "Waiting for Oracle processes for $ORACLE_SID to terminate..." + while ps ax | grep "ora_.*_${ORACLE_SID}$" | grep -v grep | grep -q -v $LSNR_PROCNAME; 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 +} + + +# +# Get database background process status. Restart it if it failed and +# we have seen the lock file. +# +get_db_status() { + declare -i subsys_lock=$1 + declare -i i=0 + 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}" + + status $ora_procname + if [ $? -eq 0 ] ; then + # This one's okay; go to the next one. + continue + fi + + # 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 + ocf_log info "Restarting Oracle Database $ORACLE_SID" + stop_db + + start_db + 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) + 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 +} + + +# +# Get the status of the Oracle listener process +# +get_lsnr_status() { + declare -i subsys_lock=$1 + declare -i rv + declare -r LISTENER=$3 + + ocf_log debug "Checking status for listener $LISTENER" + lsnrctl status "$LISTENER" >& /dev/null + rv=$? + 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 + 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) + ocf_log error "Failed to restart listener $LISTENER after $RESTART_RETRIES tries" + return 1 + fi + + 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 +} + + +# +# Helps us keep a running status so we know what our ultimate return +# code will be. Returns 1 if the $1 and $2 are not equivalent, otherwise +# returns $1. The return code is meant to be the next $1 when this is +# called, so, for example: +# +# update_status 0 <-- returns 0 +# update_status $? 0 <-- returns 0 +# update_status $? 3 <-- returns 1 (values different - error condition) +# update_status $? 1 <-- returns 1 (same, but happen to be error state!) +# +# update_status 3 +# update_status $? 3 <-- returns 3 +# +# (and so forth...) +# +update_status() { + declare -i old_status=$1 + declare -i new_status=$2 + + if [ -z "$2" ]; then + return $old_status + fi + + if [ $old_status -ne $new_status ]; then + ocf_log error "Error: $old_status vs $new_status for $ORACLE_SID - returning 1" + return 1 + fi + + return $old_status +} + + +# +# Print an error message to the user and exit. +# +oops() { + ocf_log error "$ORACLE_SID: Fatal: $1 failed validation checks" + exit 1 +} + + +# +# Do some validation on the user-configurable stuff at the beginning of the +# 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_GROUP" + + # If the oracle home isn't a directory, we're done + [ -n "$ORACLE_HOME" ] || oops "ORACLE_HOME" + + # If the oracle SID is NULL, we're done + [ -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! + if [ "`id -u`" = "0" ]; then + su $ORACLE_USER -c "$0 $*" + exit $? + fi + + # If we're not root and not the Oracle user, we're done. + [ "`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" + + ocf_log debug "Validation checks for $ORACLE_SID succeeded" + return 0 +} + + +# +# Start Oracle +# +start_oracle() { + 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 "$ORACLE_HOSTNAME" -a -s /tmp/dgstatus.${ORACLE_SID} ]; then + # Start DB Console if vhost defined and database_role is READ WRITE + if cat /tmp/dgstatus.${ORACLE_SID} 2>/dev/null | grep "READ WRITE"; 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" + # Force good return status + #return 1 + return 0 + else + ocf_log info "Oracle EM DB Console startup for $ORACLE_SID succeeded" + fi + fi + rm -f /tmp/dgstatus.${ORACLE_SID} + fi + + if [ -n "$LOCKFILE" ]; then + touch "$LOCKFILE" + fi + + ocf_log info "Starting service $ORACLE_SID completed successfully" + return 0 +} + + +# +# Stop Oracle +# +stop_oracle() { + ocf_log info "Stopping service $ORACLE_SID" + + if ! [ -e "$ORACLE_HOME/bin/lsnrctl" ]; then + ocf_log error "Oracle Listener Control is not available ($ORACLE_HOME not mounted?)" + # XXX should this return 1? + return 0 + fi + + 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 + ocf_log info "Stopping listener $LISTENER for $ORACLE_SID" + lsnrctl_stdout=$(lsnrctl stop "$LISTENER") + rv=$? + if [ $rv -ne 0 ]; then + ocf_log error "Listener $LISTENER stop failed for $ORACLE_SID: $rv output $lsnrctl_stdout" + + pid=`ps ax | grep "tnslsnr $LISTENER " | grep -v grep | awk '{print $1}'` + kill -9 $pid + rv=$? + if [ $rv -eq 0 ]; then + ocf_log info "Cleanup $LISTENER Killed PID $pid" + else + ocf_log error "Cleanup $LISTENER Kill PID $pid failed: $rv" + fi + fi + done + + if [ -n "$ORACLE_HOSTNAME" ]; then + # Stop DB Console if vhost defined + 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" + # Force good return status + #return 1 + return 0 + else + ocf_log info "Stopping Oracle EM DB Console for $ORACLE_SID succeeded" + fi + fi + + exit_idle + + if [ $? -ne 0 ]; then + ocf_log error "WARNING: Not all Oracle processes exited cleanly for $ORACLE_SID" + # XXX - failure? + fi + + if [ -n "$LOCKFILE" ]; then + rm -f "$LOCKFILE" + fi + + ocf_log info "Stopping service $ORACLE_SID succeeded" + return 0 +} + + +# +# Find and display the status of iAS infrastructure. +# +# This has three parts: +# (1) Oracle database itself +# (2) Oracle listener process +# (3) OPMN and OPMN-managed processes +# +# - If all are (cleanly) down, we return 3. In order for this to happen, +# $LOCKFILE must not exist. In this case, we try and restart certain parts +# of the service - as this may be running in a clustered environment. +# +# - If some but not all are running (and, if $LOCKFILE exists, we could not +# restart the failed portions), we return 1 (ERROR) +# +# - If all are running, return 0. In the "all-running" case, we recreate +# $LOCKFILE if it does not exist. +# +status_oracle() { + declare -i subsys_lock=1 + 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 + subsys_lock=0 + fi + + # Check database status + get_db_status $subsys_lock $depth + update_status $? # Start + last=$? + + # Check & report listener status + for LISTENER in ${LISTENERS}; do + get_lsnr_status $subsys_lock $depth "$LISTENER" + update_status $? $last + last=$? + done + + # No status for DB Console (ORACLE_HOSTNAME) + + # 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" + fi + + ocf_log debug "Status returning $last for $ORACLE_SID" + return $last +} + + +######################## +# Do some real work... # +######################## + +# Data Guard Modification 1 - Debug Logging +case $1 in +stop | start | status | restart | recover | monitor ) +[ $(id -u) = 0 ] && exec > "/tmp/oradg_${ORACLE_SID}_$1.log" 2>&1 +set -x +date +echo $@ +printenv +esac + +case $1 in + meta-data) + cat `echo $0 | sed 's/^\(.*\)\.sh$/\1.metadata/'` + exit 0 + ;; + start) + validation_checks $* + start_oracle + exit $? + ;; + stop) + validation_checks $* + stop_oracle + exit $? + ;; + status|monitor) + validation_checks $* + status_oracle $OCF_CHECK_LEVEL + exit $? + ;; + restart) + $0 stop || exit $? + $0 start || exit $? + exit 0 + ;; + *) + echo "usage: $SCRIPT {start|stop|restart|status|monitor|meta-data}" + exit 1 + ;; +esac + +exit 0