Intégration de la branche update-config

This commit is contained in:
Jephté Clain 2017-09-24 14:07:29 +04:00
commit eeef48dfe1
1 changed files with 86 additions and 10 deletions

View File

@ -9,7 +9,7 @@ function conf_local() {
# par les fonctions conf_* # par les fonctions conf_*
# cela permet d'utiliser ces fonctions à l'intérieur d'autres fonctions sans # cela permet d'utiliser ces fonctions à l'intérieur d'autres fonctions sans
# polluer l'espace de nom # polluer l'espace de nom
echo "local -a __CONF_ARRAY_VARS __CONF_PATH_VARS" echo "local -a __CONF_DESCS __CONF_ARRAY_VARS __CONF_PATH_VARS"
} }
function conf_auto() { function conf_auto() {
@ -46,7 +46,9 @@ function conf_auto() {
function conf_init() { function conf_init() {
# définir les variables attendues lors du chargement des fichiers de # définir les variables attendues lors du chargement des fichiers de
# configuration par conf_load_files # configuration par conf_load_files()
# Si cette fonction n'a pas d'argument, le contenu du tableau CONFIG s'il
# est existe est utilisé
# par défaut, les variables sont en mode scalaire: la définition d'une # 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 # 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. # en mode tableau: les nouvelles valeurs sont rajoutées à la fin du tableau.
@ -61,28 +63,70 @@ function conf_init() {
# conf_init VAR=value MYPATH=a:b:c # conf_init VAR=value MYPATH=a:b:c
# Les variables tableaux sont toujours initialisées à la valeur vide # Les variables tableaux sont toujours initialisées à la valeur vide
# L'option -s permet de revenir au mode scalaire # L'option -s permet de revenir au mode scalaire
# Note: il est possible d'associer une description à chaque variable ainsi
# qu'un en-tête, ce qui permet de construire le fichier de configuration ou
# de mettre à jour un fichier existant avec conf_upgrade(). Par exemple, les
# commandes suivantes:
# CONFIG=(
# "# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8"
# "# configurer l'application"
# -s
# "NAME=payet//nom de l'administrateur"
# "MAIL=admin@host.tld//mail de contact"
# -a
# "HOSTS//hôtes autorisés à se connecter"
# )
# conf_init
# permettent de générer automatiquement le fichier de configuration suivant:
# # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# # configurer l'application
#
# # nom de l'administrateur
# #NAME=payet
#
# # mail de contact
# #MAIL=admin@host.tld
#
# # hôtes autorisés à se connecter
# #HOSTS=()
__CONF_DESCS=()
__CONF_ARRAY_VARS=() __CONF_ARRAY_VARS=()
__CONF_PATH_VARS=() __CONF_PATH_VARS=()
local __var __type=scalar local __type=scalar __initial=1 __prefix __var __desc
[ $# -eq 0 ] && is_array CONFIG && set -- "${CONFIG[@]}"
while [ $# -gt 0 ]; do while [ $# -gt 0 ]; do
if [ -n "$__initial" ]; then
if [ "${1:0:1}" == "#" ]; then
[ ${#__prefix} -gt 0 ] && __prefix="$__prefix"$'\n'
__prefix="$__prefix$1"
shift
continue
else
[ -n "$__prefix" ] && array_add __CONF_DESCS "$__prefix"
__initial=
fi
fi
case "$1" in case "$1" in
-a|--array) __type=array;; -a|--array) __type=array;;
-p|--path) __type=path;; -p|--path) __type=path;;
-s|--scalar) __type=scalar;; -s|--scalar) __type=scalar;;
*) *)
array_add __CONF_DESCS "$1"
splitfsep "$1" // __var __desc
case "$__type" in case "$__type" in
array) array)
eval "${1%%=*}=()" eval "${__var%%=*}=()"
array_addu __CONF_ARRAY_VARS "${1%%=*}" array_addu __CONF_ARRAY_VARS "${__var%%=*}"
array_del __CONF_PATH_VARS "${1%%=*}" array_del __CONF_PATH_VARS "${__var%%=*}"
;; ;;
path) path)
setv "$1" setv "$__var"
array_addu __CONF_PATH_VARS "${1%%=*}" array_addu __CONF_PATH_VARS "${__var%%=*}"
array_del __CONF_ARRAY_VARS "${1%%=*}" array_del __CONF_ARRAY_VARS "${__var%%=*}"
;; ;;
scalar) scalar)
setv "$1" setv "$__var"
;; ;;
esac esac
;; ;;
@ -223,3 +267,35 @@ function conf_install() {
done done
done done
} }
function conf_upgrade() {
# USAGE: conf_upgrade DEST VARS...
# Si les variables VARS... sont spécifiées, on appelle au préalable conf_init()
local dest="$1"; shift
if [ $# -gt 0 ]; then
eval "$(conf_local)"
conf_init "$@"
fi
local desc namevalue name value
# calculer le préfixe et initialiser le fichier le cas échéant
if [ ! -f "$dest" ]; then
local prefix
for desc in "${__CONF_DESCS[@]}"; do
[ "${desc:0:1}" == "#" ] && echo "$desc" >"$dest"
break
done
>>"$dest"
fi
# vérifier la présence de chaque variable
for desc in "${__CONF_DESCS[@]}"; do
[ "${desc:0:1}" == "#" ] && continue
splitfsep "$desc" // namevalue desc
splitvar "$namevalue" name value
if ! grep -qE "^\s*#*(\s*export)?\s*$name=" "$dest"; then
echo >>"$dest"
[ -n "$desc" ] && echo "# $desc" >>"$dest"
echo -n "#" >>"$dest"
echo_setv "$name" "$value" >>"$dest"
fi
done
}