2017-09-13 08:13:11 +04:00
|
|
|
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
|
|
|
## Gestion de fichiers de configuration et de répertoires de configuration
|
|
|
|
##@cooked nocomments
|
2017-09-14 08:28:40 +04:00
|
|
|
uprovide multiconf
|
2017-09-13 08:13:11 +04:00
|
|
|
|
|
|
|
function conf_local() {
|
|
|
|
# afficher les commandes pour définir comme locales les variables utilisées
|
|
|
|
# par les fonctions conf_*
|
|
|
|
echo "local -a __CONF_ARRAY_VARS"
|
|
|
|
}
|
|
|
|
|
|
|
|
function conf_auto() {
|
|
|
|
# charger la configuration pour l'outil $1 avec les variables $2..@
|
|
|
|
# conf_init n'est appelé que si des variables sont spécifiées, ce qui permet
|
|
|
|
# d'appeler conf_init au préalable si une configuration spécifique doit être
|
|
|
|
# faite.
|
|
|
|
# Ainsi:
|
|
|
|
# conf_auto NAME VARS...
|
|
|
|
# est équivalent à:
|
|
|
|
# conf_init VARS...
|
|
|
|
# conf_auto NAME
|
|
|
|
# est équivalent à:
|
|
|
|
# conf_init VARS...
|
|
|
|
# conf_resolve __CONF_FILES ~/etc/default/NAME.conf ~/etc/NAME.d/*.conf
|
|
|
|
# conf_load "${__CONF_FILES[@]}"
|
2017-09-14 08:28:40 +04:00
|
|
|
# Pour supporter les scénarii où les fichiers de configuration sont ailleurs
|
|
|
|
# que dans ~/etc/default, l'argument NAME peut être un chemin:
|
|
|
|
# conf_auto PATH/TO/NAME VARS...
|
|
|
|
# est équivalent à:
|
|
|
|
# conf_init VARS...
|
|
|
|
# conf_resolve __CONF_FILES PATH/TO/NAME.conf PATH/TO/NAME.d/*.conf
|
|
|
|
# conf_load "${__CONF_FILES[@]}"
|
2017-09-13 08:13:11 +04:00
|
|
|
|
|
|
|
local __name="$1"; shift
|
|
|
|
[ -n "$__name" ] || return 1
|
|
|
|
[ $# -gt 0 ] && conf_init "$@"
|
|
|
|
local -a __CONF_FILES
|
|
|
|
conf_resolve __CONFS_FILES "$HOME/etc/default/$name.conf" "$HOME/$name.d/*.conf"
|
|
|
|
conf_load "${__CONFS_FILES[@]}"
|
|
|
|
}
|
|
|
|
|
|
|
|
function conf_init() {
|
|
|
|
# définir les variables attendues pour chargement par conf_load
|
|
|
|
# par défaut, les variables sont en mode scalaire: la définition d'une
|
|
|
|
# variable écrase la valeur précédente. Avec l'option -a les variables sont
|
|
|
|
# en mode tableau: les nouvelles valeurs sont rajoutées à la fin du tableau.
|
|
|
|
# dans l'exemple suivant:
|
|
|
|
# conf_init NAME VALUE -a SRCDIRS DESTDIRS
|
|
|
|
# NAME et VALUE sont scalaires alors que SRCDIRS et DESTDIRS sont tableaux
|
2017-09-14 08:28:40 +04:00
|
|
|
# Les variables sont initialisées à la valeur vide ou à la valeur spécifiée:
|
2017-09-13 08:13:11 +04:00
|
|
|
# conf_init VAR=value
|
|
|
|
# L'option -s permet de revenir au mode scalaire
|
|
|
|
__CONF_ARRAY_VARS=()
|
|
|
|
local __var __array
|
|
|
|
while [ $# -gt 0 ]; do
|
|
|
|
case "$1" in
|
|
|
|
-a|--array) __array=1;;
|
|
|
|
-s|--scalar) __array=;;
|
|
|
|
*)
|
|
|
|
setv "$1"
|
|
|
|
[ -n "$__array" ] && array_addu __CONF_ARRAY_VARS "${1%%=*}"
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
function conf_resolve() {
|
|
|
|
# initialiser le tableau $1 avec les fichiers de configuration correspondant
|
|
|
|
# aux arguments $2..@
|
|
|
|
# - si on spécifie un fichier, il est pris tel quel s'il existe
|
|
|
|
# - si on spécifie un répertoire, tous les fichiers *.conf de ce répertoire
|
|
|
|
# sont pris
|
|
|
|
# - si on spécifie un pattern e.g path/to/*.conf alors tous les fichiers
|
|
|
|
# correspondant au pattern sont pris
|
|
|
|
# - sinon l'argument est ignoré
|
|
|
|
:
|
|
|
|
}
|
|
|
|
|
|
|
|
function conf_load() {
|
|
|
|
# sourcer les fichiers spécifiés en faisant ce qui est nécessaire pour que
|
|
|
|
# les variables de __CONF_ARRAY_VARS soient correctement traitées.
|
|
|
|
:
|
|
|
|
}
|