implémentation simplifiée avec conf_upgrade()
This commit is contained in:
parent
efc60b36ab
commit
ea45055864
81
TODO.md
81
TODO.md
|
@ -1,84 +1,3 @@
|
||||||
# TODO
|
# TODO
|
||||||
|
|
||||||
Faire des fonctions pour faciliter la gestion de configuration par défaut
|
|
||||||
|
|
||||||
La configuration est décrite dans un tableau nommé CONFIG par défaut
|
|
||||||
~~~
|
|
||||||
CONFIG=(
|
|
||||||
"-*- coding: utf-8 mode: sh -*-"
|
|
||||||
"# description de la variable NAME"
|
|
||||||
NAME=default_value
|
|
||||||
"# description de la variable LONG"
|
|
||||||
"# sur plusieurs lignes"
|
|
||||||
LONG="very long value"
|
|
||||||
)
|
|
||||||
~~~
|
|
||||||
|
|
||||||
* si le premier élément commence par `-*-` alors il contient les informations
|
|
||||||
pour générer la ligne de mode pour le fichier de config s'il faut le créer de
|
|
||||||
toutes pièces.
|
|
||||||
* chaque élément qui commence par `#` est une description de la variable qui
|
|
||||||
suit. plusieurs éléments sont fusionnés le cas échéant.
|
|
||||||
* les éléments de la forme NAME=DEFAULT_VALUE définissent une variable et sa
|
|
||||||
valeur par défaut.
|
|
||||||
|
|
||||||
A partir de ce tableau, la fonction upgrade_config() permet de créer un fichier
|
|
||||||
de config s'il n'existe pas, ou de la mettre à jour avec de nouvelles variables
|
|
||||||
s'il existe. Soit la commande suivante
|
|
||||||
~~~
|
|
||||||
upgrade_config path/to/config.conf CONFIG
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Si le fichier config.conf n'existe pas, il est créé ainsi:
|
|
||||||
~~~
|
|
||||||
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
|
||||||
|
|
||||||
# description de la variable NAME
|
|
||||||
#NAME=default_value
|
|
||||||
|
|
||||||
# description de la variable LONG
|
|
||||||
# sur plusieurs lignes
|
|
||||||
#LONG="very long value"
|
|
||||||
~~~
|
|
||||||
|
|
||||||
Si le fichier config contenait ceci:
|
|
||||||
~~~
|
|
||||||
# -*- coding: utf-8 mode: conf -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
|
||||||
|
|
||||||
# description de la variable LONG
|
|
||||||
LONG="my value"
|
|
||||||
~~~
|
|
||||||
il est transformé en ceci, c'est à dire que la définition manquante de NAME est
|
|
||||||
rajoutée:
|
|
||||||
~~~
|
|
||||||
# -*- coding: utf-8 mode: conf -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
|
||||||
|
|
||||||
# description de la variable LONG
|
|
||||||
LONG="my value"
|
|
||||||
|
|
||||||
# description de la variable NAME
|
|
||||||
#NAME=default_value
|
|
||||||
~~~
|
|
||||||
|
|
||||||
A partir du tableau, la fonction load_config() permet de charger le fichier de
|
|
||||||
config en ne sélectionnant que les variables qui sont mentionnées dans le
|
|
||||||
tableau. Soit le fichier de configuration suivant
|
|
||||||
~~~
|
|
||||||
NAME=value
|
|
||||||
LONG=something
|
|
||||||
ROGUE=data
|
|
||||||
~~~
|
|
||||||
et les commandes suivantes
|
|
||||||
~~~
|
|
||||||
NAME=x
|
|
||||||
LONG=y
|
|
||||||
ROGUE=inchangée
|
|
||||||
load_config path/to/config.conf CONFIG
|
|
||||||
echo "NAME=$NAME, LONG=$LONG, ROGUE=$ROGUE"
|
|
||||||
~~~
|
|
||||||
le résultat est le suivant
|
|
||||||
~~~
|
|
||||||
NAME=value, LONG=something, ROGUE=inchangée
|
|
||||||
~~~
|
|
||||||
|
|
||||||
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary
|
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue