#!/bin/ksh
#######################################################################################################
# AUTEUR : NDW d'apres le script de  Mathieu Hanetzopg
# DATE: 16/01/08
# FONCTION: script de purge des archives log en PACK (!!!! ne lancer quen PACK/REC)
# On purge les fichiers d'archive de toutes les bases accessibles
# Le dernier fichier de log_archive_dest_XX n'est pas purgi au cas oy il serait accidi
# Toutes les destinations difinies sont purgies 
# Le fichier de log (un par jour) permet de tracer les operations effectuees. Par difaut on  
# conserve 15jrs 
#
#######################################################################################################
#===============================================================================

# fonction f_exit_base : Sortie du programme
#-------------------------------------------------------------------------------
f_exit_base()
{
  ret=$1
  case ${ret} in
    0)
      ;;
    61)
      echo "$nomProg: Erreur 61 - Terminaison du programme suite \340 la r\351ception d'un signal."
      ;;
    62)
      echo "$nomProg: Erreur 62 - Lors de la v\351rification des arguments"
      echo "\n    Usage : . base.ksh <SID>"
      echo "            . base.ksh (Mode Interactif)"
      ;;
    63)
      echo "$nomProg: Erreur 63 - Le fichier $ORATAB introuvable"
      ;;
    64)
      echo "$nomProg: Erreur 64 - Le fichier $ORAENV introuvable"
      ;;
    65)
      # L'erreur est retourn\351 par le script oraenv
      ;;
    66)
      echo "$nomProg: Erreur 66 - Le fichier ${ORAGEN} introuvable"
      ;;
    67)
      echo "$nomProg: Erreur 67 - Le fichier ${ORASIDLOC} introuvable"
      ;;
    68)
      echo "$nomProg: Erreur 68 - linstance ${INPUT_SID} non define dans oratab"
      ;;
  esac
  unset SID
  return ${ret}
}


initVar ()
{
#set -x
nomProg=$1
nomSrv=$(hostname)
ficTmp=/tmp/$nomProg.tmp
datCpt=$(date +%Y%m%d%H%M)
datJr=$(date +%Y%m%d)
DurRetention=${ORA_DUR_RET_PURGE_ARCH:-15} # nb jours de retention du fichier de log
repLog="/varsoft/oracle/purgArch"
ficLog="${repLog}/${datJr}_${nomProg}.out"

if [ ! -d $repLog ] ; then
	mkdir -p $repLog
fi
echo "\n$datCpt: Debut de purge ($nomSrv)">>$ficLog
# effacement des anciens fichiers de log
find ${repLog} -name "*${nomProg}*" -mtime +${DurRetention} -exec \rm -f {} \;
# compression des anciens fichiers (sauf celui du jour)
find ${repLog} -name "*${nomProg}.out" -mtime +1 -exec gzip -f {} \; 2>/dev/null

#set +x
return 0
}

tstCnxDb()
{
#set -x
	CR=0; CR1=0 ; CR2=0

	#echo tst inst=$instance
	sqlplus "/ as sysdba" <<! >$ficTmp 2>/dev/null
	select count(*) from dba_users;
!
	CR1=$(echo $?) 
	# erreur ORA si CR2 =0 , on met CR2 a 1 si err
	ErrOra=$(grep "ORA-" $ficTmp 2>/dev/null)
	CR2=$(echo $?)
	if [  $CR1 -gt 0 -o $CR2 -eq 0  ] ; then
		echo "${datCpt}: ERR $(basename $0) ${nomSrv}_${instance} $ErrOra" >>$ficLog
		CR=1
	fi

 	#echo CR=$CR cmd=$cmd
#set +x
	return $CR
}

tstSvgEnCours()
{
#set -x
	# backup en cours si client_info de la vue v$session  contient '%id=%' 
	# et enregistrements dans v$backup
	# id=KMIZC1P1_ArchBackuprman@su0851
	bck=$(echo "select '##param ', count(*) from (
             	select status from v\$session where client_info like '%id=%' 
	     	union all
	     	select status from v\$backup where status like 'ACTIVE'
	     		);" | sqlplus -s "/ as sysdba" | awk '/^##param / {print $2}')

	if [ $bck -ne 0 ] ; then
		echo "${datCpt}: Annulation purge sur ${nomSrv}_$instance, Sauvegarde en cours" >>$ficLog
	fi
#set +x
	return $bck
}

