reworked error management, added --logfile option, reworked command line analysing

This commit is contained in:
fatalerrors
2021-07-20 20:59:38 +02:00
parent 0a4029e60d
commit cf6c327c19
4 changed files with 100 additions and 86 deletions

View File

@@ -30,55 +30,37 @@ trap "terminate 'SIGTERM'" SIGTERM
function error()
{
# Check the call is actually the result of an error
local error_code="$?"
[[ $error_code == 0 ]] && return;
# Local variables
local i=0
local regex=''
local mem=''
local error_file=''
local error_lineno=''
local lineno=$1 && shift
local parent_lineno="$1"
local message="$2"
local code="${3:-1}"
# Print error header
prnt E "${BIWhite}*** ${BIRed}Une erreur fatale est intervenue, \
le script va s'arrêter immédiatement !$DEFAULTCOL"
# Print backtrace
backtrace 2
# Exit the script
die $error_code
prnt E "${BIWhite}*** ${BIRed}Une erreur fatale est intervenue, le script va s'arrêter immédiatement !$DEFAULTCOL"
if [[ -n "$message" ]]; then
prnt E "Erreur ligne $parent_lineno, code d'erreur $code avec le message :"
echo -e "\t\t$message"
else
prnt E "Erreur ligne $(caller), avec le code d'erreur $code."
fi
#awk 'NR>L-4 && NR<L+4 { printf "%-5d%3s%s\n",NR,(NR==L?">>>":""),$0 }' L=$1 $0
}
# Trigger error function on error
trap "error ${LINENO}" ERR
trap "error ${LINENO}; backtrace; exit 255" ERR
# Print a backtrace
function backtrace
{
local _start_from_=0
local params=( "$@" )
if (( "${#params[@]}" >= "1" )); then
_start_from_="$1"
fi
local i=0
local first=false
local last=false
while caller $i > /dev/null; do
if [[ -n "$_start_from_" ]] && (( "$i" + 1 >= "$_start_from_" )); then
if [[ "$first" == false ]]; then
echo "==== Pile d'appel ===="
first=true
fi
caller $i
fi
(( i=i++ ))
echo "======== Pile d'appel ========"
typeset -i i=0
for func in "${FUNCNAME[@]}"
do
printf '%15s() %s:%d\n' \
"$func" "${BASH_SOURCE[$i]}" "${BASH_LINENO[$i]}"
let i++ || true
done
echo "=============================="
}
check_root()

View File

