ajout de gconf_addline()

This commit is contained in:
Jephté Clain 2014-01-13 18:14:02 +04:00
parent a362dd3d72
commit d359e613b4
2 changed files with 123 additions and 13 deletions

View File

@ -1 +1 @@
16
17

134
ulib/conf
View File

@ -6,7 +6,7 @@ uprovide conf
urequire base
################################################################################
# Gestion des fichiers de configuratio où les directives sont de la forme
# Gestion des fichiers de configuration où les directives sont de la forme
# 'name=value' et où les commentaires débutent par '#'. C'est typiquement le cas
# des scripts de profile du shell
@ -342,7 +342,7 @@ function mconf_enable() {
# convient pas pour les directives dont le nom peut apparaitre plusieurs
# fois dans le fichier
# Retourner 0 si une modification a été faite dans le fichier, 1 sinon
# Cette fonction nécessite gawk
# Cette fonction nécessite gawk et ignore la locale
local conf="$1"; shift
local section="$1"; shift
[ -n "$*" ] || return 1
@ -415,10 +415,10 @@ END {
exit modified
}"
ac_set_tmpfile tmpfile
local tmpfile; ac_set_tmpfile tmpfile
local mode="$(fix_mode "$conf")"
local modified=1
if <"$conf" >"$tmpfile" awk "$script"; then
if <"$conf" >"$tmpfile" cawk "$script"; then
cat "$tmpfile" >"$conf"
modified=0
fi
@ -437,7 +437,7 @@ function mconf_disable() {
# noms sont recherchées et commentées. Si la directive ne figure pas dans le
# fichier, c'est un NOP.
# Retourner 0 si une modification a été faite dans le fichier, 1 sinon
# Cette fonction nécessite gawk
# Cette fonction nécessite gawk et ignore la locale
local conf="$1"; shift
local section="$1"; shift
[ -n "$*" ] || return 1
@ -473,10 +473,10 @@ END {
}
'
ac_set_tmpfile tmpfile
local tmpfile; ac_set_tmpfile tmpfile
local mode="$(fix_mode "$conf")"
local modified=1
if <"$conf" >"$tmpfile" awk "$script"; then
if <"$conf" >"$tmpfile" cawk "$script"; then
cat "$tmpfile" >"$conf"
modified=0
fi
@ -493,7 +493,7 @@ function mconf_append() {
# Une ligne '$name = $value' est ajoutée à la fin de la section, qui est
# créée si nécessaire à la fin du fichier de configuration
# Retourner 0 si une modification a été faite dans le fichier, 1 sinon
# Cette fonction nécessite gawk
# Cette fonction nécessite gawk et ignore la locale
local conf="$1"; shift
local section="$1"; shift
[ -n "$*" ] || return 1
@ -542,10 +542,10 @@ END {
exit modified
}'
ac_set_tmpfile tmpfile
local tmpfile; ac_set_tmpfile tmpfile
local mode="$(fix_mode "$conf")"
local modified=1
if <"$conf" >"$tmpfile" awk "$script"; then
if <"$conf" >"$tmpfile" cawk "$script"; then
cat "$tmpfile" >"$conf"
modified=0
fi
@ -562,7 +562,7 @@ function mconf_check() {
# configuration, et doit être de la forme name[=value]
# Si une valeur est spécifiée, vérifier que le fichier contient la valeur
# correspondante. Sinon, tester uniquement la présence de la directive.
# Cette fonction nécessite gawk
# Cette fonction nécessite gawk et ignore la locale
local conf="$1"; shift
local section="$1"; shift
[ -n "$*" ] || return 1
@ -607,5 +607,115 @@ END {
}
exit 0
}"
<"$conf" awk "$script"
<"$conf" cawk "$script"
}
################################################################################
# Gestion de fichiers de configuration générique
function gconf_addline() {
# USAGE
# gconf_addline configfile -a BEGIN -z END NEWLINE
# Dans le fichier de configuration $1, ajouter la ligne NEWLINE entre les lignes
# BEGIN et END.
# -a BEGIN
# Spécifier une expression pour matcher une ligne de type BEGIN. Les
# lignes sont matchées dans l'ordre, i.e. avec '-a 1 -a 2', il faut
# d'abord trouver la ligne 1 puis la ligne 2, sinon, le test n'est pas
# concluant.
# -t LINE
# Si après avoir matché toutes les lignes BEGIN, la ligne LINE est
# rencontrée, alors considérer que la ligne à rajouter existe déjà et
# qu'il ne faut pas la rajouter de nouveau
# -r LINE
# Si après avoir matché toutes les lignes BEGIN, la ligne LINE est
# rencontrée, alors considérer que la ligne à rajouter existe et qu'il
# faut la mettre à jour. Supprimer la ligne existante et la remplacer
# par la nouvelle ligne.
# -z END
# Spécifier une expression pour la matcher la ligne de type END. Dès que
# cette ligne est rencontrée, et si aucun des tests -t ou -r n'est
# concluant, alors ajouter la nouvelle ligne avant celle-ci
# Cette fonction nécessite gawk et ignore la locale
eval "$(utools_local)"
local -a beginlines newlines
local testline replaceline endline
parse_opts "${PRETTYOPTS[@]}" \
-a:,--begin: beginlines \
-t:,--test: testline= \
-r:,--replace: replaceline= \
-z:,--end: endline= \
@ args -- "$@" && set -- "${args[@]}" || {
eerror "$args"
return 1
}
conf="$1"; shift
[ -n "$conf" ] || {
eerror "Vous devez spécifier le fichier à modifier"
return 1
}
[ -f "$conf" ] || {
eerror "$conf: fichier introuvable"
return 1
}
[ $# -gt 0 ] || {
eerror "Vous devez spécifier la ligne à rajouter"
return 1
}
newlines=("$@")
# générer le script
local script="$(awkdef -f beginlines[@] testline="$testline" replaceline="$replaceline" endline="$endline" newlines[@])"'
BEGIN {
searchindex = 1
found = 0
writeline = 1
}
function writelines_maybe() {
if (writeline) {
for (i = 1; i <= newlines_count; i++) {
print newlines[i]
}
writeline = 0
}
}
!found && searchindex <= length(beginlines) && $0 ~ beginlines[searchindex] {
searchindex++
if (searchindex > length(beginlines)) {
found = 1
}
print; next
}
found && testline != "" && $0 ~ testline {
writeline = 0
print; next
}
found && replaceline != "" && $0 ~ replaceline {
writelines_maybe()
next
}
found && endline != "" && $0 ~ endline {
writelines_maybe()
searchindex = 1
found = 0
writeline = 1
print; next
}
{ print }
'
#edebug "$script"
# traiter le fichier
local tmpfile; ac_set_tmpfile tmpfile
local mode="$(fix_mode "$conf")"
local modified=1
if <"$conf" >"$tmpfile" cawk "$script"; then
cat "$tmpfile" >"$conf"
modified=0
fi
unfix_mode "$conf" "$mode"
ac_clean "$tmpfile"
return $modified
}