# effacement des fichiers pour l'insance 'instance' 
delFicArch_OneDb()
{
#set -x
LogArchFmt=$(echo "select '##param '||name ||' '||value
                   from v\$parameter
                   where NAME ='log_archive_format';" | sqlplus -s "/ as sysdba" | awk '/^##param / {print $3}')
ext=$(echo $LogArchFmt|sed -e s/%./*/g)
	LstLogArchDst=""
	 
	sqlplus "/ as sysdba" <<! |grep '^##param ' >$ficTmp
	select '##param '||name ||' '||value  from v\$parameter where NAME like 'log_archive_dest%' and name not like '%stat%';
!
	
	while read dum1 dum2 LogArchDst
	do
		LstLogArchDst="$LstLogArchDst $LogArchDst"
	done <$ficTmp
	
	for LogArchDst in $(echo $LstLogArchDst)
	do
		# effacement des archives sauf la derniere
		cmd="ls -rt $LogArchDst/$ext"   #!!!!a verifier: extention toujours arc?
		nbArch=$($cmd 2>/dev/null|wc -l)
		if [ $nbArch -gt 1 ] ; then
			nbArch=$(expr $nbArch - 1 )
			echo "${datCpt}: $instance"  >> $ficLog
			echo "${datCpt}: Espace avant purge : "  >> $ficLog
			echo "$(df -k $LogArchDst)"  >> $ficLog
			#echo "$cmd"
			echo "${datCpt}: rm -f $($cmd|head -${nbArch})" >> $ficLog
			\rm -f $($cmd|head -${nbArch}) >> $ficLog
			echo "${datCpt}: Espace apres purge : $(df -k $LogArchDst) , $instance"  >> $ficLog
#set +x
		fi
	done
return 0
}



################## MAIN #######################################################
# Initialisation de la variable ORATAB
initVar $(basename $0)
while [[ ${1#-} != $1 ]]
do
  if [[ $1 != ${1#"-sid:"} ]]  # Instance de la base a traiter
  then
    INPUT_SID=${1#"-sid:"}
  elif [[ $1 != ${1#"-all"} ]]  # format zip
  then
    ALL=y
  elif [[ $1 = -h ]]      # Aide
  then
    HELP=1
  fi
  shift
done

# Affichage de l'aide
# -------------------
if [[ ${HELP} -eq 1 ]]
then
   echo "  Utilisation :"
   echo "     $CMDNAME [options]"
   echo "         Genere un fichier SPPY (StatPack PYthon) utilisant les donnees"
   echo "         de la commande sar et du package Oracle statpack"
   echo "  "
   echo "  Options:"
   echo "       -h                : cet ecran d'information"
   echo "       -sid:<SID>        : SID de la base a traiter (OBLIGATOIRE)"
   echo "       -all              : date de la journee pour laquelle generer le fichier"
   echo "  "
   echo "  Exemples:"
   echo "       $CMDNAME -sid:$ORACLE_SID"
   exit 0
fi
[ -z "${ORATAB}" ] && {
case `uname` in
        SunOS|HP-UX|AIX)
                ORATAB=/var/opt/oracle/oratab ;;
        *)
                ORATAB=/etc/oratab ;;
esac
}
if [[ $ALL = y ]]
then
#initVar $(basename $0)
# Pour chaque base demarree a l'init
for instance in `cat $ORATAB |grep -i ':y'| sed '/^$/d' | grep -v "#" | awk -F: '{print $1}'| grep -v "*"`
do
	#Initialisation des variables d'environnement pour l'instance  instance
	. /product/oracle/admin/etc/base.ksh $instance
        echo Traitement $instance
	# test access BD
	tstCnxDb
	cr=$(echo $?)
	if [ $cr -eq 0 ] ; then 
		tstSvgEnCours
		cr=$(echo $?)
		if [ $cr -eq 0 ] ; then
			#effacement des fichiers si SVG pas en cours
			delFicArch_OneDb
		fi
	fi
	datCpt=$(date +%Y%m%d%H%M)
done
elif [ "X${INPUT_SID}" != "X" ]
then
    cat ${ORATAB}  | grep "^${INPUT_SID}:"  >/dev/null 2>&1
    [ $? -ne 0 ] && {
            ORACLE_SID=$OLDORACLE_SID
            f_exit_base 68
            return 68;
    }
    ORACLE_SID=${INPUT_SID}
#  initVar $(basename $0)
	#Initialisation des variables d'environnement pour l'instance  instance
	. /product/oracle/admin/etc/base.ksh ${INPUT_SID}
	# test access BD
	tstCnxDb
	cr=$(echo $?)
	if [ $cr -eq 0 ] ; then 
		tstSvgEnCours
		cr=$(echo $?)
		if [ $cr -eq 0 ] ; then
			#effacement des fichiers si SVG pas en cours
			delFicArch_OneDb
		fi
	fi
	datCpt=$(date +%Y%m%d%H%M)
fi

echo "$datCpt: Fin de purge">>$ficLog
rm -f $ficTmp
