#!/bin/ksh
# --------------------------------------------------------------------------
# AUTEUR : Nathalie Dieudonne / Mahen CHUTTARSING
# ENTITE : DT/AIT/EIU - Norme Oracle CEGETEL
# DATE   : 20/06/2002
# VERSION : 1.4
# PREREQUIS : lancer ce script avec l'utilisateur oracle
# OBJET   :
#       DEMMARAGE ou ARRET d'une base ORACLE  oracle versions 7,8 et 9
# ARGUMENTS ;
#  1) ACTION :  start -> pour demarrer une base ou  stop -> pour arreter une base 
#  2) SID    :  le SID de la base a traiter 
# --------------------------------------------------------------------------
# 		Liste de mise jour
# --------------------------------------------------------------------------
# AUTEUR   DATE explications
# -------  ---- ------------------------------------------------------------
# Mahen.Chuttarsing 
#  1) ajout de verif si la base est deja demarree lors de son demarrage
#  2) ajout de verif si la base est deja arretee lors de son arretee
#  3) ajout de l'utilisation du script base.ksh
#  4) ajout de test d'existence de la base a traiter dans le fichier $ORATAB
#  5) ajout du prise en compte du champ Y/N du fichier $ORATAB
# --------------------------------------------------------------------------
# ND/MB 190204: remplacement $version par $ORA_VERSION
# verification des arguments
# ND 190804: v1.3
# 1) ajout des modifications pour le demarrage/arret via srm
#  -> parametrer le variables SRMxxx dans SID.cfg pour la prise en compte de srm
# ND 140904: v1.3  remplacement test "smon_${vsid}" par "smon_${vsid}$"
# ND 101204: v1.4 oter les blancs avant le grep "smon_${vsid}$", car sur AIX
# il y a un espace apres smon_${vsid} 


