This is the mail archive of the
cluster-cvs@sourceware.org
mailing list for the cluster.
master - rgmanager: move oracledb.sh log files where they belong
- From: "Fabio M. Di Nitto" <fabbione at fedoraproject dot org>
- To: cluster-cvs-relay at redhat dot com
- Date: Wed, 22 Oct 2008 08:27:45 +0000 (UTC)
- Subject: master - rgmanager: move oracledb.sh log files where they belong
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=67d608469a985a8ce708c0a564ee232f98325092
Commit: 67d608469a985a8ce708c0a564ee232f98325092
Parent: 5c54fe5c5c288519b187b11289c9c2cf9db59353
Author: Fabio M. Di Nitto <fdinitto@redhat.com>
AuthorDate: Wed Oct 22 10:26:58 2008 +0200
Committer: Fabio M. Di Nitto <fdinitto@redhat.com>
CommitterDate: Wed Oct 22 10:26:58 2008 +0200
rgmanager: move oracledb.sh log files where they belong
by using a static path to /tmp, the operation can be used to trigger
a local DoS by a normal user.
Move the log files to LOGDIR where they are expected to be. LOGDIR
is generally owned by root and doesn't allow normal users to play with
it.
Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
---
rgmanager/src/resources/Makefile | 14 +-
rgmanager/src/resources/oracledb.sh | 887 -------------------------------
rgmanager/src/resources/oracledb.sh.in | 888 ++++++++++++++++++++++++++++++++
3 files changed, 898 insertions(+), 891 deletions(-)
diff --git a/rgmanager/src/resources/Makefile b/rgmanager/src/resources/Makefile
index e6de1f2..6caba66 100644
--- a/rgmanager/src/resources/Makefile
+++ b/rgmanager/src/resources/Makefile
@@ -1,7 +1,8 @@
TARGET1=utils/config-utils.sh
TARGET2=fs.sh
+TARGET3=oracledb.sh
-all: $(TARGET1) $(TARGET2)
+all: $(TARGET1) $(TARGET2) $(TARGET3)
include ../../../make/defines.mk
include $(OBJDIR)/make/clean.mk
@@ -11,7 +12,7 @@ RESOURCES=service.sh ip.sh nfsclient.sh nfsexport.sh \
apache.sh openldap.sh samba.sh mysql.sh \
postgres-8.sh tomcat-5.sh lvm.sh \
vm.sh SAPInstance SAPDatabase named.sh \
- oracledb.sh ASEHAagent.sh
+ ASEHAagent.sh
METADATA=apache.metadata openldap.metadata samba.metadata \
mysql.metadata postgres-8.metadata tomcat-5.metadata \
@@ -36,6 +37,11 @@ $(TARGET2):
-e 's#@LOGDIR@#${logdir}#g' \
> $(TARGET2)
+$(TARGET3):
+ cat $(S)/$(TARGET3).in | sed \
+ -e 's#@LOGDIR@#${logdir}#g' \
+ > $(TARGET3)
+
install:
install -d ${sharedir}/utils
for i in $(RESOURCES); do \
@@ -51,12 +57,12 @@ install:
install -m755 $(S)/$$i ${sharedir}/utils; \
done
install -m755 $(TARGET1) ${sharedir}/utils
- install -m755 $(TARGET2) ${sharedir}
+ install -m755 $(TARGET2) $(TARGET3) ${sharedir}
uninstall:
${UNINSTALL} ${RESOURCES} ${GENERAL_TARGETS} \
${METADATA} ${UTIL_TARGETS} \
- $(TARGET1) $(TARGET2) \
+ $(TARGET1) $(TARGET2) $(TARGET3) \
${sharedir}
clean: generalclean
diff --git a/rgmanager/src/resources/oracledb.sh b/rgmanager/src/resources/oracledb.sh
deleted file mode 100644
index 25a0c09..0000000
--- a/rgmanager/src/resources/oracledb.sh
+++ /dev/null
@@ -1,887 +0,0 @@
-#!/bin/bash
-# Author(s):
-# Hardy Merrill <hmerrill at redhat.com>
-# Lon Hohberger <lhh at redhat.com>
-# Michael Moon <Michael dot Moon at oracle.com>
-#
-# 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
-# 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.
-# All other trademarks are property of their respective owners.
-#
-
-. /etc/init.d/functions
-
-#
-# Source stuff from /etc/sysconfig, but this may be overridden if
-# this is being called as a cluster resource agent instead.
-#. /etc/sysconfig/oracledb
-
-declare SCRIPT="`basename $0`"
-declare SCRIPTDIR="`dirname $0`"
-
-[ -n "$OCF_RESKEY_user" ] && ORACLE_USER=$OCF_RESKEY_user
-[ -n "$OCF_RESKEY_home" ] && ORACLE_HOME=$OCF_RESKEY_home
-[ -n "$OCF_RESKEY_name" ] && ORACLE_SID=$OCF_RESKEY_name
-[ -n "$OCF_RESKEY_listener_name" ] && ORACLE_LISTENER=$OCF_RESKEY_listener_name
-[ -n "$OCF_RESKEY_lockfile" ] && LOCKFILE=$OCF_RESKEY_lockfile
-[ -n "$OCF_RESKEY_type" ] && ORACLE_TYPE=$OCF_RESKEY_type
-[ -n "$OCF_RESKEY_vhost" ] && ORACLE_HOSTNAME=$OCF_RESKEY_vhost
-
-######################################################
-# Customize these to match your Oracle installation. #
-######################################################
-#
-# 1. Oracle user. Must be the same across all cluster members. In the event
-# that this script is run by the super-user, it will automatically switch
-# to the Oracle user and restart. Oracle needs to run as the Oracle
-# user, not as root.
-#
-#[ -n "$ORACLE_USER" ] || ORACLE_USER=oracle
-
-#
-# 2. Oracle home. This is set up during the installation phase of Oracle.
-# From the perspective of the cluster, this is generally the mount point
-# you intend to use as the mount point for your Oracle Infrastructure
-# service.
-#
-#[ -n "$ORACLE_HOME" ] || ORACLE_HOME=/mnt/oracle/home
-
-#
-# 3. This is your SID. This is set up during oracle installation as well.
-#
-#[ -n "$ORACLE_SID" ] || ORACLE_SID=orcl
-
-#
-# 4. The oracle user probably doesn't have the permission to write to
-# /var/lock/subsys, so use the user's home directory.
-#
-#[ -n "$LOCKFILE" ] || LOCKFILE="/home/$ORACLE_USER/.oracle-ias.lock"
-[ -n "$LOCKFILE" ] || LOCKFILE="$ORACLE_HOME/.oracle-ias.lock"
-#[ -n "$LOCKFILE" ] || LOCKFILE="/var/lock/subsys/oracle-ias" # Watch privileges
-
-#
-# 5. Type of Oracle Database. Currently supported: 10g 10g-iAS(untested!)
-#
-[ -n "$ORACLE_TYPE" ] || ORACLE_TYPE="base-em"
-
-#
-# 6. Oracle virtual hostname. This is the hostname you gave Oracle during
-# installation.
-#
-#[ -n "$ORACLE_HOSTNAME" ] || ORACLE_HOSTNAME=svc0.foo.test.com
-
-
-
-###########################################################################
-ORACLE_TYPE=`echo $ORACLE_TYPE | tr A-Z a-z`
-export ORACLE_USER ORACLE_HOME ORACLE_SID LOCKFILE ORACLE_TYPE
-export ORACLE_HOSTNAME
-
-
-##########################
-# Set up paths we'll use. Not all are used by all the different types of
-# Oracle installations
-#
-export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/opmn/lib
-export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/opmn/bin:$ORACLE_HOME/dcm/bin:$PATH
-
-declare -i RESTART_RETRIES=3
-declare -r DB_PROCNAMES="pmon"
-#declare -r DB_PROCNAMES="pmonXX" # testing
-#declare -r DB_PROCNAMES="pmon smon dbw0 lgwr"
-
-declare -r LSNR_PROCNAME="tnslsnr"
-#declare -r LSNR_PROCNAME="tnslsnrXX" # testing
-
-
-##########################################################
-# (Hopefully) No user-serviceable parts below this line. #
-##########################################################
-meta_data()
-{
- cat <<EOT
-<?xml version="1.0" ?>
-<resource-agent name="oracledb" version="rgmanager 2.0">
- <version>1.0</version>
-
- <longdesc lang="en">
- Oracle 10g Failover Instance
- </longdesc>
- <shortdesc lang="en">
- Oracle 10g Failover Instance
- </shortdesc>
-
- <parameters>
- <parameter name="name" primary="1">
- <longdesc lang="en">
- Instance name (SID) of oracle instance
- </longdesc>
- <shortdesc lang="en">
- Oracle SID
- </shortdesc>
- <content type="string"/>
- </parameter>
-
- <parameter name="listener_name" unique="1">
- <longdesc lang="en">
- Oracle Listener Instance Name. If you have multiple
- instances of Oracle running, it may be necessary to
- have multiple listeners on the same machine with
- different names.
- </longdesc>
- <shortdesc lang="en">
- Oracle Listener Instance Name
- </shortdesc>
- <content type="string"/>
- </parameter>
-
-
- <parameter name="user" required="1">
- <longdesc lang="en">
- Oracle user name. This is the user name of the Oracle
- user which the Oracle AS instance runs as.
- </longdesc>
- <shortdesc lang="en">
- Oracle User Name
- </shortdesc>
- <content type="string"/>
- </parameter>
-
- <parameter name="home" required="1">
- <longdesc lang="en">
- This is the Oracle (application, not user) home directory.
- This is configured when you install Oracle.
- </longdesc>
- <shortdesc lang="en">
- Oracle Home Directory
- </shortdesc>
- <content type="string"/>
- </parameter>
-
- <parameter name="type" required="0">
- <longdesc lang="en">
- This is the Oracle installation type:
- base - Database Instance and Listener only
- base-em (or 10g) - Database, Listener, Enterprise Manager,
- and iSQL*Plus
- ias (or 10g-ias) - Internet Application Server (Infrastructure)
- </longdesc>
- <shortdesc lang="en">
- Oracle Installation Type
- </shortdesc>
- <content type="string"/>
- </parameter>
-
- <parameter name="vhost" required="0" unique="1">
- <longdesc lang="en">
- Virtual Hostname matching the installation hostname of
- Oracle 10g. Note that during the start/stop of an oracledb
- resource, your hostname will temporarily be changed to
- this hostname. As such, it is recommended that oracledb
- resources be instanced as part of an exclusive service only.
- </longdesc>
- <shortdesc lang="en">
- Virtual Hostname
- </shortdesc>
- <content type="string"/>
- </parameter>
-
- </parameters>
-
- <actions>
- <action name="start" timeout="900"/>
- <action name="stop" timeout="90"/>
- <action name="recover" timeout="990"/>
-
- <!-- Checks to see if it's mounted in the right place -->
- <action name="status" timeout="10"/>
- <action name="monitor" timeout="10"/>
-
- <!-- Checks to see if we can read from the mountpoint -->
- <action name="status" depth="10" timeout="30" interval="5m"/>
- <action name="monitor" depth="10" timeout="30" interval="5m"/>
-
- <!-- Checks to see if we can write to the mountpoint (if !ROFS) -->
- <action name="status" depth="20" timeout="90" interval="10m"/>
- <action name="monitor" depth="20" timeout="90" interval="10m"/>
-
- <action name="meta-data" timeout="5"/>
- <action name="validate-all" timeout="5"/>
- </actions>
-
- <special tag="rgmanager">
- <attributes maxinstances="1"/>
- </special>
-</resource-agent>
-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_db()
-{
- declare tmpfile
- declare logfile
- declare -i rv
-
- tmpfile=/tmp/$SCRIPT-start.$$
- logfile=/tmp/$SCRIPT-start.log
-
- #
- # 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
- rv=$?
-
- # Dump logfile to /var/log/messages
- initlog -q -c "cat $logfile"
-
- if [ $rv -ne 0 ]; then
- echo "ORACLE_HOME Incorrectly set?"
- echo "See $logfile for more information."
- return 1
- fi
-
- #
- # If we see:
- # ORA-.....: failure, we failed
- #
-
- rm -f $tmpfile
- grep -q "failure" $logfile
- if [ $? -eq 0 ]; then
- rm -f $tmpfile
- echo "ORACLE_SID Incorrectly set?"
- echo "See $logfile for more information."
- return 1
- fi
-
- return 0
-}
-
-
-#
-# Stop Oracle9i (database portion)
-#
-stop_db()
-{
- declare tmpfile
- declare logfile
- declare -i rv
-
- tmpfile=/tmp/$SCRIPT-stop.$$
- logfile=/tmp/$SCRIPT-stop.log
-
- # Setup for Stop ...
- echo "shutdown abort" > $tmpfile
- echo "quit" >> $tmpfile
-
- sqlplus "/ as sysdba" < $tmpfile &> $logfile
- rv=$?
-
- # Dump logfile to /var/log/messages
- initlog -q -c "cat $logfile"
-
- if [ $rv -ne 0 ]; then
- echo "ORACLE_HOME Incorrectly set?"
- echo "See $logfile for more information."
- return 1
- fi
-
- #
- # If we see 'failure' in the log, we're done.
- #
- rm -f $tmpfile
- grep -q failure $logfile
- if [ $? -eq 0 ]; then
- echo_failure
- echo
- echo "Possible reason: ORACLE_SID Incorrectly set."
- echo "See $logfile for more information."
- return 1
- fi
-
- return 0
-}
-
-
-#
-# Destroy any remaining processes with refs to $ORACLE_HOME
-#
-force_cleanup()
-{
- declare pids
- declare pid
-
- pids=`ps ax | grep $ORACLE_HOME | grep -v grep | awk '{print $1}'`
-
- initlog -n $SCRIPT -s "<err> Not all Oracle processes exited cleanly, killing"
-
- for pid in $pids; do
- kill -9 $pid
- if [ $? -eq 0 ]; then
- initlog -n $SCRIPT -s "Killed $pid"
- fi
- done
-
- return 0
-}
-
-
-
-#
-# Wait for oracle processes to exit. Time out after 60 seconds
-#
-exit_idle()
-{
- declare -i n=0
- while ps ax | grep $ORACLE_HOME | grep -q -v grep; do
- if [ $n -ge 90 ]; then
- force_cleanup
- return 0
- fi
- sleep 1
- ((n++))
- done
- 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
-
- 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...
- # XXX only works when monitoring one db process; consider
- # extending in future.
- #
- if [ $subsys_lock -ne 0 ]; then
- 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..."
- stop_db
- if [ $? != 0 ] ; then
- # stop failed - return 1
- return 1
- fi
-
- start_db
- if [ $? == 0 ] ; then
- # ora_XXXX_$ORACLE_SID processes started
- # successfully, so break out of the
- # stop/start # 'for' loop
- break
- fi
- done
-
- if [ $i -eq 0 ]; then
- # stop/start's failed - return 1 (failure)
- return 1
- fi
- done
- return 0
-}
-
-
-#
-# Get the status of the Oracle listener process
-#
-get_lsnr_status()
-{
- declare -i subsys_lock=$1
- declare -i rv
-
- status $LSNR_PROCNAME
- rv=$?
- if [ $rv == 0 ] ; then
- 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
- 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
- break # Listener was (re)started and is running fine
- fi
- done
-
- if [ $i -eq 0 ]; then
- # stop/start's failed - return 1 (failure)
- return 1
- fi
-
- status $LSNR_PROCNAME
- if [ $? != 0 ] ; then
- return 1 # Problem restarting the Listener
- fi
- return 0 # Success restarting the Listener
-}
-
-
-#
-# usage: get_opmn_proc_status <ias-component> [process-type]
-#
-# Get the status of a specific OPMN-managed process. If process-type
-# is not specified, assume the process-type is the same as the ias-component.
-# If the lock-file exists (or no lock file is specified), try to restart
-# the given process-type if it is not running.
-#
-get_opmn_proc_status()
-{
- declare comp=$1
- declare opmntype=$2
- declare type_pretty
- declare _pid _status
-
- [ -n "$comp" ] || return 1
- if [ -z "$opmntype" ]; then
- opmntype=$comp
- else
- type_pretty=" [$opmntype]"
- fi
-
- for (( i=$RESTART_RETRIES ; i; i-- )) ; do
-
- _status=`opmnctl status | grep "^$comp " | grep " $opmntype " | cut -d '|' -f3,4 | sed -e 's/ //g' -e 's/|/ /g'`
-
- _pid=`echo $_status | cut -f1 -d' '`
- _status=`echo $_status | cut -f2 -d' '`
- if [ "${_status}" == "Alive" ] || [ "${_status}" == "Init" ]; then
- if [ $i -lt $RESTART_RETRIES ] ; then
- echo " $comp$type_pretty restarted"
- fi
- echo " $comp$type_pretty (pid $_pid) is running..."
- break
- else
- echo " $comp$type_pretty is stopped"
-
- #
- # Try to restart it, but don't worry if we fail. OPMN
- # is supposed to handle restarting these anyway.
- #
- # If it's running and you tell OPMN to "start" it,
- # you will get an error.
- #
- # If it's NOT running and you tell OPMN to "restart"
- # it, you will also get an error.
- #
- opmnctl startproc process-type=$opmntype &> /dev/null
- fi
- done
-
- if [ $i -eq 0 ]; then
- # restarts failed - return 1 (failure)
- return 1
- fi
-
- return 0
-}
-
-
-#
-# Get the status of the OPMN-managed processes.
-#
-get_opmn_status()
-{
- declare -i subsys_lock=$1
- declare -i ct_errors=0
-
- opmnctl status &> /dev/null
- if [ $? -eq 2 ]; then
- #
- # OPMN not running??
- #
- echo "opmn is stopped"
-
- if [ $subsys_lock -eq 0 ]; then
- #
- # Don't handle full opmn-restart. XXX
- #
- return 1
- fi
-
- # That's okay, it's not supposed to be!
- return 3
- fi
-
- #
- # Print out the PIDs for everyone.
- #
- echo "opmn is running..."
- echo "opmn components:"
-
- #
- # Check the OPMN-managed processes
- #
- get_opmn_proc_status OID || ((ct_errors++))
- get_opmn_proc_status HTTP_Server || ((ct_errors++))
- get_opmn_proc_status OC4J OC4J_SECURITY || ((ct_errors++))
-
- #
- # One or more OPMN-managed processes failed and could not be
- # restarted.
- #
- if [ $ct_errors -ne 0 ]; then
- return 1
- fi
- return 0
-}
-
-
-#
-# 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
- return 1
- fi
-
- return $old_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."
- exit 1
-}
-
-
-#
-# Do some validation on the user-configurable stuff at the beginning of the
-# script.
-#
-validation_checks()
-{
- #
- # 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"
-
- #
- # If the oracle home isn't a directory, we're done
- #
- [ -n "$ORACLE_HOME" ] || oops ORACLE_HOME
- #[ -d "$ORACLE_HOME" ] || oops ORACLE_HOME
-
- #
- # If the oracle SID is NULL, we're done
- #
- [ -n "$ORACLE_SID" ] || oops ORACLE_SID
-
- #
- # If we don't know the type, we're done
- #
- if [ "$ORACLE_TYPE" = "base" ]; then
- # Other names for base
- ORACLE_TYPE="base"
- elif [ "$ORACLE_TYPE" = "10g" ] || [ "$ORACLE_TYPE" = "base-em" ]; then
- ORACLE_TYPE="base-em"
- elif [ "$ORACLE_TYPE" = "10g-ias" ] || [ "$ORACLE_TYPE" = "ias" ]; then
- ORACLE_TYPE="ias"
- else
- oops ORACLE_TYPE
- fi
-
- #
- # If the hostname is zero-length, fix it
- #
- [ -n "$ORACLE_HOSTNAME" ] || ORACLE_HOSTNAME=`hostname`
-
- #
- # 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
- echo "Restarting $0 as $ORACLE_USER."
- #
- # Breaks on RHEL5
- # exec sudo -u $ORACLE_USER $0 $*
- #
- 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`" ] || exit 1
- [ "`id -g`" = "`id -g $ORACLE_USER`" ] || exit 1
-
- #
- # Go home.
- #
- cd $ORACLE_HOME
-
- return 0
-}
-
-
-#
-# Start Oracle9i Application Server Infrastructure
-#
-start_oracle()
-{
- faction "Starting Oracle Database:" start_db || return 1
- action "Starting Oracle Listener:" lsnrctl start $ORACLE_LISTENER || return 1
-
- 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
- elif [ "$ORACLE_TYPE" = "ias" ]; then
- action "Starting Oracle EM:" emctl start em || return 1
- action "Starting iAS Infrastructure:" opmnctl startall || return 1
- fi
-
- if [ -n "$LOCKFILE" ]; then
- touch $LOCKFILE
- fi
- return 0
-}
-
-
-#
-# Stop Oracle9i Application Server Infrastructure
-#
-stop_oracle()
-{
- if ! [ -e "$ORACLE_HOME/bin/lsnrctl" ]; then
- echo "Oracle Listener Control is not available"
- echo " ($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
- elif [ "$ORACLE_TYPE" = "ias" ]; then
- action "Stopping iAS Infrastructure:" opmnctl stopall || return 1
- action "Stopping Oracle EM:" emctl stop em || return 1
- fi
-
- faction "Stopping Oracle Database:" stop_db || return 1
- action "Stopping Oracle Listener:" lsnrctl stop $ORACLE_LISTENER
- faction "Waiting for all Oracle processes to exit:" exit_idle
-
- if [ $? -ne 0 ]; then
- echo "WARNING: Not all Oracle processes exited cleanly"
- fi
-
- if [ -n "$LOCKFILE" ]; then
- rm -f $LOCKFILE
- fi
- 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
-
- #
- # 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
- get_lsnr_status $subsys_lock $depth
- update_status $? $last
- last=$?
-
- if [ "$ORACLE_TYPE" = "base-em" ]; then
- # XXX Add isqlplus status check?!
- emctl status dbconsole 2>&1 | grep "is running"
- update_status $? $last
- last=$?
- elif [ "$ORACLE_TYPE" = "ias" ]; then
- # Check & report opmn / opmn-managed process status
- get_opmn_status $subsys_lock $depth
- update_status $? $last
- last=$?
- fi
-
- #
- # 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
-
- return $last
-}
-
-
-########################
-# Do some real work... #
-########################
-if [ "$1" = "meta-data" ]; then
- meta_data
- exit 0
-fi
-
-validation_checks $*
-
-case $1 in
- start)
- start_oracle
- exit $?
- ;;
- stop)
- stop_oracle
- exit $?
- ;;
- status|monitor)
- status_oracle $OCF_CHECK_LEVEL
- exit $?
- ;;
- restart)
- $0 stop || exit $?
- $0 start || exit $?
- exit 0
- ;;
- *)
- echo "usage: $SCRIPT {start|stop|status|restart|meta-data}"
- exit 1
- ;;
-esac
-exit 0
diff --git a/rgmanager/src/resources/oracledb.sh.in b/rgmanager/src/resources/oracledb.sh.in
new file mode 100644
index 0000000..4e34e69
--- /dev/null
+++ b/rgmanager/src/resources/oracledb.sh.in
@@ -0,0 +1,888 @@
+#!/bin/bash
+# Author(s):
+# Hardy Merrill <hmerrill at redhat.com>
+# Lon Hohberger <lhh at redhat.com>
+# Michael Moon <Michael dot Moon at oracle.com>
+#
+# 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
+# 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.
+# All other trademarks are property of their respective owners.
+#
+
+. /etc/init.d/functions
+
+#
+# Source stuff from /etc/sysconfig, but this may be overridden if
+# this is being called as a cluster resource agent instead.
+#. /etc/sysconfig/oracledb
+
+declare SCRIPT="`basename $0`"
+declare SCRIPTDIR="`dirname $0`"
+
+[ -n "$OCF_RESKEY_user" ] && ORACLE_USER=$OCF_RESKEY_user
+[ -n "$OCF_RESKEY_home" ] && ORACLE_HOME=$OCF_RESKEY_home
+[ -n "$OCF_RESKEY_name" ] && ORACLE_SID=$OCF_RESKEY_name
+[ -n "$OCF_RESKEY_listener_name" ] && ORACLE_LISTENER=$OCF_RESKEY_listener_name
+[ -n "$OCF_RESKEY_lockfile" ] && LOCKFILE=$OCF_RESKEY_lockfile
+[ -n "$OCF_RESKEY_type" ] && ORACLE_TYPE=$OCF_RESKEY_type
+[ -n "$OCF_RESKEY_vhost" ] && ORACLE_HOSTNAME=$OCF_RESKEY_vhost
+
+######################################################
+# Customize these to match your Oracle installation. #
+######################################################
+#
+# 1. Oracle user. Must be the same across all cluster members. In the event
+# that this script is run by the super-user, it will automatically switch
+# to the Oracle user and restart. Oracle needs to run as the Oracle
+# user, not as root.
+#
+#[ -n "$ORACLE_USER" ] || ORACLE_USER=oracle
+
+#
+# 2. Oracle home. This is set up during the installation phase of Oracle.
+# From the perspective of the cluster, this is generally the mount point
+# you intend to use as the mount point for your Oracle Infrastructure
+# service.
+#
+#[ -n "$ORACLE_HOME" ] || ORACLE_HOME=/mnt/oracle/home
+
+#
+# 3. This is your SID. This is set up during oracle installation as well.
+#
+#[ -n "$ORACLE_SID" ] || ORACLE_SID=orcl
+
+#
+# 4. The oracle user probably doesn't have the permission to write to
+# /var/lock/subsys, so use the user's home directory.
+#
+#[ -n "$LOCKFILE" ] || LOCKFILE="/home/$ORACLE_USER/.oracle-ias.lock"
+[ -n "$LOCKFILE" ] || LOCKFILE="$ORACLE_HOME/.oracle-ias.lock"
+#[ -n "$LOCKFILE" ] || LOCKFILE="/var/lock/subsys/oracle-ias" # Watch privileges
+
+#
+# 5. Type of Oracle Database. Currently supported: 10g 10g-iAS(untested!)
+#
+[ -n "$ORACLE_TYPE" ] || ORACLE_TYPE="base-em"
+
+#
+# 6. Oracle virtual hostname. This is the hostname you gave Oracle during
+# installation.
+#
+#[ -n "$ORACLE_HOSTNAME" ] || ORACLE_HOSTNAME=svc0.foo.test.com
+
+
+
+###########################################################################
+ORACLE_TYPE=`echo $ORACLE_TYPE | tr A-Z a-z`
+export ORACLE_USER ORACLE_HOME ORACLE_SID LOCKFILE ORACLE_TYPE
+export ORACLE_HOSTNAME
+
+
+##########################
+# Set up paths we'll use. Not all are used by all the different types of
+# Oracle installations
+#
+export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/opmn/lib
+export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/opmn/bin:$ORACLE_HOME/dcm/bin:$PATH
+
+declare -i RESTART_RETRIES=3
+declare -r DB_PROCNAMES="pmon"
+#declare -r DB_PROCNAMES="pmonXX" # testing
+#declare -r DB_PROCNAMES="pmon smon dbw0 lgwr"
+
+declare -r LSNR_PROCNAME="tnslsnr"
+#declare -r LSNR_PROCNAME="tnslsnrXX" # testing
+
+
+##########################################################
+# (Hopefully) No user-serviceable parts below this line. #
+##########################################################
+meta_data()
+{
+ cat <<EOT
+<?xml version="1.0" ?>
+<resource-agent name="oracledb" version="rgmanager 2.0">
+ <version>1.0</version>
+
+ <longdesc lang="en">
+ Oracle 10g Failover Instance
+ </longdesc>
+ <shortdesc lang="en">
+ Oracle 10g Failover Instance
+ </shortdesc>
+
+ <parameters>
+ <parameter name="name" primary="1">
+ <longdesc lang="en">
+ Instance name (SID) of oracle instance
+ </longdesc>
+ <shortdesc lang="en">
+ Oracle SID
+ </shortdesc>
+ <content type="string"/>
+ </parameter>
+
+ <parameter name="listener_name" unique="1">
+ <longdesc lang="en">
+ Oracle Listener Instance Name. If you have multiple
+ instances of Oracle running, it may be necessary to
+ have multiple listeners on the same machine with
+ different names.
+ </longdesc>
+ <shortdesc lang="en">
+ Oracle Listener Instance Name
+ </shortdesc>
+ <content type="string"/>
+ </parameter>
+
+
+ <parameter name="user" required="1">
+ <longdesc lang="en">
+ Oracle user name. This is the user name of the Oracle
+ user which the Oracle AS instance runs as.
+ </longdesc>
+ <shortdesc lang="en">
+ Oracle User Name
+ </shortdesc>
+ <content type="string"/>
+ </parameter>
+
+ <parameter name="home" required="1">
+ <longdesc lang="en">
+ This is the Oracle (application, not user) home directory.
+ This is configured when you install Oracle.
+ </longdesc>
+ <shortdesc lang="en">
+ Oracle Home Directory
+ </shortdesc>
+ <content type="string"/>
+ </parameter>
+
+ <parameter name="type" required="0">
+ <longdesc lang="en">
+ This is the Oracle installation type:
+ base - Database Instance and Listener only
+ base-em (or 10g) - Database, Listener, Enterprise Manager,
+ and iSQL*Plus
+ ias (or 10g-ias) - Internet Application Server (Infrastructure)
+ </longdesc>
+ <shortdesc lang="en">
+ Oracle Installation Type
+ </shortdesc>
+ <content type="string"/>
+ </parameter>
+
+ <parameter name="vhost" required="0" unique="1">
+ <longdesc lang="en">
+ Virtual Hostname matching the installation hostname of
+ Oracle 10g. Note that during the start/stop of an oracledb
+ resource, your hostname will temporarily be changed to
+ this hostname. As such, it is recommended that oracledb
+ resources be instanced as part of an exclusive service only.
+ </longdesc>
+ <shortdesc lang="en">
+ Virtual Hostname
+ </shortdesc>
+ <content type="string"/>
+ </parameter>
+
+ </parameters>
+
+ <actions>
+ <action name="start" timeout="900"/>
+ <action name="stop" timeout="90"/>
+ <action name="recover" timeout="990"/>
+
+ <!-- Checks to see if it's mounted in the right place -->
+ <action name="status" timeout="10"/>
+ <action name="monitor" timeout="10"/>
+
+ <!-- Checks to see if we can read from the mountpoint -->
+ <action name="status" depth="10" timeout="30" interval="5m"/>
+ <action name="monitor" depth="10" timeout="30" interval="5m"/>
+
+ <!-- Checks to see if we can write to the mountpoint (if !ROFS) -->
+ <action name="status" depth="20" timeout="90" interval="10m"/>
+ <action name="monitor" depth="20" timeout="90" interval="10m"/>
+
+ <action name="meta-data" timeout="5"/>
+ <action name="validate-all" timeout="5"/>
+ </actions>
+
+ <special tag="rgmanager">
+ <attributes maxinstances="1"/>
+ </special>
+</resource-agent>
+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_db()
+{
+ declare tmpfile
+ declare logfile
+ declare -i rv
+
+ tmpfile=/tmp/$SCRIPT-start.$$
+ logfile=@LOGDIR@/$SCRIPT-start.log
+
+ #
+ # 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
+ rv=$?
+
+ rm -f $tmpfile
+
+ # Dump logfile to /var/log/messages
+ initlog -q -c "cat $logfile"
+
+ if [ $rv -ne 0 ]; then
+ echo "ORACLE_HOME Incorrectly set?"
+ echo "See $logfile for more information."
+ return 1
+ fi
+
+ #
+ # If we see:
+ # ORA-.....: failure, we failed
+ #
+
+ grep -q "failure" $logfile
+ if [ $? -eq 0 ]; then
+ echo "ORACLE_SID Incorrectly set?"
+ echo "See $logfile for more information."
+ return 1
+ fi
+
+ return 0
+}
+
+
+#
+# Stop Oracle9i (database portion)
+#
+stop_db()
+{
+ declare tmpfile
+ declare logfile
+ declare -i rv
+
+ tmpfile=/tmp/$SCRIPT-stop.$$
+ logfile=@LOGDIR@/$SCRIPT-stop.log
+
+ # Setup for Stop ...
+ echo "shutdown abort" > $tmpfile
+ echo "quit" >> $tmpfile
+
+ sqlplus "/ as sysdba" < $tmpfile &> $logfile
+ rv=$?
+
+ rm -f $tmpfile
+
+ # Dump logfile to /var/log/messages
+ initlog -q -c "cat $logfile"
+
+ if [ $rv -ne 0 ]; then
+ echo "ORACLE_HOME Incorrectly set?"
+ echo "See $logfile for more information."
+ return 1
+ fi
+
+ #
+ # If we see 'failure' in the log, we're done.
+ #
+ grep -q failure $logfile
+ if [ $? -eq 0 ]; then
+ echo_failure
+ echo
+ echo "Possible reason: ORACLE_SID Incorrectly set."
+ echo "See $logfile for more information."
+ return 1
+ fi
+
+ return 0
+}
+
+
+#
+# Destroy any remaining processes with refs to $ORACLE_HOME
+#
+force_cleanup()
+{
+ declare pids
+ declare pid
+
+ pids=`ps ax | grep $ORACLE_HOME | grep -v grep | awk '{print $1}'`
+
+ initlog -n $SCRIPT -s "<err> Not all Oracle processes exited cleanly, killing"
+
+ for pid in $pids; do
+ kill -9 $pid
+ if [ $? -eq 0 ]; then
+ initlog -n $SCRIPT -s "Killed $pid"
+ fi
+ done
+
+ return 0
+}
+
+
+
+#
+# Wait for oracle processes to exit. Time out after 60 seconds
+#
+exit_idle()
+{
+ declare -i n=0
+ while ps ax | grep $ORACLE_HOME | grep -q -v grep; do
+ if [ $n -ge 90 ]; then
+ force_cleanup
+ return 0
+ fi
+ sleep 1
+ ((n++))
+ done
+ 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
+
+ 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...
+ # XXX only works when monitoring one db process; consider
+ # extending in future.
+ #
+ if [ $subsys_lock -ne 0 ]; then
+ 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..."
+ stop_db
+ if [ $? != 0 ] ; then
+ # stop failed - return 1
+ return 1
+ fi
+
+ start_db
+ if [ $? == 0 ] ; then
+ # ora_XXXX_$ORACLE_SID processes started
+ # successfully, so break out of the
+ # stop/start # 'for' loop
+ break
+ fi
+ done
+
+ if [ $i -eq 0 ]; then
+ # stop/start's failed - return 1 (failure)
+ return 1
+ fi
+ done
+ return 0
+}
+
+
+#
+# Get the status of the Oracle listener process
+#
+get_lsnr_status()
+{
+ declare -i subsys_lock=$1
+ declare -i rv
+
+ status $LSNR_PROCNAME
+ rv=$?
+ if [ $rv == 0 ] ; then
+ 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
+ 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
+ break # Listener was (re)started and is running fine
+ fi
+ done
+
+ if [ $i -eq 0 ]; then
+ # stop/start's failed - return 1 (failure)
+ return 1
+ fi
+
+ status $LSNR_PROCNAME
+ if [ $? != 0 ] ; then
+ return 1 # Problem restarting the Listener
+ fi
+ return 0 # Success restarting the Listener
+}
+
+
+#
+# usage: get_opmn_proc_status <ias-component> [process-type]
+#
+# Get the status of a specific OPMN-managed process. If process-type
+# is not specified, assume the process-type is the same as the ias-component.
+# If the lock-file exists (or no lock file is specified), try to restart
+# the given process-type if it is not running.
+#
+get_opmn_proc_status()
+{
+ declare comp=$1
+ declare opmntype=$2
+ declare type_pretty
+ declare _pid _status
+
+ [ -n "$comp" ] || return 1
+ if [ -z "$opmntype" ]; then
+ opmntype=$comp
+ else
+ type_pretty=" [$opmntype]"
+ fi
+
+ for (( i=$RESTART_RETRIES ; i; i-- )) ; do
+
+ _status=`opmnctl status | grep "^$comp " | grep " $opmntype " | cut -d '|' -f3,4 | sed -e 's/ //g' -e 's/|/ /g'`
+
+ _pid=`echo $_status | cut -f1 -d' '`
+ _status=`echo $_status | cut -f2 -d' '`
+ if [ "${_status}" == "Alive" ] || [ "${_status}" == "Init" ]; then
+ if [ $i -lt $RESTART_RETRIES ] ; then
+ echo " $comp$type_pretty restarted"
+ fi
+ echo " $comp$type_pretty (pid $_pid) is running..."
+ break
+ else
+ echo " $comp$type_pretty is stopped"
+
+ #
+ # Try to restart it, but don't worry if we fail. OPMN
+ # is supposed to handle restarting these anyway.
+ #
+ # If it's running and you tell OPMN to "start" it,
+ # you will get an error.
+ #
+ # If it's NOT running and you tell OPMN to "restart"
+ # it, you will also get an error.
+ #
+ opmnctl startproc process-type=$opmntype &> /dev/null
+ fi
+ done
+
+ if [ $i -eq 0 ]; then
+ # restarts failed - return 1 (failure)
+ return 1
+ fi
+
+ return 0
+}
+
+
+#
+# Get the status of the OPMN-managed processes.
+#
+get_opmn_status()
+{
+ declare -i subsys_lock=$1
+ declare -i ct_errors=0
+
+ opmnctl status &> /dev/null
+ if [ $? -eq 2 ]; then
+ #
+ # OPMN not running??
+ #
+ echo "opmn is stopped"
+
+ if [ $subsys_lock -eq 0 ]; then
+ #
+ # Don't handle full opmn-restart. XXX
+ #
+ return 1
+ fi
+
+ # That's okay, it's not supposed to be!
+ return 3
+ fi
+
+ #
+ # Print out the PIDs for everyone.
+ #
+ echo "opmn is running..."
+ echo "opmn components:"
+
+ #
+ # Check the OPMN-managed processes
+ #
+ get_opmn_proc_status OID || ((ct_errors++))
+ get_opmn_proc_status HTTP_Server || ((ct_errors++))
+ get_opmn_proc_status OC4J OC4J_SECURITY || ((ct_errors++))
+
+ #
+ # One or more OPMN-managed processes failed and could not be
+ # restarted.
+ #
+ if [ $ct_errors -ne 0 ]; then
+ return 1
+ fi
+ return 0
+}
+
+
+#
+# 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
+ return 1
+ fi
+
+ return $old_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."
+ exit 1
+}
+
+
+#
+# Do some validation on the user-configurable stuff at the beginning of the
+# script.
+#
+validation_checks()
+{
+ #
+ # 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"
+
+ #
+ # If the oracle home isn't a directory, we're done
+ #
+ [ -n "$ORACLE_HOME" ] || oops ORACLE_HOME
+ #[ -d "$ORACLE_HOME" ] || oops ORACLE_HOME
+
+ #
+ # If the oracle SID is NULL, we're done
+ #
+ [ -n "$ORACLE_SID" ] || oops ORACLE_SID
+
+ #
+ # If we don't know the type, we're done
+ #
+ if [ "$ORACLE_TYPE" = "base" ]; then
+ # Other names for base
+ ORACLE_TYPE="base"
+ elif [ "$ORACLE_TYPE" = "10g" ] || [ "$ORACLE_TYPE" = "base-em" ]; then
+ ORACLE_TYPE="base-em"
+ elif [ "$ORACLE_TYPE" = "10g-ias" ] || [ "$ORACLE_TYPE" = "ias" ]; then
+ ORACLE_TYPE="ias"
+ else
+ oops ORACLE_TYPE
+ fi
+
+ #
+ # If the hostname is zero-length, fix it
+ #
+ [ -n "$ORACLE_HOSTNAME" ] || ORACLE_HOSTNAME=`hostname`
+
+ #
+ # 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
+ echo "Restarting $0 as $ORACLE_USER."
+ #
+ # Breaks on RHEL5
+ # exec sudo -u $ORACLE_USER $0 $*
+ #
+ 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`" ] || exit 1
+ [ "`id -g`" = "`id -g $ORACLE_USER`" ] || exit 1
+
+ #
+ # Go home.
+ #
+ cd $ORACLE_HOME
+
+ return 0
+}
+
+
+#
+# Start Oracle9i Application Server Infrastructure
+#
+start_oracle()
+{
+ faction "Starting Oracle Database:" start_db || return 1
+ action "Starting Oracle Listener:" lsnrctl start $ORACLE_LISTENER || return 1
+
+ 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
+ elif [ "$ORACLE_TYPE" = "ias" ]; then
+ action "Starting Oracle EM:" emctl start em || return 1
+ action "Starting iAS Infrastructure:" opmnctl startall || return 1
+ fi
+
+ if [ -n "$LOCKFILE" ]; then
+ touch $LOCKFILE
+ fi
+ return 0
+}
+
+
+#
+# Stop Oracle9i Application Server Infrastructure
+#
+stop_oracle()
+{
+ if ! [ -e "$ORACLE_HOME/bin/lsnrctl" ]; then
+ echo "Oracle Listener Control is not available"
+ echo " ($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
+ elif [ "$ORACLE_TYPE" = "ias" ]; then
+ action "Stopping iAS Infrastructure:" opmnctl stopall || return 1
+ action "Stopping Oracle EM:" emctl stop em || return 1
+ fi
+
+ faction "Stopping Oracle Database:" stop_db || return 1
+ action "Stopping Oracle Listener:" lsnrctl stop $ORACLE_LISTENER
+ faction "Waiting for all Oracle processes to exit:" exit_idle
+
+ if [ $? -ne 0 ]; then
+ echo "WARNING: Not all Oracle processes exited cleanly"
+ fi
+
+ if [ -n "$LOCKFILE" ]; then
+ rm -f $LOCKFILE
+ fi
+ 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
+
+ #
+ # 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
+ get_lsnr_status $subsys_lock $depth
+ update_status $? $last
+ last=$?
+
+ if [ "$ORACLE_TYPE" = "base-em" ]; then
+ # XXX Add isqlplus status check?!
+ emctl status dbconsole 2>&1 | grep "is running"
+ update_status $? $last
+ last=$?
+ elif [ "$ORACLE_TYPE" = "ias" ]; then
+ # Check & report opmn / opmn-managed process status
+ get_opmn_status $subsys_lock $depth
+ update_status $? $last
+ last=$?
+ fi
+
+ #
+ # 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
+
+ return $last
+}
+
+
+########################
+# Do some real work... #
+########################
+if [ "$1" = "meta-data" ]; then
+ meta_data
+ exit 0
+fi
+
+validation_checks $*
+
+case $1 in
+ start)
+ start_oracle
+ exit $?
+ ;;
+ stop)
+ stop_oracle
+ exit $?
+ ;;
+ status|monitor)
+ status_oracle $OCF_CHECK_LEVEL
+ exit $?
+ ;;
+ restart)
+ $0 stop || exit $?
+ $0 start || exit $?
+ exit 0
+ ;;
+ *)
+ echo "usage: $SCRIPT {start|stop|status|restart|meta-data}"
+ exit 1
+ ;;
+esac
+exit 0