#!/bin/bash
#
# Run-level Startup script for the Oracle RDBMS
#
# $Id$
#

### BEGIN INIT INFO
# Provides:          oracle-rdbms
# Required-Start:    oracle-listener
# Required-Stop:     $null
# X-Stop-After:      oracle-listener oracle-dbconsole
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start Oracle RDBMS
# Description:       Start all enabled Oracle RDBMS,
#                    configured in /etc/oratab file.
### END INIT INFO

# chkconfig: 345 95 30
# description: Startup/Shutdown Oracle RDBMS
#
# Usage:
#          start | stop | status
#          primary  start [sid] | stop [sid] [mode] | status [sid]
#          standby  start [sid] [mode] | stop [sid] [mode] | status [sid]
#          dg start [sid] | stop [sid] | status [sid]
#

source /lib/lsb/oracle-rdbms-functions

SLOGFILE=/var/log/oracle/oraclelog
ORA_OWNER="oracle"
rc=$ORACLE_OKAY

export ORA_OWNER

echo >> $SLOGFILE
echo "I: $0: `date '+%F %T'`: Run command $* " >> $SLOGFILE

oracle_rdbms_usage() {
    cat << __EOFF__
 Usage: 

   Start/stop database according with system configuration file:

     $0 start [sid | all] 
     $0 stop [sid | all] 
     $0 status [sid | all]
   
   Try to start/stop database as PRIMARY:

     $0 primary start [sid] 
     $0 primary stop [sid] [mode]
     $0 primary status [sid]

   Try to start/stop database as PHISICAL STANDBY:

     $0 standby start [sid] [mode]
     $0 standby stop [sid] [mode]
     $0 standby status [sid]
   
   Try to start/stop database with Oracle DataGuard:

     $0 dg start [sid] 
     $0 dg stop [sid]
     $0 dg status [sid]


 Control Oracle RDBMS instances.

 Arguments:
   start [sid | all]        - Start Oracle RDBMS with sid or all 
                              configured and enabled instances except ASM
   stop  [sid | all] [mode] - Stop Oracle RDBMS with sid or all
                              configured and enabled instances except ASM
                      mode  - transactional | normal | immediate | abort
                              (default is immediate)
                      sid   - ORACLE SID
   status [sid | all]       - Show status for Oracle RDBMS with sid or all
                              configured and enabled instances except ASM

   primary start [sid] | stop [sid] [mode] | status [sid]
      start [sid]        - Start primary Oracle RDBMS with sid or default
      stop  [sid] [mode] - Stop primary Oracle RDBMS with sid or default
                   mode  - transactional | normal | immediate | abort
                           (default is immediate)
                   sid   - ORACLE SID
      status [sid]       - Show status for Oracle RDBMS with sid or default

   standby start [mode] [sid] | stop [sid] [mode] | status [sid]
      start [sid] [mode] - Start standby Oracle RDBMS with sid or default
                   mode  - auto | manual (default - manual)
      stop  [sid] [mode] - Stop standby Oracle RDBMS with sid or default
                   mode  - transactional | normal | immediate | abort"
                           (default is immediate)
                   sid   - ORACLE SID

   dg start [sid] | stop [sid] | status [sid]
      start [sid]        - Start Oracle RDBMS with sid or default
      stop  [sid]        - Stop standby Oracle RDBMS with sid or default
                   sid   - ORACLE SID
__EOFF__
}


