160 lines
6.8 KiB
Bash
160 lines
6.8 KiB
Bash
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
|
## Charger nucore et rendre disponible les modules bash, awk, php et python
|
|
##@cooked nocomments
|
|
# Ce fichier doit être sourcé en premier. Si ce fichier n'est pas sourcé, alors
|
|
# le répertoire nucore doit être disponible dans le répertoire du script qui
|
|
# inclue ce fichier.
|
|
# Une fois ce fichier sourcé, les autres modules peuvent être importés avec
|
|
# require:() e.g.
|
|
# source /etc/nucore.sh || exit 1
|
|
# require: other_modules
|
|
# ou pour une copie locale de nucore:
|
|
# source "$(dirname "$0")/nucore/load.sh" || exit 1
|
|
# require: other_modules
|
|
|
|
# vérifier version minimum de bash
|
|
if [ "x$BASH" = "x" ]; then
|
|
echo "ERROR: nucore: this script requires bash"
|
|
exit 1
|
|
fi
|
|
|
|
function eerror() { echo "ERROR: $*" 1>&2; }
|
|
function die() { [ $# -gt 0 ] && eerror "$*"; exit 1; }
|
|
function edie() { [ $# -gt 0 ] && eerror "$*"; return 1; }
|
|
function delpath() { local _qdir="${1//\//\\/}"; eval "export ${2:-PATH}; ${2:-PATH}"'="${'"${2:-PATH}"'#$1:}"; '"${2:-PATH}"'="${'"${2:-PATH}"'%:$1}"; '"${2:-PATH}"'="${'"${2:-PATH}"'//:$_qdir:/:}"; [ "$'"${2:-PATH}"'" == "$1" ] && '"${2:-PATH}"'='; }
|
|
function addpath() { local _qdir="${1//\//\\/}"; eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="${'"${2:-PATH}"':+$'"${2:-PATH}"':}$1"'; }
|
|
function inspathm() { local _qdir="${1//\//\\/}"; eval "export ${2:-PATH}; "'[ "${'"${2:-PATH}"'#$1:}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'%:$1}" == "$'"${2:-PATH}"'" -a "${'"${2:-PATH}"'//:$_qdir:/:}" == "$'"${2:-PATH}"'" -a "$'"${2:-PATH}"'" != "$1" ] && '"${2:-PATH}"'="$1${'"${2:-PATH}"':+:$'"${2:-PATH}"'}"'; }
|
|
function inspath() { delpath "$@"; inspathm "$@"; }
|
|
|
|
if [ ${BASH_VERSINFO[0]} -ge 5 -o \( ${BASH_VERSINFO[0]} -eq 4 -a ${BASH_VERSINFO[1]} -ge 1 \) ]; then :
|
|
elif [ -n "$NUCORE_IGNORE_BASH_VERSION" ]; then :
|
|
else die "nucore: bash 4.1+ is required"
|
|
fi
|
|
|
|
# Calculer emplacement de nucore
|
|
NUCOREDIR="@@dest@@"
|
|
if [ "$NUCOREDIR" = "@@""dest""@@" ]; then
|
|
# La valeur "@@"dest"@@" n'est remplacée que dans la copie de ce script
|
|
# faite dans /etc. Sinon, il faut toujours faire le calcul. Cela permet de
|
|
# déplacer la librairie n'importe où sur le disque, ce qui est
|
|
# particulièrement intéressant quand on fait du déploiement.
|
|
NUCOREDIR="${BASH_SOURCE[0]}"
|
|
if [ -f "$NUCOREDIR" -a "$(basename -- "$NUCOREDIR")" == load.sh ]; then
|
|
# Fichier sourcé depuis nucore/
|
|
NUCORE_SOURCED=1
|
|
NUCOREDIR="$(dirname -- "$NUCOREDIR")"
|
|
elif [ -f "$NUCOREDIR" -a "$(basename -- "$NUCOREDIR")" == nucore.sh ]; then
|
|
# Fichier sourcé depuis nucore/bash/src
|
|
NUCORE_SOURCED=1
|
|
NUCOREDIR="$(dirname -- "$NUCOREDIR")/../.."
|
|
else
|
|
# Fichier non sourcé. Tout exprimer par rapport au script courant
|
|
NUCORE_SOURCED=
|
|
NUCOREDIR="$(dirname -- "$0")"
|
|
if [ -d "$NUCOREDIR/nucore" ]; then
|
|
NUCOREDIR="$NUCOREDIR/nucore"
|
|
elif [ -d "$NUCOREDIR/lib/nucore" ]; then
|
|
NUCOREDIR="$NUCOREDIR/lib/nucore"
|
|
fi
|
|
fi
|
|
elif [ "${BASH_SOURCE[0]}" = /etc/nucore.sh ]; then
|
|
# Fichier chargé depuis /etc/nucore.sh
|
|
NUCORE_SOURCED=1
|
|
fi
|
|
NUCOREDIR="$(cd "$NUCOREDIR" 2>/dev/null; pwd)"
|
|
NUCOREDIRS=("$NUCOREDIR/bash/src")
|
|
|
|
# marqueur pour vérifier que nucore a réellement été chargé. il faut avoir $NUCOREINIT == $NUCOREDIR
|
|
# utilisé par le module base qui doit pouvoir être inclus indépendamment
|
|
NUCOREINIT="$NUCOREDIR"
|
|
|
|
## Modules bash
|
|
NUCORE_LOADED_MODULES=(nucore)
|
|
NUCORE_DEFAULT_MODULES=(base pretty sysinfos)
|
|
|
|
# Si cette variable est non vide, require: recharge toujours le module, même
|
|
# s'il a déjà été chargé. Cette valeur n'est pas transitive: il faut toujours
|
|
# recharger explicitement tous les modules désirés
|
|
NUCORE_FORCE_RELOAD=
|
|
|
|
function nucore__define_functions() {
|
|
function nucore_check_loaded() {
|
|
local module
|
|
for module in "${NUCORE_LOADED_MODULES[@]}"; do
|
|
[ "$module" == "$1" ] && return 0
|
|
done
|
|
return 1
|
|
}
|
|
function module:() {
|
|
NUCORE_MODULE="$1"
|
|
if ! nucore_check_loaded "$1"; then
|
|
NUCORE_LOADED_MODULES+=("$1")
|
|
fi
|
|
}
|
|
function function:() {
|
|
:
|
|
}
|
|
}
|
|
|
|
function nucore__require:() {
|
|
local nr__module nr__nucoredir nr__found
|
|
[ $# -gt 0 ] || set DEFAULTS
|
|
|
|
# sauvegarder valeurs globales
|
|
local nr__orig_module="$NUCORE_MODULE"
|
|
NUCORE_MODULE=
|
|
|
|
# garder une copie de la valeur originale et casser la transitivité
|
|
local nr__force_reload="$NUCORE_FORCE_RELOAD"
|
|
local NUCORE_FORCE_RELOAD
|
|
|
|
for nr__module in "$@"; do
|
|
nr__found=
|
|
for nr__nucoredir in "${NUCOREDIRS[@]}"; do
|
|
if [ -f "$nr__nucoredir/$nr__module.sh" ]; then
|
|
nr__found=1
|
|
if [ -n "$nr__force_reload" ] || ! nucore_check_loaded "$nr__module"; then
|
|
NUCORE_LOADED_MODULES+=("$nr__module")
|
|
source "$nr__nucoredir/$nr__module.sh" || die
|
|
fi
|
|
break
|
|
fi
|
|
done
|
|
if [ -z "$nr__found" -a "$nr__module" == DEFAULTS ]; then
|
|
for nr__module in "${NUCORE_DEFAULT_MODULES[@]}"; do
|
|
if [ -f "$nr__nucoredir/$nr__module.sh" ]; then
|
|
nr__found=1
|
|
if [ -n "$nr__force_reload" ] || ! nucore_check_loaded "$nr__module"; then
|
|
NUCORE_LOADED_MODULES+=("$nr__module")
|
|
source "$nr__nucoredir/$nr__module.sh" || die
|
|
fi
|
|
else
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
[ -n "$nr__found" ] || die "nucore: unable to find module $nr__module in (${NUCOREDIRS[*]})"
|
|
done
|
|
|
|
# restaurer valeurs globales
|
|
NUCORE_MODULE="$nr__orig_module"
|
|
}
|
|
|
|
function require:() {
|
|
[ -z "$NUCORE_NO_DISABLE_SET_X" ] && [[ $- == *x* ]] && { set +x; local NUCORE_REQUIRE_SET_X=1; }; if [ -n "$NUCORE_REQUIRE_SET_X" ]; then [ -n "$NUCORE_REQUIRE_SET_X_RL1" ] || local NUCORE_REQUIRE_SET_X_RL1; local NUCORE_REQUIRE_SET_X_RL2=$RANDOM; [ -n "$NUCORE_REQUIRE_SET_X_RL1" ] || NUCORE_REQUIRE_SET_X_RL1=$NUCORE_REQUIRE_SET_X_RL2; fi # désactiver set -x de manière réentrante
|
|
nucore__define_functions
|
|
nucore__require: "$@"
|
|
[ -n "$NUCORE_REQUIRE_SET_X" -a "$NUCORE_REQUIRE_SET_X_RL1" == "$NUCORE_REQUIRE_SET_X_RL2" ] && set -x
|
|
return 0
|
|
}
|
|
|
|
## Autres modules
|
|
[ -d "$NUCOREDIR/awk/src" ] && inspath "$NUCOREDIR/awk/src" AWKPATH; export AWKPATH
|
|
[ -d "$NUCOREDIR/python3/src" ] && inspath "$NUCOREDIR/python3/src" PYTHONPATH; export PYTHONPATH
|
|
|
|
## Auto import DEFAULTS
|
|
nucore__define_functions
|
|
if [ -n "$NUCORE_SOURCED" -a -z "$NUCORE_NO_IMPORT_DEFAULTS" ]; then
|
|
require: DEFAULTS
|
|
fi
|