reworked error management, added --logfile option, reworked command line analysing
This commit is contained in:
13
init.sh
13
init.sh
@@ -9,7 +9,7 @@ set -o pipefail
|
||||
set -o errtrace
|
||||
|
||||
# set -e : exit the script if any statement returns a non-true return value
|
||||
set -o errexit
|
||||
#set -o errexit
|
||||
|
||||
# set +u : allow undeclared variables
|
||||
set +o nounset
|
||||
@@ -19,7 +19,7 @@ export LC_ALL=C
|
||||
export LANG=C
|
||||
|
||||
# Version of init
|
||||
export VERSION="0.95.2"
|
||||
export VERSION="0.95.4"
|
||||
|
||||
# Store script's path
|
||||
export MYPATH=$(dirname $0)
|
||||
@@ -59,7 +59,7 @@ export KEEPGOING=false
|
||||
export RESUME=false
|
||||
export STAGE_FILE="$MYPATH/stage"
|
||||
|
||||
read_commandline
|
||||
read_commandline $@
|
||||
|
||||
# After this we need to be root
|
||||
# (--help and --version are allowed as unprivileged user)
|
||||
@@ -67,7 +67,11 @@ check_root
|
||||
|
||||
# Logfile variable treatment -- cannot be a function
|
||||
|
||||
export LOGFILE=${LOGFILE:-"$MYPATH/log/init-$(uname -n)-$(stdtime).log"}
|
||||
if [[ -n $NEW_LOGFILE ]]; then
|
||||
export LOGFILE=$NEW_LOGFILE
|
||||
else
|
||||
export LOGFILE=${LOGFILE:-"$MYPATH/log/init-$(uname -n)-$(stdtime).log"}
|
||||
fi
|
||||
|
||||
prnt I "Création du répertoire d'accueil du fichier log..."
|
||||
[[ ! -d $(dirname $LOGFILE) ]] && mkdir -pv $(dirname $LOGFILE)
|
||||
@@ -78,6 +82,7 @@ trap 'exec 2>&4 1>&3' 0 1 2 3
|
||||
exec > >(tee -a $LOGFILE)
|
||||
exec 2> >(tee -a $LOGFILE >&2)
|
||||
prnt I "Démarrage d'init version $VERSION."
|
||||
prnt I "Le fichier de log est $LOGFILE."
|
||||
|
||||
# -- Cannot be a function ends here
|
||||
|
||||
|
||||
@@ -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"
|
||||
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
|
||||
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()
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -2,9 +2,11 @@
|
||||
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
|
||||
@@ -15,7 +17,7 @@ read_commandline()
|
||||
exit 0
|
||||
;;
|
||||
"-m"|"--module")
|
||||
want_module=true
|
||||
local want_module=true
|
||||
;;
|
||||
"-c"|"--check-only")
|
||||
export CHECK_ONLY=true
|
||||
@@ -38,24 +40,45 @@ read_commandline()
|
||||
"-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 [[ $want_module == true ]]; then
|
||||
[[ $want_logfile == true ]] && synthax_error
|
||||
if [[ ! $MANUAL_MODULE_LIST ]]; then
|
||||
MANUAL_MODULE_LIST=$opt
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user