# ------------------------------------------------------------------------------ # Error management functions # This file is part of the init.sh project # Copyright (c) 2019-2021 Geoffray Levasseur # ------------------------------------------------------------------------------ # This file is distributed under 3-clause BSD license. # The complete license agreement can be obtained at: # https://opensource.org/licenses/BSD-3-Clause # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # Exit with error function die() { local errorcode=$1 # Don't trigger the ERR signal as we already managed the error trap - ERR if [[ "$KEEPGOING" != "true" ]] || [[ "$2" == "--force" ]]; then prnt E "Sortie prématuré avec erreur (code #$errorcode)." exit $errorcode else prnt W "On continue malgrés l'erreur #$errorcode." fi # Put the trigger back (only executed with --keepgoing) trap "error ${LINENO}" ERR } export -f die # ------------------------------------------------------------------------------ # Function trigered on Ctrl+C pressed or external kill affecting us function terminate() { prnt E "$1 reçu, sortie immédiate." die 128 --force } trap "terminate 'Ctrl + C'" SIGINT trap "terminate 'SIGTERM'" SIGTERM # ------------------------------------------------------------------------------ # Function triggered on error function error() { 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" 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}; backtrace; exit 255" ERR # ------------------------------------------------------------------------------ # Print a backtrace function backtrace { 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 "==============================" } # ------------------------------------------------------------------------------ # Execute command outside of error control, echoes ouput error code noerror() { set +o errexit trap - ERR $@ local code=$? trap "error ${LINENO}" ERR set -o errexit echo $code } # ------------------------------------------------------------------------------ # Test and exit if not root (or any UID 0 user) check_root() { if [[ $NO_ROOT_CHECK == true ]]; then return 0 fi if [[ $EUID -ne 0 ]]; then prnt E "Ce script doit être démarré en tant que root. Arrêt." die 4 --force fi } # EOF