initial commit
This commit is contained in:
169
lib/affiche-ligne.lib
Executable file
169
lib/affiche-ligne.lib
Executable 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
121
lib/erreur.lib
Executable 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
266
lib/esql.lib
Executable 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
69
lib/format-ligne.lib
Executable 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
47
lib/gen-mdp.lib
Executable 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
153
lib/message.lib
Executable 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
580
lib/params.lib
Executable 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
109
lib/path.lib
Executable 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
97
lib/rotattrace.lib
Executable 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
153
lib/semaphore.lib
Executable 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
24
lib/usage.lib
Executable 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
32
lib/what.lib
Executable 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
|
||||
Reference in New Issue
Block a user