initial commit

This commit is contained in:
2017-07-21 09:44:49 +02:00
commit 103f54f895
18 changed files with 2950 additions and 0 deletions

169
lib/affiche-ligne.lib Executable file
View File

@@ -0,0 +1,169 @@
##----------------------------------------------------------------------------
## Script : affiche_ligne.lib
## Module Puppet : gnc-script_core_dtsi
## Auteur : Emmanuel Confrere
## Date : 13-04-2017
## Version : 1.1.0
## Objet : Permet d'afficher sur la sortie standard un texte sous forme de tableau
##
## Fonction : fct_affiche_ligne
##
## Detail : Definition de l'entete du tableau :
## fct_affiche_ligne entete "{Titre}" "{Colonne_1},{Taille_1}" "{Colonne_2},{Taille_2}" "{Colonne_3},{Taille_3}" "{Colonne_4},{Taille_4}" ...
## fct_affiche_ligne entete "{Titre}" "Groupe1({Colonne_1},{Taille_1}:{Colonne_2},{Taille_2})" "{Colonne_3},{Taille_3}" "Groupe2({Colonne_4},{Taille_4}:...)" ...
##
## Affichage des lignes du tableau :
## fct_affiche_ligne "${Variable_1}" "${Variable_2}" "${Variable_3}" "${Variable_4}" ...
##
## Affichage du pied
## fct_affiche_ligne pied
##
## Affichage d une ligne de separation
## fct_affiche_ligne sep
##
## Les trois forme de declaration doivent apparaitre dans l ordre :
## fct_affiche_ligne entete -> Initialise le tableau
## fct_affiche_ligne -> Affiche une ligne
## fct_affiche_ligne pied -> Libere la configuration du tableau
##
# ----------------------------------------------------------------------------
# Mise a jour :
# 1.0.0 10-02-2016 - Emmanuel Confrere - Cre : Reprise du script du socle Oracle
# 1.1.0 13-04-2017 - Emmanuel Confrere - Evo : Ajout de l option "sep"
##----------------------------------------------------------------------------
function fct_affiche_ligne
{
local L_NB_PARAM=$#
local L_PARAM=""
local L_IDX_PARAM=1
local L_IDX_COL=1
local L_MESSAGE=""
local L_ENTETE="non"
local L_PIED="non"
local L_SEP="non"
local L_GROUPE="non"
local L_GRP_NOM=""
local L_TAILLE_GRP=0
local L_COL_LISTE=""
local L_COL=""
local L_GRP_MESS_L1=""
local L_GRP_MESS_L2=""
local L_GRP_MESS_L3=""
local L_OLD_IFS=""
# - recuperation des parametres en entree
[ -n "${IFS}" ] && L_OLD_IFS=${IFS}
IFS="@"
while [ ${L_IDX_PARAM} -le ${L_NB_PARAM} ]
do
L_PARAM[${L_IDX_PARAM}]=`echo $1|cut -d, -f1`
[ "${L_PARAM[1]}" = "entete" ] && L_ENTETE="oui"
[ "${L_PARAM[1]}" = "pied" ] && L_PIED="oui"
[ "${L_PARAM[1]}" = "sep" ] && L_SEP="oui"
if [ "${L_ENTETE}" = "oui" -a ${L_IDX_PARAM} -gt 2 ]
then
if [ `echo $1|grep -c "("` -eq 1 ]
then
L_GROUPE="oui"
L_TAILLE_GRP=0
L_GRP_NOM=`echo $1|cut -d "(" -f1`
L_COL_LISTE=`echo $1|sed 's/:/@/g;s/^.*(//;s/)//'`
for L_COL in ${L_COL_LISTE}
do
L_PARAM[${L_IDX_PARAM}]=`echo ${L_COL}|cut -d, -f1`
SH_TAILLE_COL[${L_IDX_COL}]=`echo ${L_COL}|cut -d, -f2`
[ -z "${SH_TAILLE_COL[${L_IDX_COL}]}" ] && SH_TAILLE_COL[${L_IDX_COL}]=${#L_PARAM[${L_IDX_PARAM}]}
[ ${SH_TAILLE_COL[${L_IDX_COL}]} -eq 0 ] && SH_TAILLE_COL[${L_IDX_COL}]=${#L_PARAM[${L_IDX_PARAM}]}
SH_TAILLE_COL[${L_IDX_COL}]=$(( ${SH_TAILLE_COL[${L_IDX_COL}]} + 2 ))
SH_TAILLE_TABLEAU=$(( ${SH_TAILLE_TABLEAU} + ${SH_TAILLE_COL[${L_IDX_COL}]} ))
L_TAILLE_GRP=$(( ${L_TAILLE_GRP} + ${SH_TAILLE_COL[${L_IDX_COL}]} + 1 ))
[ ${L_IDX_PARAM} -eq ${L_NB_PARAM} ] && L_GRP_MESS_L3="${L_GRP_MESS_L3}`fct_format "${L_PARAM[${L_IDX_PARAM}]}" ${SH_TAILLE_COL[${L_IDX_COL}]} c`"
[ ${L_IDX_PARAM} -ne ${L_NB_PARAM} ] && L_GRP_MESS_L3="${L_GRP_MESS_L3}`fct_format "${L_PARAM[${L_IDX_PARAM}]}" ${SH_TAILLE_COL[${L_IDX_COL}]} c`|"
((L_IDX_COL++))
((L_IDX_PARAM++))
((L_NB_PARAM++))
done
((L_TAILLE_GRP--))
((L_IDX_PARAM--))
((L_NB_PARAM--))
L_GRP_MESS_L1="${L_GRP_MESS_L1}`fct_format "${L_GRP_NOM}" ${L_TAILLE_GRP} c`|"
L_GRP_MESS_L2="${L_GRP_MESS_L2}`fct_format "-" ${L_TAILLE_GRP} r`|"
else
SH_TAILLE_COL[${L_IDX_COL}]=`echo $1|cut -d, -f2`
[ -z "${SH_TAILLE_COL[${L_IDX_COL}]}" ] && SH_TAILLE_COL[${L_IDX_COL}]=${#L_PARAM[${L_IDX_PARAM}]}
[ ${SH_TAILLE_COL[${L_IDX_COL}]} -eq 0 ] && SH_TAILLE_COL[${L_IDX_COL}]=${#L_PARAM[${L_IDX_PARAM}]}
SH_TAILLE_COL[${L_IDX_COL}]=$(( ${SH_TAILLE_COL[${L_IDX_COL}]} + 2 ))
SH_TAILLE_TABLEAU=$(( ${SH_TAILLE_TABLEAU} + ${SH_TAILLE_COL[${L_IDX_COL}]} ))
if [ ${L_IDX_PARAM} -eq ${L_NB_PARAM} ]
then
L_GRP_MESS_L1="${L_GRP_MESS_L1}`fct_format " " ${SH_TAILLE_COL[${L_IDX_COL}]} c`"
L_GRP_MESS_L2="${L_GRP_MESS_L2}`fct_format "${L_PARAM[${L_IDX_PARAM}]}" ${SH_TAILLE_COL[${L_IDX_COL}]} c`"
L_GRP_MESS_L3="${L_GRP_MESS_L3}`fct_format " " ${SH_TAILLE_COL[${L_IDX_COL}]} c`"
else
L_GRP_MESS_L1="${L_GRP_MESS_L1}`fct_format " " ${SH_TAILLE_COL[${L_IDX_COL}]} c`|"
L_GRP_MESS_L2="${L_GRP_MESS_L2}`fct_format "${L_PARAM[${L_IDX_PARAM}]}" ${SH_TAILLE_COL[${L_IDX_COL}]} c`|"
L_GRP_MESS_L3="${L_GRP_MESS_L3}`fct_format " " ${SH_TAILLE_COL[${L_IDX_COL}]} c`|"
fi
((L_IDX_COL++))
fi
fi
shift
((L_IDX_PARAM++))
done
[ "${L_ENTETE}" = "oui" ] && SH_TAILLE_TABLEAU=$(( ${SH_TAILLE_TABLEAU} + ${L_NB_PARAM} - 3 ))
# -- Affichage de la ligne
# -- ---------------------
L_IDX_PARAM=1
L_IDX_COL=1
L_MESSAGE=""
# -- Affichage de l entete du tableau
if [ "${L_ENTETE}" = "oui" ]
then
fct_message -cpt "`fct_format "-" ${SH_TAILLE_TABLEAU} r`"
fct_message -cpt -color jaune "`fct_format "${L_PARAM[2]}" ${SH_TAILLE_TABLEAU} c`"
fct_message -cpt "`fct_format "-" ${SH_TAILLE_TABLEAU} r`"
if [ "${L_GROUPE}" = "oui" ]
then
fct_message -cpt "${L_GRP_MESS_L1}"
fct_message -cpt "${L_GRP_MESS_L2}"
fct_message -cpt "${L_GRP_MESS_L3}"
else
fct_message -cpt "${L_GRP_MESS_L2}"
fi
fct_message -cpt "`fct_format "-" ${SH_TAILLE_TABLEAU} r`"
export SH_TAILLE_TABLEAU SH_TAILLE_COL
L_IDX_PARAM=3
fi
# -- Affichage du corp du tableau
while [ ${L_IDX_PARAM} -le ${L_NB_PARAM} -a "${L_PIED}" = "non" -a "${L_ENTETE}" = "non" ]
do
if [ ${L_IDX_PARAM} -eq ${L_NB_PARAM} ]
then
L_MESSAGE="${L_MESSAGE}`fct_format "${L_PARAM[${L_IDX_PARAM}]}" ${SH_TAILLE_COL[${L_IDX_COL}]} d`"
else
L_MESSAGE="${L_MESSAGE}`fct_format "${L_PARAM[${L_IDX_PARAM}]}" ${SH_TAILLE_COL[${L_IDX_COL}]} d`|"
fi
((L_IDX_PARAM++))
((L_IDX_COL++))
done
[ "${L_PIED}" = "non" -a "${L_ENTETE}" = "non" ] && fct_message -cpt "${L_MESSAGE}"
# -- Affichage du pied et liberation des variables de gestion
if [ "${L_PIED}" = "oui" ]
then
fct_message -cpt "`fct_format "-" ${SH_TAILLE_TABLEAU} r`"
unset SH_TAILLE_TABLEAU SH_TAILLE_COL
fi
# -- Affichage d une ligne de separation
[ "${L_SEP}" = "oui" ] && fct_message -cpt "`fct_format "-" ${SH_TAILLE_TABLEAU} r`"
[ -n "${L_OLD_IFS}" ] && IFS=${L_OLD_IFS} || unset IFS
return 0
}
typeset -Ffx fct_affiche_ligne

121
lib/erreur.lib Executable file
View File

@@ -0,0 +1,121 @@
##----------------------------------------------------------------------------
## Script : erreur.lib
## Module Puppet : gnc-script_core_dtsi
## Auteur : Emmanuel Confrere
## Date : 06-04-2017
## Version : 1.2.2
## Objet : Affiche le message d erreur associe au code et execute
## eventuellement une fonction rattachee.
##
## Fonction : fct_erreur Nombre
##
## Detail : Le message, et eventuellement la fonction sont recherche dans
## le fichier "${NC_EXPL_MSG}/nom_du_script.msg". Chaque ligne de ce fichier
## correspond a la definition d une erreur : Numero_err,Type,Fonction,Message
## Les parametre sont separe par le caractere "|".
## Type peut prendre les valeurs "info" ou "erreur"
## La fonction peut etre "stop","continu" ou defini dans le shell appelant.
## Numero_err est le code de retour du script (les numero de 250 a 256 sont reseves).
##
## Si numero_err vaut zero CodeRet=0 Fonction="stop"
## Si numero_err non renseigne CodeRet=250 Fonction="stop"
## Si numero_err n est pas trouver dans le fichier ".msg" CodeRet=251 Fonction="stop"
## Si le fichier ".msg" n existe pas CodeRet=252 Fonction="stop"
## Si la ligne de definition n est pas correcte CodeRet=253 Fonction="stop"
## Une erreur ete remontee par la fonction fct_params CodeRet=254 Fonction="stop"
## Si numero_err > 250 CodeRet=255
##
# ----------------------------------------------------------------------------
# Mise a jour :
# 1.0.0 10-02-2016 - Emmanuel Confrere - Evo : Integration au socle DTSI
# 1.0.1 17-03-2016 - Emmanuel Confrere - Ano : Les fichier temporaire ne sont pas supprimer dans les sous arborescence
# 1.1.0 24-08-2016 - Emmanuel Confrere - Evo : Prise en charge de la librairie fct_params
# 1.2.0 05-10-2016 - Emmanuel Confrere - Evo : Interpretation des variables dans la zone de texte de fichier de configuration .msg
# 1.2.1 10-03-2017 - Emmanuel Confrere - Ano : Suppression des variables NC_EXPL_*
# 1.2.2 06-04-2017 - Emmanuel Confrere - Ano : Degradation de performance serveur (Cf. DBA-2458)
# Suppression de la commande "find"
##----------------------------------------------------------------------------
function fct_erreur
{
# - Declaration des variables
local L_NumErr=$1 # Numero d erreur a rechercher
local L_CodRet=0 # Code de sortie
local L_Cmd="stop" # Fonction execute par defaut, apres recheche
local L_RefErr="" # Extraction de la ligne du fichier .msg
local L_NbChamp="" # Controle le Nb Champ des ligne .msg
local L_Msg="" # Message a afficher
local L_Type="" # Type de message
[ -z "${SH_FICMSG}" ] && return 0
if [ $# -ne 1 ]
then
L_Cmd="stop"; L_CodRet=250; L_NumErr=250; L_Type="ERREUR"; L_Msg="NoErr non renseigne"
else
case ${L_NumErr} in
0 ) L_Cmd="stop"; L_CodRet=0; L_Type="FIN-OK" ;;
254 ) L_Cmd="stop"; L_CodRet=254; L_Type="ERREUR"; L_Msg="Une erreur ete remontee par la librairie fct_params" ;;
* ) if [ -f ${SH_FICMSG} ]
then
L_RefErr=`grep -e "^${L_NumErr} *|" ${SH_FICMSG}`
if [ -n "${L_RefErr}" ]
then
L_NbChamp=`echo ${L_RefErr}|sed "s/[^|]//g"`
if [ ${#L_NbChamp} -ne 3 ]
then
L_Cmd="stop"; L_CodRet=253; L_Type="ERREUR"; L_Msg="Definition de l erreur incorrecte"
else
[ ${L_NumErr} -ge 250 ] && L_CodRet=255 || L_CodRet=${L_NumErr}
L_Type=`echo ${L_RefErr}|cut -d"|" -f 2|tr a-z A-Z|sed 's/^ *//;s/ *$//'`
L_Cmd=`echo ${L_RefErr}|cut -d"|" -f 3|sed 's/^ *//;s/ *$//'`
eval L_Msg=\"${L_RefErr##*|}\"
[ -z "${L_Cmd}" ] && L_Cmd="stop"
fi
else
L_Cmd="stop"; L_CodRet=251; L_Type="ERREUR"; L_Msg="Definition de l erreur non trouvee"
fi
else
L_Cmd="stop"; L_CodRet=252; L_Type="ERREUR"; L_Msg="Le fichier msg n existe pas"
fi ;;
esac
fi
case ${L_Type} in
"ERREUR" ) fct_message -color rouge "${L_Type} : ${L_Msg}" ;;
"ALERTE" ) fct_message -color orange "${L_Type} : ${L_Msg}" ;;
"INFO" ) fct_message -color bleu "${L_Type} : ${L_Msg}" ;;
"FIN-OK" ) ;;
* ) fct_message "${L_Type} : ${L_Msg}" ;;
esac
case "${L_Cmd}" in
"stop" ) fct_message -hist "(${SH_SESSION_ID}) : fin - ${L_NumErr}"
# Suppression des fichiers temporaire a la sortie du shell principal si mode debug pas activer
if [ ${#SH_INDENT_MSG} -eq 0 -a ${SH_NIV_DEBUG} -eq 0 ]
then
fct_message -debug 0 "<lib:fct_erreur> Nettoyage des fichiers temporaire de la session ${SH_SESSION_ID}"
if [ -n "${NC_EXPL_TMP}" -a -n "${SH_SESSION_ID}" -a "${NC_EXPL_TMP}" != "/" -a "${NC_EXPL_TMP}" != "." ]
then
rm -f "${NC_EXPL_TMP}/*${SH_SESSION_ID}*"
else
fct_message -debug 0 "<lib:fct_erreur> Variable de session incoherente : NC_EXPL_TMP = ${NC_EXPL_TMP} & SH_SESSION_ID = ${SH_SESSION_ID}"
fi
fi
case ${L_Type} in
"ERREUR" ) fct_message -color rouge "fin (${L_NumErr})" ;;
"ALERTE" ) fct_message -color orange "fin (${L_NumErr})" ;;
"INFO" ) fct_message -color bleu "fin (${L_NumErr})" ;;
"FIN-OK" ) fct_message -color vert "fin (${L_NumErr})" ;;
* ) fct_message "${L_Type} : ${L_Msg}" ;;
esac
# Signaler la fin d execution au semaphore eventuel
fct_libere_exec
# Reduction de l indentation
[ ${#SH_INDENT_MSG} -gt 0 ] && SH_INDENT_MSG=${SH_INDENT_MSG:0:$((${#SH_INDENT_MSG}-2))}
exit ${L_CodRet} ;;
"continu" ) return 0 ;;
"*" ) eval ${L_Cmd} ;;
esac
}
typeset -Ffx fct_erreur

