#!/bin/ksh
# --------------------------------------------------------------------------
# AUTEUR : Nathalie Dieudonne
# ENTITE : DT/AIT/EIU - Norme Oracle CEGETEL
# DATE   : 28/03/2002
# VERSION : 1.1
# PREREQUIS : lancer ce script avec l'utilisateur oracle
# OBJET   :
#  si listener non precise : 
#       demarrage/ arret de tous les listener dans listener.ora avec la derniere
#	version d'oracle
#  si listener precise : 
#       demarrage/ arret des listener saisis dans listener.ora avec la derniere
#	version d'oracle
# 	le listener de la version oracle la plus recente est utilise
# Entree : start ou stop [nom_du_listener]
# --------------------------------------------------------------------------
# ND 190804: v1.1
# 1) ajout des modifications pour le demarrage/arret via srm
#  -> parametrer le variables SRMxxx dans SID.cfg pour la prise en compte de srm

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 <nom_du_listener>\n" $NomProg
        echo   "\nATTENTION: le <nom_du_listener> a arreter est obligatoire"
        exit 100 
        fi
}

IsListenerStarted() 
{
VLSN=$1
	${ORACLE_HOME}/bin/lsnrctl status ${VLSN} > /dev/null 2>&1
	return $?
}

IsListenerValid()
{
VLSN=$1
FIC_LSN=${TNS_ADMIN}/listener.ora

LST_LSN_REF=`awk -F"=" '/^ *[Ss][Ii][Dd]_[Ll][Ii][Ss][Tt]_/ { print ":"substr($1,10)":"}' ${FIC_LSN}|sed -e 's/ //g'`

echo ${LST_LSN_REF}| grep ":${VLSN}:" > /dev/null
rc=$?
return $rc
}

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 le(s) nom(s) de listener"
fi
return $cr
}

StartStopOracle_Lsn () 
{
StopStart=$1
VLSN=$2

cr=0
export ORACLE_HOME=${LAST_OPATH} 
export PATH=${ORACLE_HOME}/bin:${PATH} 
export LD_LIBRARY_PATH=${ORACLE_HOME}/lib
export TNS_ADMIN=/var/opt/oracle


	IsListenerValid ${VLSN}
	cr=$?

        if [ $cr -ne 0 ]
        then
        echo "ERREUR :Le listener ${VLSN} est inconnu sur la machine `hostname`"
        return 80 
        fi

 	IsListenerStarted ${VLSN}
        cr=$?
        if [ $cr -eq 0 ] &&  [ "1$StopStart" = "1start" ]
        then
        echo "Warning: Le listener ${VLSN} : est deja DEMARREE : OK"
        return 10 
        fi

        if [ $cr -eq 1 ] &&  [ "1$StopStart" = "1stop" ]
        then
        echo "Warning: Le listener ${VLSN} : est deja ARRETE : OK"
        return 10 
	fi
      
	ORACLE_SID=$(echo ${LSN_TRT}|cut -d'_' -f2) 
	ficCfg=${ORA_ETC}/${ORACLE_SID}.cfg
	errPattern="ORA-[0-9]|TNS-[0-9]|NL-[0-9]"
	unset SRMCMD_LSN SRMERR_LSN
	if [ -f $ficCfg ] ; then
		. $ficCfg 2>&1 >/dev/null
		if [ "1$SRMERR_LSN" != "1" ] ; then
                	errPattern="$errPattern|${SRMERR_LSN}"
                fi

	fi
	if [ "1$SRMCMD_LSN" != "1" ] ; then
		echo "Utilisation de la commande d'encapsulation: ${SRMCMD_LSN} ..."
		msgErr=$($(echo ${SRMCMD_LSN}) " ${ORACLE_HOME}/bin/lsnrctl ${StopStart} ${VLSN}" 2>&1 |egrep "$errPattern")
	else
		msgErr=$(${ORACLE_HOME}/bin/lsnrctl ${StopStart} ${VLSN}|egrep "$errPattern")
	fi

	if [ "1$msgErr" != "1" ]; then
		echo "ERREUR: $NomProg : Pb sur ${StopStart} du listener ${VLSN}"
		echo "ERREUR: $NomProg : Voir le fichier log d'autosys pour plus de details"
		echo "ERREUR:"
		echo "$msgErr"
		cr=1
	else
		echo "${StopStart} du listener ${VLSN} OK"
		cr=0
	fi

return $cr
}

# ------------------------ MAIN  ----------------------------------------
NomProg=$(basename $0)
cr=0

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



Args="$*"
tstArg $Args

ACTION=$1
LSN_TRT=$2

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

# si listener non saisi en entree
# recuperation de la liste des listeners dans listener.ora format -> :<nom_listener>:
#LST_LSN_REF=${LST_LSN:-$(awk -F"=" '/^ *[Ss][Ii][Dd]_[Ll][Ii][Ss][Tt]_/ {print substr($1,10)}' ${FIC_LSN})}


# recuperation de la version la plus recente d'oracle
getLastVersion


# lancement ou arret du listener
StartStopOracle_Lsn ${ACTION} ${LSN_TRT}
cr=$?

return $cr 

