socle_bash/lib/message.lib

178 lines
9.4 KiB
Plaintext
Executable File

##----------------------------------------------------------------------------
## Script : message.lib
## Module Puppet : gnc-script_core_dtsi
## Auteur : Emmanuel Confrere
## Date : 31-08-2017
## Version : 1.3.5
## Objet : Gestion des message sur la console et dans les divers fichiers de trace
##
## Fonction : fct_message
##
## Detail : Cette fonction remplace l utilisation de "echo".
## Elle permet de gerer les messages a destination des fichiers de traces
## , des fichiers de compte rendu ou de la console.
##
## Sans parametre le message est ecrit sur la console et dans le fichier
## journal du script ${SH_FICLOG}. Le comportement est modifie selon les options
## utilisees.
##
## -cpt : Le message est aussi ecrit dans le fichier de compte-rendu ${SH_FICCPT}
## -hist : Le message est aussi ecrit dans le fichier d historique ${SH_FICTRC}
## Cette option ajoute des information d execution dans le fichier d historique
## notamant le compte qui execute le script sous la forme user/sudo_user
## -debug N : Le message est ecrit uniquement dans le fichier journal ${SH_FICLOG}
## si N est inferrieure ou egal au niveau de debug du Shell. Par defaut
## le niveau debug du shell est 0.
## -nolog : inhibe l ecritutre dans le fichier journal
## -color : Ecrit le message en couleur sur la console.
## Les couleurs disponible sont noir,, rouge, vert, jaune, bleu, rose, cyan,
## gris, orange et blanc
##
## Les variables SH_FIC* sont definies dans le fichiers ${NC_EXPL_CONF}/init.conf
##
# ----------------------------------------------------------------------------
# Mise a jour :
# 1.0.0 10-02-2016 - Emmanuel Confrere - Cre : Reprise du script du socle Oracle
# 1.1.0 10-03-2017 - Emmanuel Confrere - Evo : Optimisation du traitement de l option -debug
# 1.2.0 13-04-2017 - Emmanuel Confrere - Evo : Journalisation du compte d execution dans l historique
# 1.2.1 29-06-2017 - Emmanuel Confrere - Ano : Fonctionnement inattendu sous Bash 3.2.25
# la fonction logname ne renvoi rien ?
# 1.3.0 07-08-2017 - Emmanuel Confrere - Evo : Optimisation performance - Suppression des comparaisons de chaine.
# Correction Anomalie de l option -debug si mode interactif
# 1.3.1 10-08-2017 - Emmanuel Confrere - Ano : En mode interactif, l option debug ne limite pas l affichage
# en fonction du niveau positionnee sur le shell et celui du
# message !
# Correction et optimisation du traitement.
# 1.3.2 21/08/2017 - Emmanuel Confrere - Ano : En mode interactif affiche systematiquement les message debug
# de niveau zero. Meme si SH_NIV_DEBUG n est pas initialise !
# Correction pour que l affichage ne soit effectif que si
# la variable SH_NIV_DEBUG est initialise dans le shell courant.
# 1.3.3 31-08-2017 - Emmanuel Confrere - Ano : Dans le cas d un message contruit avec un tableau de cette facon ${A[@]}
# la libraire considere qu il sagit de plusieur argument et
# tronque le message.
# Pour corriger nous concatenons les messages avec un espace separateur.
# pour eviter la concatenation si cette derniere pose probleme
# presenter le message avec une variable tampon :
# B="${A[@]}"
# fct_message "coucou ${B} ..."
# 1.3.4 31-08-2017 - Emmanuel Confrere - Ano : Introduction d une anomalie !
# Erreur de syntaxe
# 1.3.5 31-08-2017 - Emmanuel Confrere - Ano : Introduction d une autre ano !
# Format de sortie modifier (ajout systematique d un espace)
# 1.3.6 26-11-2017 - Doug Le Tough - Evo : Horodatage des logs au format YYYYMMDD HH:MM:SS
# 1.3.7 12-08-2018 - Doug Le Tough - Evo : L'option -color est prise en compte uniquement dans un terminal
##----------------------------------------------------------------------------
function fct_message
{
local L_TEXT="" # Texte a afficher
local L_TIME_STAMP=`date "+%Y%m%d %H:%M:%S"` # Horodatage a ajouter au texte
local L_INTER=0 # Mode interactif 0->non, 1->oui
local L_EXISTE_REP # Controle l existance des repertoire de socle 0->OK 1->NOK
local L_NB_PARAM=0 # Nb de parametre de la ligne de commande
local L_TMP
local L_TMP2
local L_OPT # Nom des option
local L_OPTION_DBG=0 # Message de debug
local L_OPTION_SID="" # Affichage du SH_SESSION_IDP a l ecran
local L_NIV_DEBUG=0 # Niveau de trace par defaut 0=aucune
local L_OPTION_CPT=0 # Message de compte rendu
local L_OPTION_HIST=0 # Message pour l historique
local L_COULEUR="" # Couleur du texte avec l option -color
local L_OPTION_COULEUR=0
local L_LIST_COULEUR="noir:0;30 rouge:0;31 vert:0;32 jaune:1;33 bleu:1;34 rose:0;35 cyan:0;36 gris:0;37 orange:0;33 blanc:1;37 "
# - Mode interactif ?
[ -z "${SH_SESSION_ID}" ] && L_INTER=1
# - recuperation des parametres en entree
L_TMP=1
L_NB_PARAM=$#
while [ ${L_TMP} -le ${L_NB_PARAM} ]
do
L_OPT="$1"
case "${L_OPT}" in
"-cpt") L_OPTION_CPT=1 ;;
"-nolog") L_OPTION_NOLOG=1 ;;
"-hist") L_OPTION_HIST=1 ;;
"-color") L_OPTION_COULEUR=1
L_ARG=`echo $2|tr A-Z a-z`
L_TMP2=${L_ARG:0:1}
if [ "${L_TMP2}" != "-" ]
then
# on recherche la correspondance numerique de la couleur
L_COULEUR=`echo ${L_LIST_COULEUR}|sed "s/.*${L_ARG}:\([0-1];3[0-7]\) .*/\1/"`
# Si on ne la trouve pas on annule la colorisation
[ ${#L_COULEUR} -ne 4 ] && L_OPTION_COULEUR=0
L_TMP=$(( ${L_TMP} + 1 ))
shift
fi
if [ ${TERM} == 'dumb' ] || [ ${TERM} == 'unknown' ] || [ ${#TERM} -eq 0 ]; then
# Affiche les couleurs uniquement dans un terminal
L_OPTION_COULEUR=0
fi;;
"-debug") L_OPTION_DBG=1
L_ARG="$2"
L_TMP2=${L_ARG:0:1}
if [ "${L_TMP2}" != "-" ]
then
L_ARG=`echo $2|sed 's/[0-9]//g'`
if [ -n "${L_ARG}" ]
then
L_TEXT="$2"
L_NIV_DEBUG=1
else
L_NIV_DEBUG=$2
fi
L_TMP=$(( ${L_TMP} + 1 ))
shift
else
L_NIV_DEBUG=1
fi
[ ${L_NIV_DEBUG} -gt 0${SH_NIV_DEBUG} -o -z "${SH_NIV_DEBUG}" ] && return 0 ;;
*) [ -z "${L_TEXT}" ] && L_TEXT="${L_OPT}" || L_TEXT="${L_TEXT} ${L_OPT}" ;;
esac
L_TMP=$(( ${L_TMP} + 1 ))
shift
done
# - Controle du mode d execution ...
if (( ${L_INTER} ))
then
# -- La fonction est executer en mode interactif (Pas dans un script du socle)
# -- on autorise alors uniquement l affichage sur la sortie standard
L_EXISTE_REP=0
else
# - Mode shell...
# - On control l'existance des repertoires
[ -d ${NC_EXPL_HST} -a -d ${NC_EXPL_LOG} -a -d ${NC_EXPL_CPT} ] && L_EXISTE_REP=1 || L_EXISTE_REP=0
fi
# - initialisation des variables
[ "${SH_AFF_SID}" = "oui" ] && L_OPTION_SID="[${SH_SESSION_IDP}] "
L_OPTION_NOLOG=${L_OPTION_NOLOG:=0}
# - Ecriture des messages
# - Ajout d une indentation si elle est definie
[ -n "${SH_INDENT_MSG}" ] && L_TEXT="${SH_INDENT_MSG} ${L_TEXT}"
if (( ${L_OPTION_DBG} ))
then
(( ${L_EXISTE_REP} & ! ${L_INTER} )) && echo "${L_TIME_STAMP} [${SH_SESSION_IDP}] : <Debug_${L_NIV_DEBUG}> ${L_TEXT}" >> ${SH_FICLOG}
(( ${L_INTER} )) && echo "<Debug_${L_NIV_DEBUG}> ${L_TEXT}"
else
(( ${L_EXISTE_REP} & ${L_OPTION_CPT} & ! ${L_OPTION_HIST} )) && echo "${L_TIME_STAMP} : ${L_TEXT}" >> ${SH_FICCPT}
(( ${L_EXISTE_REP} & ! ${L_OPTION_CPT} & ${L_OPTION_HIST} )) && echo "${L_TIME_STAMP} : ${SH_LOGUSER} : ${SH_EXECUSER} : ${L_TEXT}" >> ${SH_FICTRC}
if (( ! ${L_OPTION_NOLOG} ))
then
(( ! ${L_INTER} & ${L_EXISTE_REP} & ! ${L_OPTION_CPT} & ! ${L_OPTION_HIST} )) && echo "${L_TIME_STAMP} [${SH_SESSION_IDP}] : ${L_TEXT}" >> ${SH_FICLOG}
(( ! ${L_INTER} & ${L_EXISTE_REP} & ${L_OPTION_CPT} & ${L_OPTION_HIST} )) && echo "${L_TIME_STAMP} : <lib:fct_message> : Option -cpt et -hist ! - ${L_TEXT}" >> ${SH_FICLOG}
fi
if [ \( "${SH_SILENCE}" = "non" -a "${L_OPTION_HIST}" = 0 \) -o ${L_INTER} -eq 1 ]
then
(( ${L_OPTION_COULEUR} )) && echo -e "${L_OPTION_SID}\033[${L_COULEUR}m${L_TEXT}\033[0m" || echo -e "${L_OPTION_SID}${L_TEXT}"
fi
fi
return 0
}
typeset -Ffx fct_message