266
lib/esql.lib Executable file
View File

@@ -0,0 +1,266 @@
##----------------------------------------------------------------------------
## Script : esql.lib
## Module Puppet : gnc-script_database_dtsi
## Auteur : Emmanuel Confrere
## Date : 10-02-2016
## Version : 8.0.7-0
## Objet : Cette fonction permet l execution d une requete sur un serveur de base de donnees
##
## Fonction : esql [NomVariable] [Connexion]
##
## Detail : Cette fonction permet l execution d une requete sur un serveur de base de donnees
## La requete est passe a travers la variable d environement ESQL_SQLSTMT.
## Cette fonction s appuis sur les executables psql et sqlplus. Les client de ces
## editeurs doivent donc a minima etre installer.
## La fonction est appelle depuis le shell ou depuis un script de la facon suivante
## esql <VAR> <CNX>
##
## Note : l ordre des parametres n a pas d importance et sont tout deux optionnel.
##
## Le type de base est determine soit par la variable d environement NC_EXPL_DBEDITEUR
## soit par la forme du parametre <CNX>. Ce parametre reconnais le format suivant
## <editeur>:<compte>/<mdp>@<Alias>|@<host:port>//<base>
##
## Ex. cpt/mdp@host:port//base
## cpt/mdp
## cpt/mdp@Alias ( @ est equivalent a //base pour Postgres )
## cpt/mdp//base ( // est equivalent a @Alias pour Oracle)
## /sys ( connexion "/ as sysdba" pour Oracle et "postgres" pour Postgres )
## /sys//base ( pour Postgres se connecte a la base "base" sous le compte "postgres". Ignore par oracle)
##
## Chacune de ces formes peut etre precede par l editeur de la base...
## Ex. oracle:cpt/mdp@Alias
## postgres:/sys
##
## Note : Prefixer par l editeur est necessaire pour interoger une base distante.
## Si l editeur n est pas specifier alors la variable NC_EXPL_DBEDITEUR seras utilisee
## pour determiner l executable a utiliser. La variable NC_EXPL_DBEDITEUR est initialise
## par /opt/expl/conf/shell-env/profile_socle_database.env
##
## Le resultat de la requete est envoye sur la sortie standard ou dans la variable <VAR>
## si cette derniere est renseignee. Si plusieur enragistrement sont
## retourne par la requete la variable <VAR> seras un tableau.
##
## Si aucun parametre de connexion n est fourni (<CNX> est null) alors
## une connxion par defaut sur la base local est utilise
##
## Par defaut la connexion a un serveur Postgres se fait avec le compte postgres
## et si la base n est pas specifier on se connectre a la base postgres.
## Sur un serveur Oracle la connexion se fait par defaut via un compte externe "/"
## sur la base courante defini par la librairie "base".
##
## Si aucune erreur n est releve cette fontion retourne le code de sortie 0.
##
## IMPORTANT : Cette fonction utilise le disque virtuel /dev/shm pour construire les tableaux
##
# ----------------------------------------------------------------------------
# Mise a jour :
# 8.0.7-0 - 10-02-2016 - Emmanuel Confrere - Integration au socle DTSI via Puppet
##----------------------------------------------------------------------------
function esql
{
local VAR_DB=""
local VAR_RES=$1
local VAR_CPT=$2
local VAR_TMP=""
local VAR_CNX=""
local VAR_SES=""
local VAR_LIGNE=""
local VAR_I=1
local PVF=${ESQL_SQLSTMT:${#ESQL_SQLSTMT}-1:1}
local VAR_TMP=""
local VAR_MDP=""
local VAR_CPT2=""
local VAR_ERR=0
local VAR_HOST=""
local VAR_PORT=""
local VAR_BASE=""
fct_message -debug 0 "<lib:esql> ## ---------------------- esql.lib sql submit -------------------- ##"
# -- On controle si l ordre SQL fini bien par ";", le cas echeans on ajoute ce caractere...
[ "${PVF}" = "/" -o "${PVF}" = ";" ] && PVF="" || PVF=";"
# -- On identifie une eventuelle chaine de connexion sur le premier argument
# -- si c est c est le cas, soit il y eu inversion des arguments, soit il n y a pas de nom de variable passe en argument
# -- Si dessous on echange les arguments dans tous les cas ...
if [ `expr match "${VAR_RES}" ".*/.*@.*$"` -ne 0 -o `expr match "${VAR_RES}" ".*/.*$"` -ne 0 -o `expr match "${VAR_RES}" "[a-z,A-Z][a-z,A-Z]*:.*$"` -ne 0 ]
then
VAR_TMP="${VAR_RES}"
VAR_RES="${VAR_CPT}"
VAR_CPT="${VAR_TMP}"
fct_message -debug 0 "<lib:esql> Echange des parametre d entree"
fi
# -- identification de l editeur a partir du format de la chaine de connection
if [ `expr match "${VAR_CPT}" "[a-z]*:"` -ne 0 ]
then
VAR_DB=`echo ${VAR_CPT}|cut -d ":" -f1`
VAR_CPT=`echo ${VAR_CPT}|sed 's/[^:]*:\(.*$\)/\1/'`
else
VAR_DB=${NC_EXPL_DBEDITEUR}
fi
# -- Construction de la chaine de connexion en fontion de l editeur (VAR_CNX) et de la forme du parametre VAR_CPT
case "${VAR_DB}" in
"oracle" ) fct_message -debug 0 "<lib:esql> Connexion a une base Oracle"
if [ -z "${VAR_CPT}" ]
then
VAR_MDP="Aucun"
VAR_CPT2="/"
VAR_CNX="/"
VAR_SES="alter session set current_schema = zzsmai_adm;"
fct_message -debug 2 "<lib:esql> <1> Chaine de connexion (VAR_CNX) : ${VAR_CNX}"
fct_message -debug 2 "<lib:esql> <1> Schema courant (VAR_SES) : ${VAR_SES}"
elif [ "${VAR_CPT}" = "/sys" ]
then
VAR_MDP="Aucun"
VAR_CPT2="/ as sysdba"
VAR_CNX="/ as sysdba"
fct_message -debug 2 "<lib:esql> <2> Chaine de connexion (VAR_CNX) : ${VAR_CNX}"
elif [ `expr match "${VAR_CPT}" "/sys//.*$"` -ne 0 ]
then
fct_message "<lib:esql> format de connexion non supporte (VAR_CPT=${VAR_CPT})"
return 2
elif [ `expr match "${VAR_CPT}" ".*/.*@.*:[0-9][0-9]*//.*$"` -ne 0 ]
then
VAR_BASE=`echo "${VAR_CPT}"|sed 's#.*/.*@.*:[0-9][0-9]*//\(.*\)$#\1#'`
VAR_HOST=`echo "${VAR_CPT}"|sed 's#.*/.*@\(.*\):[0-9][0-9]*//.*$#\1#'`
VAR_PORT=`echo "${VAR_CPT}"|sed 's#.*/.*@.*:\([0-9][0-9]*\)//.*$#\1#'`
VAR_CPT2=`echo "${VAR_CPT}"|sed 's#\(.*\)/.*@.*:[0-9][0-9]*//.*$#\1#'`
VAR_MDP=`echo "${VAR_CPT}"|sed 's#.*/\(.*\)@.*:[0-9][0-9]*//.*$#\1#'`
VAR_CNX="${VAR_CPT2}/${VAR_MDP}@${VAR_HOST}:${VAR_PORT}/${VAR_BASE}"
fct_message -debug 2 "<lib:esql> <3> Chaine de connexion (VAR_CNX) : ${VAR_CNX}"
elif [ `expr match "${VAR_CPT}" ".*/.*@.*$"` -ne 0 ]
then
VAR_HOST=`echo "${VAR_CPT}"|sed 's#.*/.*@\(.*\)$#\1#'`
VAR_CPT2=`echo "${VAR_CPT}"|sed 's#\(.*\)/.*@.*$#\1#'`
VAR_MDP=`echo "${VAR_CPT}"|sed 's#.*/\(.*\)@.*$#\1#'`
VAR_CNX="${VAR_CPT2}/${VAR_MDP}@${VAR_HOST}"
fct_message -debug 2 "<lib:esql> <4> Chaine de connexion (VAR_CNX) : ${VAR_CNX}"
elif [ `expr match "${VAR_CPT}" ".*/.*//.*$"` -ne 0 ]
then
VAR_HOST=`echo "${VAR_CPT}"|sed 's#.*/.*//\(.*\)$#\1#'`
VAR_CPT2=`echo "${VAR_CPT}"|sed 's#\(.*\)/.*//.*$#\1#'`
VAR_MDP=`echo "${VAR_CPT}"|sed 's#.*/\(.*\)//.*$#\1#'`
VAR_CNX="${VAR_CPT2}/${VAR_MDP}@${VAR_HOST}"
fct_message -debug 2 "<lib:esql> <5> Chaine de connexion (VAR_CNX) : ${VAR_CNX}"
elif [ `expr match "${VAR_CPT}" ".*/.*$"` -ne 0 ]
then
VAR_CPT2=`echo "${VAR_CPT}"|sed 's#\(.*\)/.*$#\1#'`
VAR_MDP=`echo "${VAR_CPT}"|sed 's#.*/\(.*\)$#\1#'`
VAR_CNX="${VAR_CPT2}/${VAR_MDP}"
fct_message -debug 2 "<lib:esql> <6> Chaine de connexion (VAR_CNX) : ${VAR_CNX}"
else
fct_message "<lib:esql> Chaine de connexion non reconnu"
return 2
fi ;;
"postgres" ) fct_message -debug 0 "<lib:esql> Connexion a une base Postgres"
if [ -z "${VAR_CPT}" -o "${VAR_CPT}" = "/sys" ]
then
VAR_CPT2="postgres"
VAR_MDP="aucun"
VAR_CNX="postgres://"
fct_message -debug 2 "<lib:esql> <7> Chaine de connexion (VAR_CNX) : ${VAR_CNX}"
elif [ `expr match "${VAR_CPT}" "/sys//.*$"` -ne 0 ]
then
VAR_BASE=`echo "${VAR_CPT}"|sed 's#^/sys//\(.*\)$#\1#'`
VAR_CPT2="postgres"
VAR_MDP="aucun"
VAR_CNX="postgres:///${VAR_BASE}"
fct_message -debug 2 "<lib:esql> <8> Chaine de connexion (VAR_CNX) : ${VAR_CNX}"
elif [ `expr match "${VAR_CPT}" ".*/.*@.*:[0-9][0-9]*//.*$"` -ne 0 ]
then
VAR_BASE=`echo "${VAR_CPT}"|sed 's#.*/.*@.*:[0-9][0-9]*//\(.*\)$#\1#'`
VAR_HOST=`echo "${VAR_CPT}"|sed 's#.*/.*@\(.*\):[0-9][0-9]*//.*$#\1#'`
VAR_PORT=`echo "${VAR_CPT}"|sed 's#.*/.*@.*:\([0-9][0-9]*\)//.*$#\1#'`
VAR_CPT2=`echo "${VAR_CPT}"|sed 's#\(.*\)/.*@.*:[0-9][0-9]*//.*$#\1#'`
VAR_MDP=`echo "${VAR_CPT}"|sed 's#.*/\(.*\)@.*:[0-9][0-9]*//.*$#\1#'`
VAR_CNX="postgres://${VAR_CPT2}:${VAR_MDP}@${VAR_HOST}:${VAR_PORT}/${VAR_BASE}"
fct_message -debug 2 "<lib:esql> <9> Chaine de connexion (VAR_CNX) : ${VAR_CNX}"
elif [ `expr match "${VAR_CPT}" ".*/.*@.*$"` -ne 0 ]
then
VAR_BASE=`echo "${VAR_CPT}"|sed 's#.*/.*@\(.*\)$#\1#'`
VAR_CPT2=`echo "${VAR_CPT}"|sed 's#\(.*\)/.*@.*$#\1#'`
VAR_MDP=`echo "${VAR_CPT}"|sed 's#.*/\(.*\)@.*$#\1#'`
VAR_CNX="postgres://${VAR_CPT2}:${VAR_MDP}@localhost/${VAR_BASE}"
fct_message -debug 2 "<lib:esql> <10> Chaine de connexion (VAR_CNX) : ${VAR_CNX}"
elif [ `expr match "${VAR_CPT}" ".*/.*//.*$"` -ne 0 ]
then
VAR_BASE=`echo "${VAR_CPT}"|sed 's#.*/.*//\(.*\)$#\1#'`
VAR_CPT2=`echo "${VAR_CPT}"|sed 's#\(.*\)/.*//.*$#\1#'`
VAR_MDP=`echo "${VAR_CPT}"|sed 's#.*/\(.*\)//.*$#\1#'`
VAR_CNX="postgres://${VAR_CPT2}:${VAR_MDP}@localhost/${VAR_BASE}"
fct_message -debug 2 "<lib:esql> <11> Chaine de connexion (VAR_CNX) : ${VAR_CNX}"
elif [ `expr match "${VAR_CPT}" ".*/.*$"` -ne 0 ]
then
VAR_BASE=`echo "${VAR_CPT}"|sed 's#\(.*\)/.*$#\1#'`
VAR_CPT2=${VAR_BASE}
VAR_MDP=`echo "${VAR_CPT}"|sed 's#.*/\(.*\)$#\1#'`
VAR_CNX="postgres://${VAR_CPT2}:${VAR_MDP}@localhost/${VAR_BASE}"
fct_message -debug 2 "<lib:esql> <12> Chaine de connexion (VAR_CNX) : ${VAR_CNX}"
else
fct_message "<lib:esql> Chaine de connexion non reconnu"
return 2
fi ;;
* ) fct_message "<lib:esql> Editeur inconnu : ${VAR_DB}"
return 3 ;;
esac
if [ -n "${ESQL_SQLSTMT}" ]
then
fct_message -debug 0 "<lib:esql> Compte de soumission : ${VAR_CPT2}"
fct_message -debug 3 "<lib:esql> Mot de passe : ${VAR_MDP}"
fct_message -debug 0 "<lib:esql> ${ESQL_SQLSTMT}${PVF}"
case "${VAR_DB}" in
"oracle" ) VAR_TMP=`sqlplus -s ${VAR_CNX} << EndSQL
whenever sqlerror exit 100 rollback;
whenever oserror exit 101 rollback;
set head off pages 0 feed off echo off lines 2048 trim on verify off;
${VAR_SES}
${ESQL_SQLSTMT}${PVF}
EndSQL`
VAR_ERR=$? ;;
"postgres" ) VAR_TMP=`psql -t -q -F "|" -A ${VAR_CNX} << EndSQL
${ESQL_SQLSTMT}${PVF}
EndSQL`
VAR_ERR=$? ;;
esac
if [ ${VAR_ERR} -ne 0 ]
then
export ESQL_NUMROWS=0
[ -n "${SH_SESSION_ID}" ] && fct_message -debug 0 "<lib:esql> ${VAR_TMP}" || echo "${VAR_TMP}"
return 1
else
[ -z "${VAR_TMP}" ] && ESQL_NUMROWS=0 || ESQL_NUMROWS=`echo "${VAR_TMP}"|wc -l`
fct_message -debug 0 "<lib:esql> ESQL_NUMROWS=${ESQL_NUMROWS}"
export ESQL_NUMROWS
fct_message -debug 2 "<lib:esql> ## ---------------------- esql.lib result set -------------------- ##"
if [ -n "${VAR_RES}" ]
then
eval unset ${VAR_RES}
[ ${ESQL_NUMROWS} -eq 0 ] && eval ${VAR_RES}=""
[ ${ESQL_NUMROWS} -eq 1 ] && eval ${VAR_RES}=\"${VAR_TMP}\"
[ ${ESQL_NUMROWS} -eq 1 -a -n "${SH_SESSION_ID}" ] && fct_message -debug 2 "<lib:esql> ${VAR_TMP}"
if [ ${ESQL_NUMROWS} -gt 1 ]
then
VAR_I=0
echo "${VAR_TMP}" > /dev/shm/sql$$.tmp
while read VAR_LIGNE
do
VAR_LIGNE=`echo ${VAR_LIGNE}|sed 's/ */ /g'`
[ -n "${SH_SESSION_ID}" ] && fct_message -debug 2 "<lib:esql> ${VAR_LIGNE}"
eval ${VAR_RES}[${VAR_I}]=\"${VAR_LIGNE}\"
(( VAR_I++ ))
done < /dev/shm/sql$$.tmp
rm -f /dev/shm/sql$$.tmp
fi
else
[ ${ESQL_NUMROWS} -ne 0 ] && echo "${VAR_TMP}"
fi
fct_message -debug 0 "<lib:esql> ## --------------------------------------------------------------- ##"
fi
fi
return 0
}
typeset -Ffx esql