@@ -4,35 +4,42 @@ disp_help()
{
cat << EOF
Utilisation : init.sh [OPTIONS] [-m|--module <module1,...,moduleN>]
Initialise une machine pour l'intégrer à un réseau.
Options :
-m, --module <liste> Lance les modules indiqués même s'il ne sont pas
dans les fichiers de configuration.
-c, --check-only Lance les procédure de vérification préexecution
sans rien modifier.
-j, --jump Saute les procédures de vérification.
-k, --keep-going L'execution continura en cas d'erreur.
-r, --resume Reprend l'execution la ou elle c'est arrêté.
dans les fichiers de configuration. Les noms des
modules doivent être séparés par des virgules.
-c, --check-only Lance les procédures de vérification sans rien
modifier.
-j, --jump Saute les procédures de vérification des
modules.
-k, --keep-going Continue l'execution en cas d'erreur.
-r, --resume Reprend l'execution là ou elle s'est arrêté.
-R, --no-root-check Ne pas vérifier les droits root (ou UID 0)
-h, --help Affiche ce texte d'aide.
-v, --version Show version of that script and version of all
available modules.
-l, --logfile <nom> Nom du fichier de log. Peut aussi être changé
via la variable d'environnement LOGFILE.
-v, --version Affiche la version de ce script et celles de
tous les modules disponibles.
Attention : les options courtes ne sont pas concaténable.
Variable d'environnement :
LOGFILE Stocke le nom complet du fichier de log qui sera
utilisé.
produit.
Fichiers de configuration :
Le fichier de configuration principal fournira les détails nécessaire
Le fichier de configuration principal fournira les détails nécessaires
au déploiement de la nouvelle machine. Il doit se situer dans le
répertoire conf/ à coté du script init.sh. Si un fichier appelé
"hostname.sh" (ou hostname est le nom d'hote) existe il sera le fichier
de configuration principal. Dans le cas contraire, le nom générique
"init.conf.sh" sera recherché. En l'absence de fichier de configuration
ce script ne pourra pas fonctionner.
"hostname.sh" existe (ou hostname est le nom d'hote), alors il sera le
fichier de configuration principal. Dans le cas contraire, le nom
générique "init.conf.sh" sera recherché.
En l'absence de fichier de configuration ce script ne pourra pas
fonctionner.
Veuiller consulter les fichiers de configuration fournis en exemple
pour avoir un aperçu des paramêtres disponibles.

View File

@@ -2,30 +2,32 @@
read_commandline()
{
# Processing command line options
want_module=false
local want_module=false
local want_logfile=false
for opt in $@; do
if [[ $want_module == false ]]; then
if [[ $want_module != true ]] && [[ $want_logfile != true ]]; then
case $opt in
"-h"|"--help")
disp_help
exit 0
;;
;;
"-v"|"--version")
show_version
exit 0
;;
;;
"-m"|"--module")
want_module=true
;;
local want_module=true
;;
"-c"|"--check-only")
export CHECK_ONLY=true
;;
;;
"-j"|"--jump")
export JUMP=true
;;
;;
"-k"|"--keep-going")
export KEEPGOING=true
;;
;;
"-r"|"--resume")
if [[ -s $STAGE_FILE ]]; then
export RESUME=true
@@ -34,28 +36,49 @@ read_commandline()
prnt E "Sans ce fichier, la reprise n'est pas possible."
die 1 --force
fi
;;
;;
"-R"|"--no-root-check")
export NO_ROOT_CHECK=true
;;
;;
"-l"|"--logfile")
local want_logfile=true
;;
*)
prnt E "Paramètre \'$opt\' non géré."
disp_help
exit 1
;;
prnt E "Paramètre \"$opt\" non géré."
die 1 --force
;;
esac
else
if [[ ! $MANUAL_MODULE_LIST ]]; then
MANUAL_MODULE_LIST=$opt
want_module=false
else
prnt E "Une liste de module à déjà été fournie !"
prnt E "La ligne de commande ne tolère qu'un paramètre --module."
die 1 --force
if [[ $want_module == true ]]; then
[[ $want_logfile == true ]] && synthax_error
if [[ ! $MANUAL_MODULE_LIST ]]; then
export MANUAL_MODULE_LIST=$opt
want_module=false
else
prnt E "Une liste de module à déjà été fournie !"
prnt E "La ligne de commande ne tolère qu'un paramètre --module."
die 1 --force
fi
elif [[ $want_logfile == true ]]; then
[[ $want_module == true ]] && synthax_error
if [[ ! $NEW_LOGFILE ]]; then
export NEW_LOGFILE=$opt
want_logfile=false
else
prnt E "Il n'est pas possible de spécifier plusieurs fichiers de log."
die 1 --force
fi
fi
fi
done
# If those var are true at that point, something is wrong
if [[ $want_logfile == true ]] || [[ $want_module == true ]]; then
prnt E "Erreur de syntaxe dans la ligne de commande."
die 1
fi
}
export -f read_commandline
load_configuration()
{
@@ -73,14 +96,10 @@ load_configuration()
fi
fi
}
export -f load_configuration
process_commandline_and_vars()
{
if [[ $want_module == true ]]; then
prnt E "La liste des modules à exécuter est manquante !"
die 1 --force
fi
# Check unconsistant parameters
if [[ $CHECK_ONLY == true ]]; then
[[ $JUMP == true ]] && (
@@ -120,3 +139,4 @@ process_commandline_and_vars()
die 5
fi
}
export -f process_commandline_and_vars