# Usage
#  oracle_rdbms requre_role command sid mode
#
oracle_rdbms() {
    local role=$1
    local cmd=$2
    local sid=${3:-"all"}
    local mode=$4
    local cnt=
    local ors=
    local rc=0

    echo "I: === oracle-rdbms $* " >> $SLOGFILE

    sid=`echo $sid | tr [[:upper:]] [[:lower:]]`

    case "$cmd" in
      start)
         if [ "$sid" = "all" ] ; then
            cnt=`oracle_rdbms_sids | wc -l`
            if [ $cnt -gt 0 ] ; then
                oracle_rdbms_sids |  { while read sid ; do
                    [ -z "$sid" ] && continue
                    echo -n "Start RDBMS Oracle $sid: " | tee -a $SLOGFILE
                    oracle_rdbms_dbstart "$sid" "$role" "$mode" >> $SLOGFILE 2>&1
                    case ${PIPESTATUS[0]} in
                        $ORACLE_OKAY ) str="OK" ;;
                        $ORACLE_PASS ) str="PASS" ;;
                        * ) str="Error"; rc=$((10+rc+1)) ;;
                    esac
                    echo " $str" | tee -a $SLOGFILE
               done
               exit $rc
               }
               rc=$?
            else
                echo "No configured RDBMS in $ORATAB to start" | tee -a $SLOGFILE
                rc=$ORACLE_NOSID
            fi
         else
            [ -z "$sid" ] && sid=`oracle_get_default_sid`
            if [ -n "$sid" ] ; then
                echo -n "Start given Oracle RDBMS $sid: " | tee -a $SLOGFILE
                oracle_rdbms_dbstart "$sid" "$role" "$mode" >> $SLOGFILE 2>&1
                case ${PIPESTATUS[0]} in
                    $ORACLE_OKAY ) str="OK" ;;
                    $ORACLE_PASS ) str="PASS" ;;
                    * ) str="Error"; rc=$((10+rc+1)) ;;
                esac
                echo " $str" | tee -a $SLOGFILE
            else
                echo "No default RDBMS in $ORATAB to start" | tee -a $SLOGFILE
                rc=$ORACLE_NOSID
            fi
         fi
      ;;
      stop)
         if [ "$sid" = "all" -o "$sid" = "ALL" ] ; then
            cnt=`oracle_rdbms_sids | wc -l`
            if [ $cnt -gt 0 ] ; then
                oracle_rdbms_sids | { while read sid ; do
                    [ -z "$sid" ] && continue
                    echo -n "Stop Oracle RDBMS $sid: " | tee -a $SLOGFILE
                    oracle_rdbms_dbshut "$sid" "$role" "$mode" >> $SLOGFILE 2>&1
                    case ${PIPESTATUS[0]} in
                        $ORACLE_OKAY ) str="OK" ;;
                        $ORACLE_PASS ) str="PASS" ;;
                        * ) str="Error"; rc=$((10+rc+1)) ;;
                    esac
                    echo " $str" | tee -a $SLOGFILE
                done
                exit $rc
                }
                rc=$?
            else
                echo "No configured RDBMS in $ORATAB to stop" | tee -a $SLOGFILE
                rc=$ORACLE_NOSID
            fi
         else
             [ -z "$sid" ] && sid=`oracle_get_default_sid`
             if [ -n "$sid" ] ; then
                echo -n "Stop given Oracle RDBMS $sid: " | tee -a $SLOGFILE
                oracle_rdbms_dbshut "$sid" "$role" "$mode" >> $SLOGFILE 2>&1
                case ${PIPESTATUS[0]} in
                    $ORACLE_OKAY ) str="OK" ;;
                    $ORACLE_PASS ) str="PASS" ;;
                    * ) str="Error"; rc=$((10+rc+1)) ;;
                esac
                echo " $str" | tee -a $SLOGFILE
            else
                echo "No default RDBMS in $ORATAB to stop" | tee -a $SLOGFILE
                rc=$ORACLE_NOSID
            fi
         fi
      ;;
      status)
         if [ "$sid" = "all" -o "$sid" = "ALL" ] ; then
            cnt=`oracle_rdbms_sids | wc -l`
            if [ $cnt -gt 0 ] ; then
                oracle_rdbms_sids | { while read sid ; do
                    [ -z "$sid" ] && continue
                    echo "Status for Oracle RDBMS $sid: " | tee -a $SLOGFILE
                    oracle_rdbms_dbstatus "$sid" 2>&1 | tee -a $SLOGFILE
                    case ${PIPESTATUS[0]} in
                        $ORACLE_OKAY ) str="Status for Oracle RDBMS $sid: OK" ;;
                        $ORACLE_PASS ) str="Status for Oracle RDBMS $sid: PASS" ;;
                        * ) str="Status for Oracle RDBMS $sid: Error"; rc=$((10+rc+1)) ;;
                    esac
                    echo "Given Oracle RDBMS mode for $sid: `oracle_cfg DATABASE_ROLE $sid`" | tee -a $SLOGFILE
                    echo "$str" | tee -a $SLOGFILE
                done
                exit $rc
                }
                rc=$?
            else
                ors=`oracle_cfg ORACLE_SID; oracle_cfg ORACLE_ASM`
                if [ -n "$ors" ] ; then
                    for sid in $ors ; do
                        echo "Status for Oracle RDBMS $sid: " | tee -a $SLOGFILE
                        oracle_rdbms_dbstatus "$sid" --force 2>&1 | tee -a $SLOGFILE
                        case ${PIPESTATUS[0]} in
                            $ORACLE_OKAY ) str="Status for Oracle RDBMS $sid: OK" ;;
                            $ORACLE_PASS ) str="Status for Oracle RDBMS $sid: PASS" ;;
                            * ) str="Status for Oracle RDBMS $sid: Error"; rc=$((10+rc+1)) ;;
                        esac
                        echo "Given Oracle RDBMS mode for $sid: `oracle_cfg DATABASE_ROLE $sid`" | tee -a $SLOGFILE
                        echo "$str" | tee -a $SLOGFILE
                    done
                else
                    echo "No configured RDBMS in $ORATAB" | tee -a $SLOGFILE
                    rc=$ORACLE_NOSID
                fi
            fi
         else
             [ -z "$sid" ] && sid=`oracle_get_default_sid`
             if [ -n "$sid" ] ; then
                echo "Status for given Oracle RDBMS for $sid: " | tee -a $SLOGFILE
                oracle_rdbms_dbstatus "$sid" 2>&1 | tee -a $SLOGFILE
                case ${PIPESTATUS[0]} in
                    $ORACLE_OKAY ) str="Status for Oracle RDBMS $sid: OK" ;;
                    $ORACLE_PASS ) str="Status for Oracle RDBMS $sid: PASS" ;;
                    * ) str="Status for Oracle RDBMS $sid: Error"; rc=$((10+rc+1)) ;;
                esac
                echo "Given Oracle RDBMS mode for $sid: `oracle_cfg DATABASE_ROLE $sid`" | tee -a $SLOGFILE
                echo "$str" | tee -a $SLOGFILE
            else
                echo "No default RDBMS in $ORATAB" | tee -a $SLOGFILE
                rc=$ORACLE_NOSID
            fi
         fi
      ;;
      *)
        rc=$ORACLE_ERROR
      ;;
    esac

    return $rc
}

case "$1" in
    start|stop|status)
        oracle_rdbms "" "$@"
        ;;
    primary|standby|dg )
        oracle_rdbms "$@"
        ;;
    *)
        oracle_rdbms_usage
        rc=$ORACLE_ERROR
        ;;
esac

echo >> $SLOGFILE

exit $rc