69
lib/format-ligne.lib Executable file
View File

@@ -0,0 +1,69 @@
##----------------------------------------------------------------------------
## Script : format_ligne.lib
## Module Puppet : gnc-script_core_dtsi
## Auteur : Emmanuel Confrere
## Date : 10-02-2016
## Version : 1.0.0
## Objet : Permet de formater le texte dans la fonction fct_affiche_ligne.
##
## Fonction : fct_format Texte taille justification
##
## Detail : Ne pas appeler directement.
##
# ----------------------------------------------------------------------------
# Mise a jour :
# 1.0.0 10-02-2016 - Emmanuel Confrere - Creation : Reprise du script du socle Oracle
##----------------------------------------------------------------------------
function fct_format
{
local L_TEXT="$1"
local L_TAILLE=$2
local L_JUSTIFIER=$3
local L_TMP=""
local L_TMP2=""
local L_RESULT=""
local L_REPETITION=0
case "${L_JUSTIFIER}" in
"r" ) L_TMP=1
L_REPETITION=$(( ${L_TAILLE} / ${#L_TEXT} + 1))
while [ ${L_TMP} -le ${L_REPETITION} ]
do
L_RESULT="${L_RESULT}${L_TEXT}"
L_TMP=$(( ${L_TMP} + 1 ))
done ;;
"c" ) L_TMP=1
L_REPETITION=$(( ${L_TAILLE} - ${#L_TEXT} ))
L_REPETITION=$(( ${L_REPETITION} / 2 ))
L_TMP2=$(( ${L_TAILLE} - ${#L_TEXT} - ${L_REPETITION} ))
while [ ${L_TMP} -le ${L_REPETITION} -a ${L_REPETITION} -gt 0 ]
do
L_RESULT="${L_RESULT} "
L_TMP=$(( ${L_TMP} + 1 ))
done
if [ ${L_REPETITION} -gt 0 ]
then
if [ ${L_REPETITION} -eq ${L_TMP2} ]
then
L_RESULT="${L_RESULT}${L_TEXT}${L_RESULT}"
else
L_RESULT="${L_RESULT}${L_TEXT}${L_RESULT} "
fi
else
L_RESULT="${L_TEXT}"
fi ;;
"d" ) L_TMP=1
L_REPETITION=$(( ${L_TAILLE} - ${#L_TEXT} ))
while [ ${L_TMP} -le ${L_REPETITION} -a ${L_REPETITION} -gt 0 ]
do
L_RESULT="${L_RESULT} "
L_TMP=$(( ${L_TMP} + 1 ))
done
L_RESULT="${L_TEXT}${L_RESULT}" ;;
esac
L_RESULT=${L_RESULT:0:${L_TAILLE}}
echo ${L_RESULT}
return 0
}
typeset -Ffx fct_format

47
lib/gen-mdp.lib Executable file
View File

@@ -0,0 +1,47 @@
##----------------------------------------------------------------------------
## Script : gen-mdp.lib
## Module Puppet : gnc-script_core_dtsi
## Auteur : Emmanuel Confrere
## Date : 10-02-2016
## Version : 1.0.0
## Objet : Genration d un mots depasse aleatoire
##
## Fonction : fct_gen_mdp
##
## Detail :
##
# ----------------------------------------------------------------------------
# Mise a jour :
# 1.0.0 10-02-2016 - Emmanuel Confrere - Creation : Reprise du script du socle Oracle
##----------------------------------------------------------------------------
function fct_gen_mdp
{
local L_CARACTERES="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
local L_CHIFFRES="1234567890"
local L_SPECCAR="-=:#+_"
local L_MDP=""
local L_TMP=""
local L_CPT=1
local L_LONGUEUR=9
local L_SIMPLE="non"
[ "$1" = "-ns" ] && L_SPECCAR=""
[ -z "$1" -a "$1" != "-ns" ] && L_SIMPLE="oui"
L_MDP=${L_CARACTERES:$(( $RANDOM % ${#L_CARACTERES} )):1}
L_TMP="${L_CARACTERES}${L_SPECCAR}${L_CHIFFRES}${L_SPECCAR}${L_CHIFFRES}${L_SPECCAR}${L_CHIFFRES}"
if [ -z "$1" -a "$1" != "-ns" ]
then
while [ ${L_CPT} -le ${L_LONGUEUR} ]
do
L_MDP="${L_MDP}${L_TMP:$(( $RANDOM % ${#L_TMP} )):1}"
((L_CPT++))
done
else
L_MDP=`echo $1|md5sum|sed 's/ *//g;s/-$//;s/[0-9]*\([a-f][a-f,0-9]*\)/\1/'|cut -c1-9`
fi
echo ${L_MDP}
}
typeset -Ffx fct_gen_mdp

153
lib/message.lib Executable file
View File

@@ -0,0 +1,153 @@
##----------------------------------------------------------------------------
## Script : message.lib
## Module Puppet : gnc-script_core_dtsi
## Auteur : Emmanuel Confrere
## Date : 29-06-2017
## Version : 1.2.1
## 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 ?
##----------------------------------------------------------------------------
function fct_message
{
local L_TEXT="" # Texte a afficher
local L_TIME_STAMP=`date "+%x %X"` # Horrodatage a ajouter au texte
local L_EXISTE_REP
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="non" # 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="non" # Message de compte rendu
local L_OPTION_HIST="non" # Message pour l historique
local L_COULEUR="" # Couleur du texte avec l option -color
local L_OPTION_COULEUR="non"
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 "
# - 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="oui" ;;
"-nolog") L_OPTION_NOLOG="oui" ;;
"-hist") L_OPTION_HIST="oui" ;;
"-color") L_OPTION_COULEUR="oui"
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="non"
L_TMP=$(( ${L_TMP} + 1 ))
shift
fi ;;
"-debug") L_OPTION_DBG="oui"
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 ${SH_NIV_DEBUG} ] && return 0 ;;
*) L_TEXT="${L_OPT}" ;;
esac
L_TMP=$(( ${L_TMP} + 1 ))
shift
done
# - controle que la fonction est lance depuis un shell
if [ -z "${SH_SESSION_ID}" ]
then
# -- La fonction est executer en mode inetractif (Pas dans un shell)
# -- on autorise alors que l affichage sur la sortie standard
SH_AFF_SID="non"
SH_SILENCE="non"
SH_NIV_DEBUG=0
L_EXISTE_REP=1
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=0 || L_EXISTE_REP=1
fi
# - initialisation des variables
[ "${SH_AFF_SID}" = "oui" ] && L_OPTION_SID="[${SH_SESSION_IDP}] "
L_OPTION_NOLOG=${L_OPTION_NOLOG:="non"}
# - 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}" = "oui" ]
then
[ ${L_EXISTE_REP} -eq 0 ] && echo "${L_TIME_STAMP} [${SH_SESSION_IDP}] : <Debug_${L_NIV_DEBUG}> ${L_TEXT}" >> ${SH_FICLOG}
else
[ ${L_EXISTE_REP} -eq 0 -a "${L_OPTION_CPT}" = "oui" -a "${L_OPTION_HIST}" = "non" ] && echo "${L_TIME_STAMP} : ${L_TEXT}" >> ${SH_FICCPT}
[ ${L_EXISTE_REP} -eq 0 -a "${L_OPTION_CPT}" = "non" -a "${L_OPTION_HIST}" = "oui" ] && echo "${L_TIME_STAMP} : ${SH_LOGUSER} : ${SH_EXECUSER} : ${L_TEXT}" >> ${SH_FICTRC}
if [ "${L_OPTION_NOLOG}" = "non" ]
then
[ ${L_EXISTE_REP} -eq 0 -a "${L_OPTION_CPT}" = "non" -a "${L_OPTION_HIST}" = "non" ] && echo "${L_TIME_STAMP} [${SH_SESSION_IDP}] : ${L_TEXT}" >> ${SH_FICLOG}
[ ${L_EXISTE_REP} -eq 0 -a "${L_OPTION_CPT}" = "oui" -a "${L_OPTION_HIST}" = "oui" ] && echo "${L_TIME_STAMP} : ${L_TEXT}" >> ${SH_FICLOG}
fi
if [ "${SH_SILENCE}" = "non" -a "${L_OPTION_HIST}" = "non" ]
then
if [ "${L_OPTION_COULEUR}" = "oui" ]
then
echo -e "${L_OPTION_SID}\033[${L_COULEUR}m${L_TEXT}\033[0m"
else
echo -e "${L_OPTION_SID}${L_TEXT}"
fi
fi
fi
return 0
}
typeset -Ffx fct_message

580
lib/params.lib Executable file
View File

@@ -0,0 +1,580 @@
##----------------------------------------------------------------------------
## Script : params.lib
## Module Puppet : gnc-script_core_dtsi
## Auteur : Emmanuel Confrere
## Date : 05-07-2017
## Version : 2.2.2
## Objet : Gere les options passees a un script
## qui ont ete declare dans l entete de ce dernier
##
## Fonction : fct_param
##
## Detail : Cette fonction est appele par le chargement de init.conf
## Elle analyse traite les parametres passes a la commande en correlation
## avec ceux declares dans l entete du script.
##
## Cette fonction prend en charge les option -h -s, -dbg N, -hist [N], -log [Sid], -cpt [Sid]
## qui n on t pas besoins d etre declare.
##
## -h : Affiche l aide du script
## -s : mode silence (Pas d affichage sur la console)
## -dbg N : Passe mode debug de niveau N
## -hist : Affiche l historique des N dernieres execution (N vaut 1 par defaut)
## -log : Affiche le dernier journal d execution ou celui specifier par le numero de session d'execution
## -cpt : Affiche le dernier compte-rendus ou celui specifier par le numero de session d'execution
# ----------------------------------------------------------------------------
# Mise a jour :
# 1.0.0 22-08-2016 - Emmanuel Confrere - Cre : Creation
# 1.0.1 23-08-2016 - Emmanuel Confrere - Ano : Expension des variables imcomptible en version Bash 3.2.25 sur deploiement
# 1.1.0 24-08-2016 - Emmanuel Confrere - Evo : Ajout de la gestion des arguments sans option
# 1.1.1 24-08-2016 - Emmanuel Confrere - Ano : Changement des variable du socle NC_EXPL_ -> NC_EXPL
# 1.1.2 24-08-2016 - Emmanuel Confrere - Ano : libelle des erreurs 11 et 10
# 1.1.3 24-08-2016 - Emmanuel Confrere - Ano : Libelle de l erreur 11 erronee
# 1.1.4 24-08-2016 - Emmanuel Confrere - Evo : Ajout de la diponibilite d un compte rendu
# Ajout de l option par defaut cpt
# 1.1.5 25-08-2016 - Emmanuel Confrere - Ano : Option -hist : ne pas affiche la session en cours
# 2.0.0 29-08-2016 - Emmanuel Confrere - Evo : Les booleen sont desorme traduit par 0 ou 1 (Faux ou Vraix)
# 2.0.1 11-10-2016 - Emmanuel Confrere - Evo : Ajout de commentaire dans le code
# 2.0.2 17-11-2016 - Emmanuel Confrere - Ano : Comportement de la gestion des arguments incoherent.
# 2.1.0 21-11-2016 - Emmanuel Confrere - Evo : Ajout d un controle : Liste de valeurs determinees pour les arguments d une option
# ou pour les arguments du script (valeur separee par une virgule ou un espace)
# 2.1.1 30-03-2017 - Emmanuel Confrere - Ano : Interpretation des arguments par Bash ! Cf. DBA-2455
# 2.2.0 13-04-2017 - Emmanuel Confrere - Evo : Prise en compte de la journalisation du compte d execution dans l historique
# 2.2.1 13-04-2017 - Emmanuel Confrere - Ano : Prise en compte de la journalisation avec l option -log
# Compatibilite ascendente n etait pas assuree.
# 2.2.2 05-07-2017 - Emmanuel Confrere - Ano : Lorsque des option possede une inclusion la librairie entre dans une boucle infinie !
##----------------------------------------------------------------------------
function fct_params
{
local L_PROG=${SH_DIR}/${SH_PROG} # Nom absolu du script
local L_IDX=0 # Index de position de l option dans la declaration
local L_IDX2=0 # Index de position de l option dans la declaration
local L_PARAM="" # Ligne de declaration
local L_PARAM_ARGS="" # Ligne de declaration pour un argument sans option
local L_PARAM_ARGS_DEF=0 # Detection d un arguments de script defini par defaut (0=non, 1=oui)
local L_PARAM_ARGS_CTL="" # Liste des valeurs possible pour les arguments du scripts
local L_PARMF="" # Fichier contenant l extraction de la declaration
local L_OPT_OBLIGATOIRE="" # Liste des options obligatoire separees par " "
local L_VAR="" # Nom de la variable contenant les argument
local L_VAL="" # Valeur de l argument
local L_DEFARG="" # Valeur par defaut d un argument
local L_OPTSET=0 # Map binaire des option positionnees
local L_OPTEXCLUDE="" # Map binaire des option mutuellement execlusive
local L_OPTINCLUDE=0 # Tableau de map binaire qui pour chaque option fourni la liste des options inclusive
local L_OPTINC=0 # Map binaire des options pocedant une liste d inclusion
local L_OPTINCONNU="" # Liste des options non reconnu
local L_OPTARGS_CTL="" # Liste des valeurs possible pour les arguments d une option
local L_OPTDEF=0 # detection d une valeur par defaut pour une option (0=non, 1=oui)
local L_NB_MINARG=0 # Nombre d argument obligatoire
local L_NB_MAXARG=0 # Nombre d argument max
local L_NB_ARG=0 # Indexe
local L_OPTMAJ="non" # Option de mise en majuscule des arguments
local L_TMP="" # Variable temporaire a tout faire ;-)
local L_ERREUR=0 # Detection des erreurs
local L_ERREUR_MSG="" # Table de libelle d erreur
local L_OPT_NOM="" # Tableau des option declare
local L_UORI="" # Utilisateur a l origine de la demande d execution du script
local L_UEXE="" # Utilisateur sous lequel s execute le script
# -- Le srcipt doit etre defini, pour lire la declaration des options !!
# -- Il s agit d une securite au cas ou "init.conf" n aurais pas ete sourcee
if [ -z "${L_PROG}" ]
then
fct_message -color rouge "<lib:fct_params> Le nom du script Bash n est pas defini"
fct_erreur 254
fi
# -- Extraction des options de la declaration
# -- ----------------------------------------
# -- Definition d un fichier tempon ( ${L_PARMF} ) pour acceuillir l entete du script contenant la declaration
# -- des options. Comme ce fichier va etre parcouru souvent, on le charge en RAM disque de preference ( sur /dev/shm).
# -- Le nom du fichier tempon sera le nom du script suffixee par ".parms" en lieu et place de ".sh"
L_PARMF=`echo ${SH_PROG}|sed "s/\.sh$/_${SH_SESSION_ID}\.parms/"`
[ -d /dev/shm ] && L_PARMF="/dev/shm/${L_PARMF}" || L_PARMF="/tmp/${L_PARMF}"
> ${L_PARMF}
# -- Extraction de la declaration des arguments du script et affectation de la valeur par defaut
# -- Il s agit de recuperer les lignes de l entete du script qui commence par "# ARG:"
L_PARAM_ARGS=`grep -E "^# *@ARG:" ${L_PROG}|head -1|sed "s/# *@ARG: *\([^ #]*\).*$/\1/"`
if [ -n "${L_PARAM_ARGS}" ]
then
# -- Un arguments a ete declare on initialise la valeur par defaut
L_DEFARG=`echo ${L_PARAM_ARGS}|cut -d: -f4`
L_VAR=`echo ${L_PARAM_ARGS}|cut -d: -f2`
# -- detection d une valeur par defaut pour l argument du script
# -- La variable L_PARAM_ARGS_DEF sera utilise pour ecraser le parametre par defaut si ce dernier a ete soumis au script
[ -n "${L_DEFARG}" ] && L_PARAM_ARGS_DEF=1 || L_PARAM_ARGS_DEF=0
# -- initialisation de la valeur par defaut
[ -n "${L_VAR}" -a -n "${L_DEFARG}" ] && eval ${L_VAR}=\"${L_DEFARG}\"
[ -z "${L_VAR}" -a -n "${L_DEFARG}" ] && eval SH_ARGS=\"${L_DEFARG}\"
# -- On recupere la liste des valeurs possibles pour les arguments du script
L_PARAM_ARGS_CTL=`echo ${L_PARAM_ARGS}|cut -d: -f5`
fi
# -- Extraction de la declaration des options de l entete du script, et chargement dans le fichier tampon
L_IDX=0
grep -E "^# *@OPT:" ${L_PROG}|sed "s/# *@OPT: *\([^ #]*\).*$/\1/" > ${L_PARMF}
# -- Si aucun parametre n est declare dans l entete du script alors on laise le script gere lui meme les parametres d entree
# -- Cette partie de code est temporaire le temps qe les scripts existant adopte cette librairie. Le probleme c est
# -- que les options par defaut (-h,-s ...) ne seront pas gere pour un scripts qui n a pas d option, pour contourner ce probleme
# -- Il faut declarer une oprion bidon dans l entete du script
# -- On compte le nombre d option declaree :
L_IDX=`wc -l ${L_PARMF}|awk '{print $1}'`
if [ ${L_IDX} -eq 0 ]
then
# Pas d option declaree, on supprime le fichier tempon et on sort
[ -f ${L_PARMF} -a -n "${L_PARMF}" ] && rm -f ${L_PARMF}
return 0
fi
# -- Ajouter a cette liste les options pris en charge par defaut
# -- -h, -s, -dbg, -log et -hist
for L_PARAM in "fb:h::0::::" "fb:s::0::::" "fn:dbg:SH_NIV_DEBUG:1::::" "fb:log:SH_ARG_LOG:0/1::::" "fn:hist:SH_ARG_HIST:0/1:10:::" "fb:cpt:SH_ARG_CPT:0/1::::"
do
echo "${L_PARAM}" >> ${L_PARMF}
done
# -- Initialisation des variables
# -- On parcours la liste des options declarees qui a ete extraite precedement.
# -- Puis on initialise les variables qui servirons de comparaison par la suite
# -- avec les options soumis au script...
L_IDX=0
while read L_PARAM
do
L_OPT_LIGNE[${L_IDX}]=${L_PARAM} # -- Ligne de parametre d une option
L_OPT_NOM[${L_IDX}]=`echo ${L_PARAM}|cut -d: -f2` # -- Nom de l option en cours de taritement
eval SH_OPTION_${L_OPT_NOM[${L_IDX}]}=0 # -- Par defaut on intialise l indicateur d utilisation d une option a faux (0)
# -- On verifie que la declaration comporte bien 7 ou 8 champs
L_TMP=`echo ${L_PARAM}|sed 's/[^:]//g'`
if [ ${#L_TMP} -lt 6 -o ${#L_TMP} -gt 7 ]
then
L_ERREUR_MSG[1]="<lib:fct_params> La declaration de l option \"${L_OPT_NOM[${L_IDX}]}\" ne comporte pas le nopmbre de champs requis (7 ou 8)"
L_ERREUR=1
else
[ `echo ${L_PARAM}|cut -d: -f1|grep -c "o"` -eq 1 ] && L_OPT_OBLIGATOIRE="${L_OPT_OBLIGATOIRE}${L_OPT_NOM[${L_IDX}]}:${L_IDX} "
# -- On controle que la declarartion est bien unique
L_TMP=L_POS_${L_OPT_NOM[${L_IDX}]}
if [ -n "${!L_TMP}" ]
then
L_ERREUR_MSG[2]="<lib:fct_params> Declaration dupliquee de l option : ${L_OPT_NOM[${L_IDX}]}"
L_ERREUR=2
else
eval ${L_TMP}=${L_IDX}
fi
# -- Valeur par defaut pour les parametres non booleen
L_VAR=`echo ${L_PARAM}|cut -d: -f3`
L_DEFARG=`echo ${L_PARAM}|cut -d: -f5`
if [ `echo ${L_PARAM}|cut -d: -f1|grep -c "b"` -eq 0 -a -n "${L_DEFARG}" ]
then
if [ -z "${L_VAR}" ]
then eval SH_ARG_${L_OPT_NOM[${L_IDX}]}=\"${L_DEFARG}\"
else eval ${L_VAR}=\"${L_DEFARG}\"
fi
fi
fi
((L_IDX++))
done < ${L_PARMF}
# -- Le fichier tempon ${L_PARMF} n est plus utile
[ -f ${L_PARMF} -a -n "${L_PARMF}" ] && rm -f ${L_PARMF}
# -- Calcul des exclusions et inclusion
# -- ----------------------------------
L_IDX=0
while [ ${L_IDX} -le ${#L_OPT_NOM[*]} ]
do
# -- Option mutuellement exclusive
L_PARAM=`echo ${L_OPT_LIGNE[${L_IDX}]}|cut -d: -f6|sed 's/,/ /g'`
if [ -n "${L_PARAM}" ]
then
# -- Une liste d exclusion a ete defini pour cette option
# -- On contruit un Bitmap listant les options incompatibles
for L_TMP in ${L_PARAM}
do
eval L_IDX2=\${L_POS_${L_TMP}}
if [ -z "${L_IDX2}" ]
then
L_ERREUR_MSG[3]="<lib:fct_params> L option ${L_TMP} declaree dans la liste d exclusion de l option ${L_OPT_NOM[${L_IDX}]} est inconnu"
L_ERREUR=3
else
L_OPTEXCLUDE="${L_OPTEXCLUDE} ${L_OPT_NOM[${L_IDX}]},${L_TMP}:$(( 2 ** ${L_IDX2} + 2 ** ${L_IDX} ))"
fi
done
fi
# -- Option inclusive
L_PARAM=`echo ${L_OPT_LIGNE[${L_IDX}]}|cut -d: -f7|sed 's/,/ /g'`
if [ -n "${L_PARAM}" ]
then
# -- Une liste d inclusion a ete defini pour cette option
# -- On contruit un Bitmap listant les options obligatoire qui doivent etre position avec l option L_IDX
# -- Map des option qui declare une inclusion
L_OPTINC=$(( 2 ** ${L_IDX} + ${L_OPTINC} ))
L_VAL=0
for L_TMP in ${L_PARAM}
do
eval L_IDX2=\${L_POS_${L_TMP}}
if [ -z "${L_IDX2}" ]
then
L_ERREUR_MSG[4]="<lib:fct_params> L option ${L_TMP} declaree dans la liste d inclusion de l option ${L_OPT_NOM[${L_IDX}]} est inconnu"
L_ERREUR=4
else
L_VAL=$(( 2 ** ${L_IDX2} + ${L_VAL} ))
fi
done
L_PARAM=`echo ${L_PARAM}|sed 's/ /,/g'`
L_OPTINCLUDE[${L_IDX}]="${L_PARAM}:${L_VAL}"
fi
(( L_IDX++ ))
done
# -- Analyse des options et argument sousmis au script
# -- -------------------------------------------------
# -- Si une erreur a ete detecte dans les declaration ont ne fait pas l analyse
if (( ! ${L_ERREUR} ))
then
# -- Aucune option sousmise ?
# -- si oui, on verifie l existance d option obligatoire puis on sort...
if [ ${#} -eq 0 -a ${#L_OPT_OBLIGATOIRE} -gt 0 ]
then
L_ERREUR_MSG[5]="Au moins une des options suivante est requise : `echo ${L_OPT_OBLIGATOIRE}|sed 's/:[0-9]*//g'`"
L_ERREUR=5
fi
# -- Pas d erreur detecte dans la declarartion des options. On peut continuer ...
while [ ${#} -gt 0 ]
do
# -- Des options ont ete utilisees ...
# -- Lecture de la ligne de commande
if [ ${1:0:1} = "-" ]
then
# -- Nous sommes en presence d une option
# -- L option a t elle ete declaree ?
if [ `echo ${L_OPT_NOM[*]}|grep -cw ${1:1}` -eq 0 ]
then
# -- L option n a pas ete declare dans l entete du script
L_OPTINCONNU="${L_OPTINCONNU}${1:1} "
shift
continue
fi
eval L_IDX=\${L_POS_${1:1}}
L_OPTSET=$(( ${L_OPTSET} + 2 ** ${L_IDX} ))
eval SH_OPTION_${L_OPT_NOM[${L_IDX}]}=1
# -- Recuperation des arguments de l option
# -- Nombre d argument pour cette option ?
L_NB_ARG=0
L_NB_MINARG=`echo ${L_OPT_LIGNE[${L_IDX}]}|cut -d: -f4`
if [ `echo ${L_NB_MINARG}|grep -c "/"` -eq 0 ]
then
# -- Seul le nombre max d argument a ete renseigne ( ou pas si L_NB_MINARG est vide )
[ -z "${L_NB_MINARG}" ] && L_NB_MAXARG=-1 || L_NB_MAXARG=$(( ${L_NB_MINARG} - 1 ))
L_NB_MINARG=0
else
# -- le nombre de agument est declare sous la forme "min/max"
L_NB_MAXARG=$(( ${L_NB_MINARG#*/} - 1 ))
# -- Si la forme declare est "nim/" alors L_NB_MAXARG vaut -1
# -- dans ce cas on considere le nombre d argument infini (999999)
(( ! ${L_NB_MAXARG} + 1 )) && L_NB_MAXARG=999999
L_NB_MINARG=${L_NB_MINARG%/*}
fi
# -- Existe t-il une liste de valeurs possible pour les argument de cette option ?
L_OPTARGS_CTL=`echo ${L_OPT_LIGNE[${L_IDX}]}|cut -d: -f8`
# -- Les argument doivent il etre transforme en majuscule ?
[ `echo ${L_OPT_LIGNE[${L_IDX}]}|cut -d: -f1|grep -c "M"` -eq 1 ] && L_OPTMAJ="oui" || L_OPTMAJ="non"
# -- Recuparation du nom de la variable qui va contenir les argument
L_VAR=`echo ${L_OPT_LIGNE[${L_IDX}]}|cut -d: -f3`
[ -z "${L_VAR}" ] && L_VAR="SH_ARG_${L_OPT_NOM[${L_IDX}]}"
# -- Lecture des arguments ...
while [ ${L_NB_ARG} -le ${L_NB_MAXARG} ]
do
[ "${L_OPTMAJ}" = "oui" ] && L_VAL=`echo ${2}|tr a-z A-Z` || L_VAL="$2"
if [ "${L_VAL:0:1}" = "-" -o -z "${L_VAL}" ]
then
# -- Option suivante ou fin de ligne !!
if [ ${L_NB_ARG} -lt ${L_NB_MINARG} ]
then
L_ERREUR_MSG[6]="L option \"${L_OPT_NOM[${L_IDX}]}\" attend ${L_NB_MINARG} argument(s) a minima"
L_ERREUR=6
fi
break
else
# -- Ici on pourrais valider la concordance des types ...
# -- Control de la valeur si une liste de valeurs possible a ete defini pour cette option
if (( ${#L_OPTARGS_CTL} ))
then
# -- Une liste a ete defini, la valeur de l argument courant est-elle presente ?
if (( ! `echo "${L_OPTARGS_CTL}"|grep -cw "${L_VAL}"` ))
then
# -- la valeur n est pas presente dans la liste !!
L_ERREUR_MSG[12]="L argument \"${L_VAL}\" n est pas valide pour l option ${L_OPT_NOM[${L_IDX}]} ( Argument attendu : ${L_OPTARGS_CTL})\n"
L_ERREUR=12
fi
fi
# -- Valorisation de la variable d accueil
if [ ${L_NB_MAXARG} -eq 0 ]
then
# -- Un seul argument est attendu
eval ${L_VAR}=\"${L_VAL}\"
else
# -- Plusieurs arguments sont attendu ... On initialise un tableau
eval ${L_VAR}[${L_NB_ARG}]=\"${L_VAL}\"
fi
shift
fi
((L_NB_ARG++))
done
else
# -- Nous somme en presence d un argument
# -- On verifier que l argument a ete declare
if (( ${#L_PARAM_ARGS} ))
then
# -- Nom de la variable d acceuille des arguments
L_VAR=`echo ${L_PARAM_ARGS}|cut -d: -f2`
[ -z "${L_VAR}" ] && L_VAR="SH_ARGS"
# -- Les argument doivent il etre transforme en majuscule ?
[ `echo ${L_PARAM_ARGS}|cut -d: -f1|grep -c "M"` -eq 1 ] && L_VAL=`echo ${1}|tr a-z A-Z` || L_VAL=$1
# -- la valeur de l argument est-elle presente dans la liste des valeurs possible (si cette liste a ete defini)
if (( ${#L_PARAM_ARGS_CTL} ))
then
if (( ! `echo "${L_PARAM_ARGS_CTL}"|grep -cw "${L_VAL}"` ))
then
# -- la valeur n est pas presente dans la liste !!
L_ERREUR_MSG[12]="L argument \"${L_VAL}\" n est pas valide pour ce script ( Argument attendu : ${L_PARAM_ARGS_CTL})\n"
L_ERREUR=12
fi
fi
# -- Initialisation de la variable d acceuille en fonction de la taille courante du tableau
# -- Taille courante du tableau accueillant les arguments moins l arguments par defaut ( On ecrase l argument positionne par defaut )
eval L_NB_ARG=\$\(\( \${#${L_VAR}[*]} - ${L_PARAM_ARGS_DEF} \)\)
(( ${L_PARAM_ARGS_DEF} )) && (( L_PARAM_ARGS_DEF-- ))
# -- Si pas encore initialise alors la taille est 0
(( ${L_NB_ARG} )) && eval ${L_VAR}[${L_NB_ARG}]=${L_VAL} || eval ${L_VAR}=${L_VAL}
else
# -- Pas de declaration !!
(( ! ${#L_ERREUR_MSG[11]} )) && L_ERREUR_MSG[11]="L argument suivant ete dectecte sans declaration : "
L_ERREUR_MSG[11]="${L_ERREUR_MSG[11]}\"${1}\" "
L_ERREUR=11
fi
fi
shift
done
fi
# -- Controle des options et arguments obligatoires
# -- ----------------------------------------------
if (( ! ${L_ERREUR} ))
then
# -- Option obligatoire ...
for L_TMP in ${L_OPT_OBLIGATOIRE}
do
if [ $(( ${L_OPTSET} & 2**${L_TMP#*:} )) -eq 0 ]
then
# -- L option obligatoire L_TMP n a pas ete positionnee
# -- On controle que cette option n est pas une exclusion d une option obligatoire positionnee
L_PARAM=`echo ${L_OPT_LIGNE[${L_TMP#*:}]}|cut -d: -f6|sed 's/,/ /g'`
L_VAR=0
if [ -n "${L_PARAM}" ]
then
# -- L option L_TMP pocede une liste d exclusion
for L_IDX2 in ${L_PARAM}
do
eval L_IDX=\${L_POS_${L_IDX2}}
(( !${L_VAR} )) && L_VAR=$(( ${L_OPTSET} & 2**${L_IDX} ))
done
fi
# -- Si L_VAR est null alors l option L_TMP aurais du etre positionnee
if [ ${L_VAR} -eq 0 ]
then
[ -z "${L_ERREUR_MSG[7]}" ] && L_ERREUR_MSG[7]="Les options suivante sont requises : "
L_ERREUR_MSG[7]="${L_ERREUR_MSG[7]}${L_TMP%:*} "
L_ERREUR=7
fi
fi
done
# -- Arguments declare ? ...
if (( ${#L_PARAM_ARGS} ))
then
# -- Nom de la variable d acceuille des arguments
L_VAR=`echo ${L_PARAM_ARGS}|cut -d: -f2`
[ -z "${L_VAR}" ] && L_VAR="SH_ARGS"
# -- Nombre d argument attendu ...
L_NB_MAXARG=`echo ${L_PARAM_ARGS}|cut -d: -f3`
# -- Si le nombres d argument n est pas defini alors par defaut on considere qu il peut etre infini
[ -z "${L_NB_MAXARG}" ] && L_NB_MAXARG=999999
if [ `echo ${L_NB_MAXARG}|grep -c "/"` -eq 0 ]
then
# -- On n a pas trouve le separateur "/" donc pas de minima defini
# -- l argument est il obligatoire ?
L_TMP=`echo ${L_PARAM_ARGS}|cut -d: -f1|grep -c "o"`
(( ${L_TMP} )) && L_NB_MINARG=1 || L_NB_MINARG=0
else
L_NB_MINARG=${L_NB_MAXARG%/*}
L_NB_MAXARG=${L_NB_MAXARG#*/}
# -- Si L_NB_MAXARG n est pas defini alors on considere qu il peut etre infini
[ -z "${L_NB_MAXARG}" ] && L_NB_MAXARG=999999
fi
[ ${L_NB_MAXARG} -lt 1 ] && L_NB_MAXARG=1
# -- Nombre d argument soumis ... ( Taille du tableau d arguments )
eval L_NB_ARG=\${#${L_VAR}[*]}
if [ ${L_NB_ARG} -lt ${L_NB_MINARG} ]
then
L_ERREUR_MSG[13]="Le script ${SH_PROG} attend a minima ${L_NB_MINARG} argument(s)"
L_ERREUR=13
fi
if [ ${L_NB_ARG} -gt ${L_NB_MAXARG} ]
then
L_ERREUR_MSG[14]="Trop d argument passe. Le script ${SH_PROG} attend au maximun ${L_NB_MAXARG} argument(s)"
L_ERREUR=14
fi
fi
fi
# -- Controle des exclusion
# -- ----------------------
for L_TMP in ${L_OPTEXCLUDE}
do
if [ $(( ${L_OPTSET} & ${L_TMP#*:} )) -eq ${L_TMP#*:} ]
then
L_ERREUR_MSG[8]="Les options ${L_TMP%:*} sont mutuellement exclusive"
L_ERREUR=8
(( L_ERREUR_NB++ ))
fi
done
# -- Controle des inclusion
# -- ----------------------
if [ $(( ${L_OPTSET} & ${L_OPTINC} )) -ne 0 ]
then
# -- Une option exigeant une inclusion a ete positionne
L_IDX=0
while [ ${L_IDX} -le ${#L_OPT_NOM[*]} ]
do
if [ $(( (2 ** ${L_IDX}) & ${L_OPTSET} & ${L_OPTINC} )) -ne 0 ]
then
# -- L option L_IDX a ete positionne est pocedent une liste d inclusion
if [ $(( ${L_OPTSET} & ${L_OPTINCLUDE[${L_IDX}]#*:} )) -ne ${L_OPTINCLUDE[${L_IDX}]#*:} ]
then
L_ERREUR_MSG[9]="L option ${L_OPT_NOM[${L_IDX}]} exige l usage de(s) (l) option(s) ${L_OPTINCLUDE[${L_IDX}]%:*}"
L_ERREUR=9
fi
fi
(( L_IDX++ ))
done
fi
# -- Controle des option inconnu
# -- ---------------------------
if [ -n "${L_OPTINCONNU}" ]
then
L_ERREUR_MSG[10]="Option inconnu detectee(s) : ${L_OPTINCONNU}"
L_ERREUR=10
fi
# -- Nettoyage
# -- ---------
# -- Suppression des variables tempon
for L_PARAM in ${L_OPT_NOM[*]}
do
eval unset L_POS_${L_PARAM}
done
# -- Gestion des options par defaut : -h -log -hist -s, -cpt et -dbg
# -- ---------------------------------------------------------------
# -- L option dbg n a pas de traitement particulier elle n apparaitras donc pas ci-dessous.
# -- Creation d un masque binaire pour determiner les options positionnee
L_VAL="${SH_OPTION_h}${SH_OPTION_log}${SH_OPTION_hist}${SH_OPTION_s}${SH_OPTION_cpt}"
if [ ${L_VAL} -ne 0 ]
then
if (( 2#${L_VAL} & 2#00010 )) # -- Comparaison binaire bit a bit vrix si l option -s est positionnee
then
# -- Option s
SH_SILENCE="oui"
fi
# -- Une option gere par defaut a ete positionnee
if (( 2#${L_VAL} & 2#10000 ))
then
# -- Option h : affichage de l aide
fct_usage "${SH_DIR}/${SH_PROG}"
fct_erreur 0
fi
if (( 2#${L_VAL} & 2#01000 ))
then
# -- Option log
# -- Recherche du dernier journal
[ -z "${SH_ARG_LOG}" ] && SH_ARG_LOG=`tail -4 ${SH_FICTRC}|grep "fin"|cut -d: -f6|sed 's/(//;s/)//;s/ *//g'`
L_VAR=`ls ${NC_EXPL_LOG}|grep -c ${SH_ARG_LOG}`
if (( ${L_VAR} ))
then
view ${NC_EXPL_LOG}/*${SH_ARG_LOG}*
else
fct_message -color rouge "Le journal d execution de la session ${SH_ARG_LOG} du script ${SH_PROG} n existe plus"
fi
fct_erreur 0
fi
if (( 2#${L_VAL} & 2#00001 ))
then
# -- Option cpt
# -- Recherche du dernier compte-rendu
[ -z "${SH_ARG_CPT}" ] && SH_ARG_CPT=`tail -4 ${SH_FICTRC}|grep "fin"|cut -d: -f4|sed 's/(//;s/)//;s/ *//g'`
L_VAR=`ls ${NC_EXPL_CPT}|grep -c ${SH_ARG_CPT}`
if (( ${L_VAR} ))
then
view ${NC_EXPL_CPT}/*${SH_ARG_CPT}*
else
fct_message -color rouge "Le compte-rendu de la session ${SH_ARG_CPT} du script ${SH_PROG} n existe plus"
fi
fct_erreur 0
fi
if (( 2#${L_VAL} & 2#00100 ))
then
# -- Option hist
fct_affiche_ligne entete "Historique des ${SH_ARG_HIST} derniere execution du script ${SH_PROG}" "Date,18" "Utilisateur(Origine,20:Exec,20)" "Session,16" "Log,3" "Cpt,3" "Code,5" "Parametre,50"
SH_ARG_HIST=$(( ${SH_ARG_HIST} * 3 ))
tail -${SH_ARG_HIST} ${SH_FICTRC}|grep "Parametre" | while read L_VAL
do
G_TMP=`echo ${L_VAL}|sed 's/ Parametre .*$/:/;s/[^:]//g'` # Pour assurer la compatibilite ascendante
G_TMP=$(( 7 - ${#G_TMP} )) # Nombre de champs 6 ou 8 ?
L_PARAM=`echo ${L_VAL}|cut -d: -f$(( 8 - ${G_TMP} ))-`
(( ${G_TMP} )) && L_UORI='' || L_UORI=`echo ${L_VAL}|cut -d: -f4`
(( ${G_TMP} )) && L_UEXE='' || L_UEXE=`echo ${L_VAL}|cut -d: -f5`
L_IDX=`echo ${L_VAL}|cut -d: -f$(( 6 - ${G_TMP}))|sed 's/(//;s/)//'`
L_IDX2=`echo ${L_VAL}|cut -d: -f$1-3`
L_VAR=`ls ${NC_EXPL_LOG}|grep -c ${L_IDX}`
L_PARMF=`ls ${NC_EXPL_CPT}|grep -c ${L_IDX}`
(( ${L_VAR} )) && L_VAR="X" || L_VAR=""
(( ${L_PARMF} )) && L_PARMF="X" || L_PARMF=""
L_TMP=`grep ${L_IDX} ${SH_FICTRC}|grep "fin"|cut -d- -f2`
# -- Si L_TMP est vide, alors il s agit de la session en cours, on n affiche pas le resultat !
[ -n "${L_TMP}" ] && fct_affiche_ligne "${L_IDX2}" "${L_UORI}" "${L_UEXE}" "${L_IDX}" "${L_VAR}" "${L_PARMF}" "${L_TMP}" "${L_PARAM}"
done
fct_affiche_ligne pied
fct_erreur 0
fct_erreur 0
fi
fi
# -- Sortie
# -- ------
if (( ${L_ERREUR} ))
then
L_IDX=14
while (( ${L_IDX} ))
do
[ -n "${L_ERREUR_MSG[${L_IDX}]}" ] && fct_message -color rouge "${L_ERREUR_MSG[${L_IDX}]}"
(( L_IDX-- ))
done
fct_erreur 254
fi
return 0
}
typeset -Ffx fct_params

109
lib/path.lib Executable file
View File

@@ -0,0 +1,109 @@
##----------------------------------------------------------------------------
## Script : path.lib
## Module Puppet : gnc-script_core_dtsi
## Auteur : Emmanuel Confrere
## Date : 10-02-2016
## Version : 2.0.0
## Objet : Ajout d'un repertoire a une variable avec control d unicite.
##
## Fonction : fctpath
##
## detail : Certaines variables represente une liste de repertoire
## separes par un caractere significatif. C'est le cas pour
## les variables PATH, MANPATH, etc...
## Cette fonction permet la mise a jour de ce type de
## variable sans se poser la question de la redondance
## de l'information ou de l'existance du repertoire.
## L'appel de cette fonction doit etre suivi de quatre
## parametres :
## - 1 : le nom du repertoire a ajouter
## - 2 : le nom de la variable a mettre a jour
## - 3 : le separateur de champs utilise
## - 4 : le parametre "avant" si vous desirez ajouter
## le repertoire en debut de variable
## La variable est automatiquement exportee.
# ----------------------------------------------------------------------------
# Mise a jour :
# 1.0.0 19-08-2001 - Marc GRESSET - Creation
# 1.0.0 10-02-2016 - Emmanuel Confrere - Integration au script du socle DTSI
##---------------------------------------------------------------------------
fctpath () {
local V_PATH_NAME="${1}"
local V_PATH_VAR="${2}"
local V_PATH_SEPAR="${3}"
local V_PATH_WHERE="${4}"
eval V_PATH_CONTENU=\"\$\{"${V_PATH_VAR}"\}\"
#- Suppression des caracteres V_PATH_SEPAR au debut et en fin de ligne
V_PATH_CONTENU=`echo "${V_PATH_CONTENU}"|sed "s#^${V_PATH_SEPAR}##;s#${V_PATH_SEPAR}\\$##"`
if [ -z "${V_PATH_NAME}" ] || [ -z "${V_PATH_VAR}" ] || [ -z "${V_PATH_SEPAR}" ]
then
echo "fct_path : Probleme sur les parametres :"
echo "fct_path : \${V_PATH_NAME} = [ ${V_PATH_NAME} ]"
echo "fct_path : \${V_PATH_VAR} = [ ${V_PATH_VAR} ]"
echo "fct_path : \${V_PATH_SEPAR} = [ ${V_PATH_SEPAR} ]"
return 1
else
case ${V_PATH_SEPAR} in
\.|\,|\;|\:|\!|\~|\@|\#|\%|\^) \
:
;;
*) echo "fct_path : Probleme sur le separateur de champs."
echo "fct_path : \${V_PATH_NAME} = [ ${V_PATH_NAME} ]"
echo "fct_path : \${V_PATH_VAR} = [ ${V_PATH_VAR} ]"
echo "fct_path : \${V_PATH_SEPAR} = [ ${V_PATH_SEPAR} ]"
return 2
;;
esac
fi
# - Suppression du path si existe deja dans la variable
case ${V_PATH_CONTENU} in
*${V_PATH_SEPAR}${V_PATH_NAME}${V_PATH_SEPAR}* ) \
V_PATH_CONTENU=`echo ${V_PATH_CONTENU}|sed "s#${V_PATH_SEPAR}${V_PATH_NAME}${V_PATH_SEPAR}#${V_PATH_SEPAR}#"` ;;
${V_PATH_NAME}${V_PATH_SEPAR}* ) \
V_PATH_CONTENU=`echo ${V_PATH_CONTENU}|sed "s#${V_PATH_NAME}${V_PATH_SEPAR}##"` ;;
*${V_PATH_SEPAR}${V_PATH_NAME} ) \
V_PATH_CONTENU=`echo ${V_PATH_CONTENU}|sed "s#${V_PATH_SEPAR}${V_PATH_NAME}##"` ;;
${V_PATH_NAME} ) V_PATH_CONTENU="" ;;
esac
# - Initialisation de la nouvelle variable
if [ "${V_PATH_WHERE}" != "supp" ]
then
if [ -z "${V_PATH_CONTENU}" ]
then
V_PATH_CONTENU="${V_PATH_NAME}"
elif [ "${V_PATH_WHERE}" = "avant" ]
then
V_PATH_CONTENU=${V_PATH_NAME}${V_PATH_SEPAR}${V_PATH_CONTENU}
else
V_PATH_CONTENU=${V_PATH_CONTENU}${V_PATH_SEPAR}${V_PATH_NAME}
fi
fi
if [ ! -d "${V_PATH_NAME}" ] && [ ! -f "${V_PATH_NAME}" ]
then
#- Le repertoire specifier n existe pas
unset V_PATH_NAME
unset V_PATH_VAR
unset V_PATH_SEPAR
unset V_PATH_WHERE
unset V_PATH_CONTENU
return 2
else
#- Export du nouveau Path
eval ${V_PATH_VAR}=${V_PATH_CONTENU}
eval export ${V_PATH_VAR}
unset V_PATH_NAME
unset V_PATH_VAR
unset V_PATH_SEPAR
unset V_PATH_WHERE
unset V_PATH_CONTENU
fi
}
typeset -Ffx fctpath

97
lib/rotattrace.lib Executable file
View File

@@ -0,0 +1,97 @@
##----------------------------------------------------------------------------
## Script : rotattrace.lib
## Module Puppet : gnc-script_core_dtsi
## Auteur : Emmanuel Confrere
## Date : 12-04-2017
## Version : 2.0.6
## Objet : Rotation du fichier passe en parametre
##
## Fonction : fct_rotation fichier retention
##
## Detail :
##
# ----------------------------------------------------------------------------
# Mise a jour :
# 1.0.0 24-01-2008 - Emmanuel Confrere - Cre : Creation
# 1.0.0 06-06-2008 - Emmanuel Confrere - Ano : Correction des noms de variable
# 1.1.0 06-06-2008 - Emmanuel Confrere - Evo : Ajout recherche fichier
# 2.0.0 10-02-2016 - Emmanuel Confrere - Evo : Integration au socle DTSI
# 2.0.1 09-03-2016 - Pierre Trhin - Ano : Ajout du suivie des liens symbolique
# 2.0.2 04-01-2017 - Emmanuel Confrere - Ano : Limiter la profondeur de la purge au dossier specifier - Cf. Jira : DBA-2372
# Ajout d un control de validite des variables L_FIC2 et L_REP_FIC
# 2.0.3 05-01-2017 - Emmanuel Confrere - Ano : Erreur de syntax dans le control de validite
# 2.0.4 06-04-2017 - Emmanuel Confrere - Ano : Degradation de performance serveur (Cf. DBA-2458)
# 2.0.5 06-04-2017 - Emmanuel Confrere - Ano : Degradation de performance serveur,
# ajout de l option "-delete" dans find a la place de "-exec rm {} \;"
# 2.0.6 12-04-2017 - Emmanuel Confrere - Ano : l expension des nom ne se fait pas dans l instruction rm -f "${L_REP_FIC}/${L_FIC2}*"
# a cause des double-cotes. Du coup les fichiers ne sont pas supprimees.
##----------------------------------------------------------------------------
function fct_rotation
{
# Objet : Tourne les fichier de trace
# Parametre : Nom du fichier, periode de retention en jours
local L_FICHIER=`basename $1` # nom du fichier
local L_FIC2=""
local L_RET=$2 # Retention en jour - Entier positif
local L_SEQ=1
local L_REP_FIC="`dirname $1`" # Chemin absolu vers le fichier
local L_TMP=""
local L_TMP2=""
local L_OSPID=""
# Recuperation du PID du fichier ( uniquement pour les fichiers de trace )
L_OSPID=`echo ${L_FICHIER}|sed 's/.*_\([0-9][0-9]*\)\..*/\1/'`
# Si les chaine L_OSPID et L_FICHIER sont egale , alors le SH_SESSION_ID n as pas ete trouve
[ "${L_OSPID}" = "${L_FICHIER}" ] && L_OSPID=""
# L_OSPID doit etre un chiffre !
[ -z "`echo ${L_OSPID}|sed 's/[0-9][0-9]*//'`" ] || L_OSPID=""
if [ -n "${L_OSPID}" ]
then
# L_OSPID n est pas vide, L_FICHIER est donc un fichier de trace
# Extraction du nom de fichiers sans le numero d identification
L_FIC2=`echo ${L_FICHIER}|sed 's/^\(.*\)_\([0-9][0-9]*_[0-9][0-9]*\)\..*/\1/'`
else
L_FIC2=${L_FICHIER}
fi
# On controle ... de securite
[ "${L_FIC2}" = "*" ] && return 1 # Le fichier a supprimer ne peut pas etre "*"
[ -z "${L_FIC2}" -o -z "${L_REP_FIC}" ] && return 4 # Le nom du fichier et son repertoire doivent etre soumis
[ "${L_REP_FIC:0:1}" != "/" ] && return 2 # Le repertoire est fourni en valuer absolu
L_TMP=`echo ${L_REP_FIC}|cut -d "/" -f2` # Les repertoires suivant sont interdit
L_TMP2=`echo "bin boot sbin cgroup dev lib lib64 misc proc root selinux sys srv usr run"|grep -c "${L_TMP}"`
[ ${L_TMP2} -gt 0 ] && return 3
# fct_rotation du fichier ${L_REP_FIC}/${L_FICHIER}
# Suppression des fichier de trace anterieure a ${L_RET} jours
if [ ${L_RET} -eq 0 ]
then
# Si la retention est null on supprime tous les fichiers
rm -f ${L_REP_FIC}/${L_FIC2}*
else
# Limitation de la profondeur de la purge au dossier specifier (Ne pas prendre en compte les sous-dossier - Cf. Jira : DBA-2372)
# pour eliminer un find on reduit la pronfondeur de recherche L_RET-- (Induit par le fonctionnement de find).
((L_RET--))
find -L ${L_REP_FIC} -maxdepth 1 -name ${L_FIC2}\* -daystart -type f -mtime +${L_RET} -delete;
fi
if [ -z "${L_OSPID}" ]
then
# il s agit d un fichier sans SH_SESSION_ID on effectue donc la rotation des fichiers
# Nombre de fichier residuel...
L_SEQ=`ls ${L_REP_FIC}/${L_FICHIER}* 2>/dev/null|wc -l`
# Rotattion des fichiers
while [ ${L_SEQ} -gt 0 ]
do
L_TMP=$(( ${L_SEQ} - 1 ))
[ -f ${L_REP_FIC}/${L_FICHIER}.${L_TMP} ] && mv ${L_REP_FIC}/${L_FICHIER}.${L_TMP} ${L_REP_FIC}/${L_FICHIER}.${L_SEQ}
((L_SEQ--))
done
[ -f ${L_REP_FIC}/${L_FICHIER} ] && mv ${L_REP_FIC}/${L_FICHIER} ${L_REP_FIC}/${L_FICHIER}.1
fi
}
typeset -Ffx fct_rotation

153
lib/semaphore.lib Executable file
View File

@@ -0,0 +1,153 @@
##----------------------------------------------------------------------------
## Script : semaphore.lib
## Module Puppet : gnc-script_core_dtsi
## Auteur : Emmanuel Confrere
## Date : 16-06-2016
## Version : 3.1.0
## Objet : Gestion de l execution parallel d un shell.
##
## Fonction : fct_unique_exec [nom] [occurences] [mode]
## fct_libere_exec [nom]
##
## [nom] : Mot alphabetique quelconque identifiant la ressource.
## [nom] ne peut pas prendre pour valeur "wait" ou "nowait".
##
## [occurence] : Nombre d execution parallel (Par defaut 1).
##
## [mode] : "wait" (par defaut) ou "nowait".
##
## Rem : Tous les parametres sont facultatif, mais doivent etre presentes dans l'ordre.
##
## Detail : Cette librairie gere les acces concurrent a une portion de code Bash.
## Deux fonctions sont utilisees :
## - fct_unique_exec : Positionne des semaphores et controle la disponibilite.
## - fct_libere_exec : Supprime des semaphores
##
## La fonction fct_unique_exec(), si appelee sans l argument [nom] et/ou [occurences],
## doit etre positionee en debut de script juste apres le chargement du fichier
## ${NC_EXPL_CONF}/init.conf sinon elle peut etre placee a n importe quel endroit dans le code.
##
## Elle positionne une semaphore pour proteger d une execution concurrente.
## Ensuite elle controle la disponibilite de la ressource et selon le [mode] utilise
## "wait ou "nowait", attend sa liberation ou sort immediatement en erreur.
##
## La semaphore est liberee automatiquement par l appel a la fonction fct_erreur(), sauf si [nom] a ete
## utilisee - fct_erreur() appelle la fonction fct_libere_exec() -.
##
## L utilisation avec [nom] implique OBLIGATOIREMENT de liberer la semaphore en appelant
## explicitement fct_libere_exec [nom] dans le script ayant appele fct_unique_exec().
##
## [occurences] fixe le nb d execution concurrente qui peuvent etre executer en parallel
## cette valeur est fixe par defaut avec ${SH_CPT_SEMAPHORE} qui vaut 1 si non
## surcharger par le script.
##
## [mode] fixe le comportement de sortie de la fonction fct_unique_exec().
## Par defaut le mode est fixe a "wait" mais il est possible de demander de ne pas
## attendre et de renvoyer le code erreur 1 en possitionnant la valeur du mode a "nowait".
##
## Les variables SH_FICSEM, SH_PROG et SH_CPT_SEMAPHORE sont initialisees dans le
## fichier ${NC_EXPL_CONF}/init.conf (comme toute les variables SH_*).
## SH_CPT_SEMAPHORE vaut 1 par defaut et peut etre surcharge dans le fichier
## de configuration du script.
# ----------------------------------------------------------------------------
# Mise a jour :
# 1.0.0 - Emmanuel Confrere - Creation
# 1.0.1 - Daniel Frochtmann - Parallelisation de traitement
# 1.0.2 - Emmanuel Confrere - Ajout de commentaire
# 2.0.0 - Emmanuel Confrere - Debug (Ne fonctionnais pas si plus de 2 occurance)
# Refonte complete. On se base maintenant sur une liste de PID
# 2.1.0 - Emmanuel Confrere - Evo : prise en charge du nb d occurences actives
# 3.0.0 10-02-2016 - Emmanuel Confrere - Evo : Integration au socle DTSI
# 3.0.1 17-03-2016 - Emmanuel Confrere - Evo : Ajout d information de debug
# 3.1.0 16-06-2017 - Emmanuel Confrere - Evo : Ajout de l option "mode"
# Attente progressive
# Reformulation de l aide.
##----------------------------------------------------------------------------
function fct_unique_exec()
{
local NOM=$1
local OCCURENCES=$2
local MODE=$3
local PID=$$
local WAITING=2
local ELIGIBLE=0
local ELIGIBILITE=0
local FICSEM=""
# -- Marquage
fct_message -debug 0 "<lib:fct_unique_exec> Nom:${NOM} Occ:${OCCURENCES} mode:${MODE} PID:${PID}"
# -- Fixer le nombre maxi d'occurences actives
[ "${OCCURENCES}" = "nowait" -o "${OCCURENCES}" = "wait" ] && MODE=${OCCURENCES} && OCCURENCES=${SH_CPT_SEMAPHORE} || (( ${OCCURENCES} )) || OCCURENCES=${SH_CPT_SEMAPHORE}
# -- Identification de la ressource
[ "${NOM}" = "nowait" -o "${NOM}" = "wait" ] && MODE=${NOM} && NOM=""
(( ${NOM} )) && OCCURENCES=${NOM} && NOM=""
[ -n "${NOM}" ] && FICSEM=`echo ${SH_FICSEM}|sed "s/\.sem$/_${NOM}\.sem/"` || FICSEM=${SH_FICSEM}
echo "${PID}" >> ${FICSEM}
# -- Fixer le mode d execution
[ "${MODE}" = "nowait" ] && MODE=1 || MODE=0
# -- On controle l occupation de la ressource
# -- Le process est-il eligible pour continuer l execution
# -- 0 : Non
# -- 1 : Oui
ELIGIBLE=`head -${OCCURENCES} ${FICSEM}|grep -cw "${PID}"`
# -- Dans le cas ou le process n est pas eligible mais que le mode est nowait
# -- on ne passera pas dans la boucle d attente et on doit par consequent
# -- enleve le process de la liste d attente.
fct_message -debug 1 "<lib:fct_unique_exec> Stack 1 - Nom:${NOM} Occ~:${OCCURENCES} Mode:${MODE} Eligible:${ELIGIBLE}"
(( ${MODE} & ( ${MODE} ^ ${ELIGIBLE} ) )) && fct_libere_exec "@${NOM}@${PID}"
if (( ! (${MODE} | ${ELIGIBLE}) ))
then
# -- La resource est en cours d utilisation, on attend sa liberation...
fct_message -color cyan "Une ou plusieurs occurrence du script ${SH_PROG} est en cours d execution..."
fct_message -nolog -color cyan " - Nombre d occurance active : ${OCCURENCES}"
fct_message -nolog -color blanc " .\c"
while (( ! ${ELIGIBLE} ))
do
fct_message -nolog -color cyan ".\c"
sleep ${WAITING}
(( WAITING++ ))
ELIGIBLE=`head -${OCCURENCES} ${FICSEM}|grep -cw "${PID}"`
ELIGIBILITE=`grep -cw "${PID}" ${FICSEM}`
(( ! ${ELIGIBILITE} )) && echo "${PID}" >> ${FICSEM}
CPID=`head -1 ${FICSEM}`
[ ! -d /proc/${CPID} ] && fct_libere_exec "@${NOM}@${CPID}"
done
fct_message -nolog -color vert "."
fi
return $(( ${MODE} & ( ${MODE} ^ ${ELIGIBLE} ) ))
}
typeset -Ffx fct_unique_exec
# --------------------------------------------------------------------------------------------------------------
function fct_libere_exec()
{
# Objet : Signaler la fin d execution unique d un script shell
#
# Syntaxe : fct_libere_exec
#
local NOM=$1
local PID=$$
local FICSEM
# -- Marquage
fct_message -debug 0 "<lib:fct_libere_exec> Nom:${NOM} PID:${PID}"
[ "${NOM:0:1}" = "@" ] && PID=${NOM##*@} && NOM=${NOM%@*} && NOM=${NOM#@}
[ -n "${NOM}" ] && FICSEM=`echo ${SH_FICSEM}|sed "s/\.sem$/_${NOM}\.sem/"` || FICSEM=${SH_FICSEM}
if [ -f ${FICSEM} ]
then
cat ${FICSEM}|grep -wv "${PID}" > ${FICSEM}.tmp
mv ${FICSEM}.tmp ${FICSEM}
[ ! -s ${FICSEM} ] && rm ${FICSEM}
fi
}
typeset -Ffx fct_libere_exec

24
lib/usage.lib Executable file
View File

@@ -0,0 +1,24 @@
##----------------------------------------------------------------------------
## Script : usage.lib
## Module Puppet : gnc-script_core_dtsi
## Auteur : Emmanuel Confrere
## Date : 10-02-2016
## Version : 1.0.0
## Objet : affiche l'entete du script passer en parametre commencant par ##
##
## Fonction : fct_usage Nom_Script
##
## Detail :
##
# ----------------------------------------------------------------------------
# Mise a jour :
# 1.0.0 10-02-2016 - Emmanuel Confrere - Creation : Reprise du script du socle Oracle
##----------------------------------------------------------------------------
function fct_usage
{
local L_PROG_NAME=$1
sed -n "/^##/s/^##//p" ${L_PROG_NAME}
}
typeset -Ffx fct_usage

32
lib/what.lib Executable file
View File

@@ -0,0 +1,32 @@
##----------------------------------------------------------------------------
## Script : what.lib
## Module Puppet : gnc-script_core_dtsi
## Auteur : Emmanuel Confrere
## Date : 10-02-2016
## Version : 1.1.0-1
## Objet : Fournie la version et l objet du fichier passe en parametre
##
## Fonction : what Nom_Fichier
##
## Detail :
##
# ----------------------------------------------------------------------------
# Mise a jour :
# 1.0.0-0 24-01-2008 - Emmanuel - Creation
# 1.0.0-1 06-06-2008 - Emmanuel - Correction des noms de variable
# 1.1.0-0 06-06-2008 - Emmanuel - Ajout recherche fichier
# 2.0.0-0 10-02-2016 - Emmanuel Confrere - Integration au socle DTSI
##----------------------------------------------------------------------------
what()
{
local L_FICHIER=`which $1`
if [ -f ${L_FICHIER} ]
then
grep "^## Version" ${L_FICHIER}|sed 's/#* *//'
grep "^## Objet" ${L_FICHIER}|sed 's/#* *//'
fi
}
typeset -fx what