diff --git a/lib/ulib/multiconf b/lib/ulib/multiconf new file mode 100644 index 0000000..c7446e2 --- /dev/null +++ b/lib/ulib/multiconf @@ -0,0 +1,77 @@ +##@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 + +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[@]}" + + 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 + # Les variables sont initialisées à zéro ou à la valeur spécifiée, e.g + # 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. + : +}