diff --git a/init.sh b/init.sh index b74fa40..cf7e8b9 100755 --- a/init.sh +++ b/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 diff --git a/lib/aaa_errors.sh b/lib/aaa_errors.sh index 492a48a..2500d51 100644 --- a/lib/aaa_errors.sh +++ b/lib/aaa_errors.sh @@ -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>>":""),$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() diff --git a/lib/support.sh b/lib/support.sh index b085945..7cef9aa 100644 --- a/lib/support.sh +++ b/lib/support.sh @@ -4,35 +4,42 @@ disp_help() { cat << EOF Utilisation : init.sh [OPTIONS] [-m|--module ] + Initialise une machine pour l'intégrer à un réseau. Options : -m, --module 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 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. diff --git a/lib/zzz_main_fct.sh b/lib/zzz_main_fct.sh index 96add56..8c6a0fe 100644 --- a/lib/zzz_main_fct.sh +++ b/lib/zzz_main_fct.sh @@ -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