tstArg ()
{
	if [ $# -ne 2 ] || [ "1$1" != "1start" -a "1$1" != "1stop" ]
	then
	echo "\n$NomProg: ERREUR : sur le nombre ou valeurs des parametres\n"
        printf "\n\tUsage: %s start| stop ORACLE_SID\n" $NomProg
	echo   "\nATTENTION: le SID de la base a arreter est obligatoire"
	exit 90 
	fi
}

IsOracleStarted() {
vsid=$1
        (ps -ef |sed 's/ *$//'|grep "smon_${vsid}$" |grep -v grep) >/dev/null
        return $?
}

# demarrage de la base fournie en entree
StartStopOracle_OneDb () 
{
cr1=0
StopStart="$1"
sid=$2

unset SRMCMD_BD SRMERR_BD
. ${BASEORA} ${sid}

#
# ---  Verifier que la base a demarrer/arreter est definie dans $ORATAB
# ---  Verifier que la base Y est positionnee sinon erreur 
# ---  Ce qui permet d'inhiber le stop/start de la base sous AUTOSYS
# ---  dans les cas de probleme en cours sur la base et que tout est en manuelle
#

	TMP_CHAINE=`grep "^${sid}:" ${ORATAB}`

	if [ "X${TMP_CHAINE}" = "X" ]
	then
	echo "$NomProg: ERREUR : la base $sid n'est pas definie dans le fichier /var/opt/oracle/oratab"
	echo "$NomProg: ERREUR : Contacter le DBA"
	return 61 
	fi

	ATRAITER=$(echo ${TMP_CHAINE}|cut -d':' -f 3,3)

	if [ "${ATRAITER}" = "N" ]
	then
	echo "$NomProg: ERREUR : la base $sid est declaree en N pour demarrage / arret automatique"
	echo "$NomProg: ERREUR : par precaution je ne peux pas demarrer cette base"
	echo "$NomProg: ERREUR : positionnez Y dans ${ORATAB} puis relancer ce script"
	echo "$NomProg: ERREUR : Contacter le DBA"
	return 61
	fi
	
#
# --- controler que la base a starter n'est pas deja started
# --- controler que la base a stoppee n'est pas deja stoppee
#
 
	IsOracleStarted ${sid}
	rc=$?

	if [ $rc -eq 0 ] &&  [ "1$StopStart" = "1start" ]
	then
        echo "La Base $ORACLE_SID : est deja DEMARREE : OK"
	return 10		
	fi

	if [ $rc -eq 1 ] &&  [ "1$StopStart" = "1stop" ]
	then
        echo "La Base $ORACLE_SID : est deja ARRETEE : OK"
	return 10		
	fi

	if  [ "1$StopStart" = "1stop" ] ;then
		cmd="shutdown immediate "
	else
		cmd="startup " #on suppose init.ora ds $ORACLE_HOME/dbs
	fi
	errPattern="ORA-[0-9]|SP2-[0-9]"
	# test srm
	if [ "1${SRMCMD_BD}" != "1" ]; then
		if [ "1$SRMERR_BD" != "1" ] ; then
		errPattern="$errPattern|${SRMERR_BD}"
		fi
	fi
#
# --- Arreter /demarrer la base avec la commande appropriee suivant la version
#
	case ${ORA_VERSION} in
	7*|8.0*) 
		echo "Base $ORACLE_SID : $cmd  ..."
		if [ "1${SRMCMD_BD}" != "1" ] ; then
			echo "Utilisation de la commande d'encapsulation: ${SRMCMD_BD} ..."
			msgErr=$($(echo ${SRMCMD_BD}) " svrmgrl <<!
			connect internal ;
			$cmd ;
!
" 2>&1 |egrep "$errPattern")
		else
			msgErr=$(svrmgrl <<! |awk '/ORA\-[0-9]+/ {print $0}'
			connect internal ;
			$cmd ;
!
)
		fi
		;;
	*) # versions 8, 9 ... 
		echo "$cmd de la base $ORACLE_SID : en cours..."
		if [ "1${SRMCMD_BD}" != "1" ] ; then
			echo "Utilisation de la commande d'encapsulation: ${SRMCMD_BD} ..."
			msgErr=$($(echo ${SRMCMD_BD}) " sqlplus '/ as sysdba' <<!
				$cmd ;
!
" 2>&1 |egrep "$errPattern")
		else
			msgErr=$(sqlplus '/ as sysdba' <<!|egrep "$errPattern"
				$cmd ;
!
)
		fi
	;;
	esac
	if [ "1$msgErr" != "1" ]; then
		echo "$NomProg: ERREUR lors du $cmd de la base $ORACLE_SID"
		echo "Err= $msgErr"
		cr1=100
	else
		echo "$cmd de la base $ORACLE_SID terminee : OK"
		cr1=0
	fi
return $cr1
}

## ------------------------ MAIN  ----------------------------------------

NomProg=$(basename $0)
cr=0

case $(uname -s) in
        SunOS) AWK=nawk ;;
        *) AWK=awk ;;
esac


Args="$*"

tstArg $Args

if [ "X${ORATAB}" = "X" ]
then
	  echo "ERREUR : $NomProg : La variable $ORATAB non initialisee dans votre environnement" 
	  echo "ERREUR : $NomProg : La variable $ORATAB doit contenir /var/opt/oracle/oratab" 
	  echo "ERREUR : $NomProg : ne peut pas faire son travail" 
	  echo "Contacter un DBA Oracle"
	  exit 110  
fi

if [ ! -f "${ORATAB}" ]
then
	  echo "ERREUR : $NomProg : Le fichier $ORATAB est absent sur la machine" 
	  echo "ERREUR : $NomProg : ne peut pas faire son travail" 
	  echo "Contacter un DBA Oracle"
	  exit 120 
fi

# lancement ou arret des bases

StartStopOracle_OneDb $StopStart $Args
cr=$?

return $cr 
