#!/bin/ksh
# --------------------------------------------------------------------------
#
# AUTEUR : Nathalie Dieudonne
# ENTITE : DT/AIT/EIU - Norme Oracle CEGETEL
# DATE   : 28/03/2002
# VERSION : 2.0
# OBJET   :
#       demarrage / arret de l'agent intelligent oracle 7 a 9
# 	le listener de la version oracle la plus recente est utilise
#
# MCH161002 : La recherche de la version recente est independante de 
#	la ligne qui contient * dans /var/opt/oratab.
#	Donc, on n'a pas besoin de base.ksh dans les scripts 
#	concernant le listener et oracle intelligent
# TGharbi/ND 26/02/04: ajout des fonctions killer_xx, arret_xx relancer_xxx
#  attente_xxx
#  lancement de l'agent en background + attente et kill si blocage
#        
# Entree : [start ou stop]
# si pas d'argument: 2 essais stop+start
# --------------------------------------------------------------------------

tstArg ()
{
	if [ \( $# -eq 1 -a \( "$1" = "start" -o "$1" = "stop" \) \) -o $# -eq 0 ] ; then
		return 0
		else
                printf "Usage: %s [start| stop]\n" $NomProg
		exit 61
	fi
}
relancer_les_dbsnmp()
{
       $cmdstart  &
       mypid=$!
       attend_process $mypid 60
       exited=$?
       if [ $exited -eq 0 ]
       then
               kill -9 $mypid
               echo "Kill du dbsnmp $mypid"
		cr=62	
       else
	      echo "Veuillez patienter, test persistance agent..."
	      sleep 60 #attente dans le cas ou dbsnmp tombe
              $cmdstat | grep -v "^NMS-"|grep "$msgstat" > /dev/null
		cr=$?
       fi
return $cr
}  
arret_dbsnmp()
{
    $cmdstop &
    mypid=$!
    attend_process $mypid 30
    exited=$?
    if [ $exited -eq 0 ]
    then
        kill -9 $mypid
    fi
    ps -ef | egrep "dbsnmp$|dbsnmpwd$" | grep -v "grep" > /dev/null
    if [ $? -eq 0 ]
    then
           killer_les_dbsnmp
    fi
	
cr=0
}

# code retour : 0 : le process tourne toujours.
#               1 : le process est termine
attend_process()
{
    mypid=$1
    total_time=$2

    tempo=5
    time_wait=0

    ps -p $mypid > /dev/null
    exited=$?

    while [ $time_wait -lt $total_time -a $exited -eq 0 ]
    do
        time_wait=$(expr $time_wait + $tempo)
        sleep $tempo

        ps -p $mypid > /dev/null
        exited=$?
    done
    return $exited
}         

StartStopOracle_IA () 
{
unset NLS_LANG #pour avoir l'affichage des commandes en anglais uniquement
		# quel que soit l'environnement

export ORACLE_HOME=${LAST_OPATH}
export PATH=${ORACLE_HOME}/bin:${PATH}
export LD_LIBRARY_PATH=${ORACLE_HOME}/lib
export TNS_ADMIN=/var/opt/oracle
ORA_VERSION=$(basename ${ORACLE_HOME})

cr=0
case $1 in
        start)
	echo "Demarrage Agent Oracle Intelligent (version ${ORA_VERSION}) demandee ..."
	    case $ORA_VERSION in
	      7*|8*)
		cmdstart="lsnrctl dbsnmp_start"
		cmdstat="lsnrctl dbsnmp_status"
		msgstat="is already running"
		relancer_les_dbsnmp	
		cr=$?
		;;
	      *) # ora9i
		cmdstart="agentctl start"
		cmdstat="agentctl status"
		msgstat="is running"
		relancer_les_dbsnmp

		cr=$?
		;;
	    esac
        ;;
        stop)
	echo "Arret Agent Oracle Intelligent (version ${ORA_VERSION}) demandee ..."
	    case $ORA_VERSION in
	      7*|8*)
		cmdstop="lsnrctl dbsnmp_stop"
        	;;
	      *) # oracle 9i
		cmdstop="agentctl stop" 
		;;
	     esac
	     arret_dbsnmp
        ;;
	*)
		echo "Cas non prevu"
		cr=61
	;;
esac
if [ $cr -eq 0 ] 
then
	echo "$NomProg: $1 de l'agent oracle intelligent sur $HOST : ok"
	return 0
else
	echo "$NomProg: $1 de l'agent oracle intelligent sur $HOST: ko"
	return 62
fi

}

getLastVersion ()
{
cr=0
LAST_OPATH=$( $AWK -F':' '/^ *[^#][^:]*:/{
   if (match($2,"[^/]*$")!=0) {
   spath=substr($2,RSTART,RLENGTH);
   if (spath>oldspath) {
      oldspath=spath;
      oldpath=$2;
   }
   }
  }END{
   print oldpath;
  }' ${ORATAB} )

if [ "1${LAST_OPATH}" = "1" ]
then
	cr=115
	echo "ERREUR : $NomProg : Probleme pour trouver la version la plus recente pour Oracle Intelligent"
	return $cr
fi

if [ ! -d "${LAST_OPATH}" ]
then
	cr=116
	echo "ERREUR : $NomProg : Votre fichier oratab reference une version inexistante : ${LAST_OPATH} "
	return $cr
fi

return $cr
}
killer_les_dbsnmp()
{
    kill -9 $(ps -ef |grep oracle| egrep "dbsnmp$|dbsnmpwd$" | grep -v grep | awk '{print $2}') >/dev/null
   cr=$?
return $cr
}
        

## ------------------------ MAIN  ----------------------------------------
NomProg=$(basename $0)
HOST=$(hostname)

tstArg $*
Args="$*"
NbArgs=$#

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

if [ ! -f "$ORATAB" ]
then
   ORATAB=/var/opt/oracle/oratab
   if [ ! -f "$ORATAB" ]; then
   	ORATAB=/etc/oratab
   	if [ ! -f "$ORATAB" ]; then
	echo "$NomProg : fichier oratab non trouve. Agent dbsnmp non lance"
	exit 61
	fi
   fi
fi

# recuperation de la version la plus recente d'oracle
getLastVersion
cr=$?

if [ $cr -eq 0 ]
then
   if [ $NbArgs -eq 1 ] ; then
	# lancement ou arret de l'agent intelligent selon la version
	StartStopOracle_IA $Args
	cr=$?
   else
	# reinit agent intelligent
	# essai au moins 2 demarrages
	i=1; cr=62; while [ $i -lt 3 -a $cr -ne 0 ]
        do
	StartStopOracle_IA stop 
	cr=$?
	
        	StartStopOracle_IA start
        	cr=$? ; i=$(expr $i + 1)
        done
   fi
fi

return $cr 
