Fonctions bash « maison »

  • Les fonctions error_check et error_check_trappermettent de vérifier le code de sortie des différentes parties d’un script bash.Alors que « error_check » nécessite l’ajout de la ligne « error_check $0 $? $LINENO « $* » « $ERRDEST » » après chaque commande dont on veut vérifier la valeur de retour, « error_check_trap » ne nécessite que l’ajout de « trap ‘error_check_trap <destinataire> $_’ ERR ; set -o errtrace » en début de script.
    L’utilisation de « trap ERR » est bien plus efficace, à mon sens, il est donc conseillé d’utiliser la fonction error_check_trap.
  • Nouveau : Les fonctions ignore_trap et restore_trap sont destinées, comme leurs noms l’indiquent, à ignorer la définition d’un trap, tout en sauvegardant cette définition et en permettant de la restaurer par la suite.
  • La fonction myscp est utile pour copier des fichiers sur des liaisons peu fiables. Elle réessaie plusieurs fois la copie en cas d’échec (les options de scp n’étant pas suffisantes pour gérer ces problèmes)

# Fonction de verification d'erreur lors de l'execution de script, avec envoie de mail si nécessaire
# Copyright (c) 2005-2008 Santeramo Luc (luc.santeramo at yahoo dot com)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
### error_check_trap
# parametres :
# - destination du message d'erreur (nom de fichier ou adresse email)
# - $_ (dernier parametre traité, à défaut d'un $BASH_COMMAND "broken")
#
# utilisation : ajouter "trap 'error_check_trap <destinataire> $_' ERR ; set -o errtrace" en debut de script, apres avoir sourcé ce script
function error_check_trap
{
local RETVAL=$?
local SCRIPTNAME=${BASH_SOURCE[1]}
local LINE=${BASH_LINENO[0]}
local PARAMS=${@:2}
local DEST="$1"
# definition du message d'erreur
ERRMSG="ERREUR : script ${SCRIPTNAME} interrompue a la ligne ${LINE}, code erreur ${RETVAL}"
# test pour connaitre si destinataire est un email ou un fichier
if echo "${DEST}" | grep "@" > /dev/null 2>&1
then
# on doit envoyer un mail
echo "Parametres : ${PARAMS}" | /usr/bin/mail -s "${ERRMSG}" "${DEST}" > /dev/null 2>&1
else
# on ajoute dans un fichier log
DATE=$(date "+%F %X")
echo "${DATE}: ${ERRMSG}, parametres : ${PARAMS}" | tee "${DEST}"
fi
exit ${RETVAL}
}
### error_check
# parametres :
#   1 - nom du script
#   2 - valeur de retour de la commande
#   3 - ligne du script sur laquelle s'est produite l'erreur
#   4 - destination du message d'erreur (nom de fichier ou adresse email)
#   5 - liste des parametres
# utilisation classique (si $ERRDEST est definie) : error_check $0 $? $LINENO "$*" "$ERRDEST"
# il faut placer l'appel de cette fonction après chaque commande
# en cas d'erreur de la commande (retour != 0), le programme s'arrete et précise l'erreur
# par mail ou dans un fichier de log
function error_check
{
local SCRIPTNAME="$1"
local RETVAL="$2"
local LINE="$3"
local PARAMS="$4"
local DEST="$5"
# corrige le num de la ligne
let LINE=$LINE-1;
# en cas d'erreur on traite
if [ $RETVAL -ne "0" ]
then
# definition du message d'erreur
ERRMSG="*** ERREUR sur `hostname`: Execution du script $SCRIPTNAME interrompue a la ligne $LINE, code erreur $RETVAL"
# test pour connaitre si destinataire est un email ou un fichier
echo "$DEST" | grep "@" > /dev/null 2>&1
if [ $? -eq "0" ]
then
# on doit envoyer un mail
echo "Parametres : $PARAMS" | /usr/bin/mail -s "$ERRMSG" "$DEST" > /dev/null 2>&1
else
# on ajoute dans un fichier log
echo "`date`" >> "$DEST"
echo "$ERRMSG" >> "$DEST"
echo "Parametres : $PARAMS" >> "$DEST"
echo "Message d'erreur dans le fichier $DEST"
fi
echo "Execution du programme interrompue : $ERRMSG"
exit 255;
fi
}
### ignore_trap
# sauvegarde et ignore la definition d'un trap. s'utilise avant un restore_trap
# parametre :
# - nom du trap (voir liste avec trap -l)
function ignore_trap
{
local TRAPTOIGNORE="$1"
# TODO : test si trap deja ignoree
# probleme avec -z "$(echo $IGNORED_TRAP_${TRAPTOIGNORE})"
TMPFILE=/tmp/trap_sav_$$
trap > ${TMPFILE}
while read line
do
SIG=$(echo $line | egrep -o "([[:upper:]])*$")
CMD=$(echo $line | egrep -o "'(.*)'")
if [ "${SIG}" == "${TRAPTOIGNORE}" ]
then
# sauvegarde du trap
eval IGNORED_TRAP_${SIG}=${CMD}
# suppression du trap
trap ${SIG}
fi
done < ${TMPFILE}
rm ${TMPFILE}
}
### restore_trap
# restaure la definition d'un trap telle qu'elle etait avant l'execution d'ignore_trap
# parametre :
# - nom du trap (voir liste avec trap -l)
function restore_trap
{
# TODO : gestion du trap non ignoree
local TRAPTORESTORE="$1"
trap -- "$(eval echo $IGNORED_TRAP_${TRAPTORESTORE})" ${TRAPTORESTORE}
unset $(echo IGNORED_TRAP_${TRAPTORESTORE})
}
### myscp
# Cette fonction est utile pour copier des fichiers sur des liaisons peu fiables
# parametres : identiques à ceux passés à scp
function myscp {
# Nombre de tentative de copie avant erreur
NB="3"
# Temps d'attente avant chaque tentative
TMPATTENTE="10"
# Options de scp
SCPOPTS="-v -oCompression=yes -oServerAliveInterval=5 -oConnectTimeout=10 -oConnectionAttempts=10 -oBatchMode=yes"
# Binaires
SVN="/usr/bin/svn"
SCP="/usr/bin/scp"
#############################
# verification des parametres
[ "$#" -lt 1 ] && { ${SCP} || return 1; }
PARAMS="$@"
NBTEST="0"
# envoi du fichier
while [ ${NBTEST} -lt ${NB} ]
do
${SCP} ${SCPOPTS} ${PARAMS}
RES=$?
if [ "${RES}" -eq 0 ]
then
NBTEST=$NB
else
let NBTEST=${NBTEST}+1
sleep ${TMPATTENTE}
fi
done
return ${RES}
}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *