support des variables dans les templates

This commit is contained in:
Jephte CLAIN 2014-10-24 00:34:53 +04:00
parent 04b92d148f
commit acc03d0b06
8 changed files with 242 additions and 97 deletions

View File

@ -29,6 +29,15 @@ répertoire de référence appelé répertoire local, avant son déploiement.
-g, --diff
Afficher les différences entre les templates et les fichiers du
répertoire local.
--list-vars
Afficher la valeur par défaut des variables prédéfinies
--write-vars
Forcer l'écriture des valeurs actuelles des variables dans le fichier
.apacheconfig, ce qui permet d'éviter de les spécifier à chaque fois
avec l'option -v
-v, --var NAME=VALUE
Spécifier la valeur d'une variable. Il est possible de spécifier des
valeurs qui ne sont pas dans la liste prédéfinie.
Le répertoire local peut contenir les fichiers et répertoires suivants, qui sont
tous optionnels:
@ -68,7 +77,7 @@ tous optionnels:
Les options suivantes permettent de déployer les fichiers du répertoire local.
IMPORTANT: les fonctions de déploiement ne sont pour le moment supportées que
sur debian
-u, --update
-u, --update, --deploy
Mettre à jour la configuration système à partir du répertoire local.
-r, --certsdir CERTSDIR
Spécifier le cas échéant le répertoire contenant les certificats à
@ -125,87 +134,161 @@ function parent_apacheconfig() {
done
}
update=
certsdir=
confdir=
modulesdir=
sitesdir=
cgibindir=
wwwdir=
certsconfdir=
rrdir=
restart=1
setx host=myhost
setx hostname=myhostname
aliases="$hostname"
admin=supervision-gdrsi@listes.univ-reunion.fr
certsdir=renater
caname=terena.crt
certname=
keyname=
TEMPLATE_VARS=(
host hostname aliases admin
certsdir caname certname keyname
)
function update_template_var() {
# mettre à jour la valeur d'une variable en tenant compte de certaines
# dépendances. par exemple, si on modifie host, il faut mettre à jour
# hostname.
local __orig_value="${!1}"
array_addu TEMPLATE_VARS "$1"
setv "$1" "$2"
local __update_aliases
case "$1" in
host)
[ "$aliases" == "$hostname" ] && __update_aliases=1
hostname="${host%%.*}"
[ -n "$__update_aliases" ] && aliases="$hostname"
;;
esac
[ "$2" != "$__orig_value" ]
}
__vars=()
__list_vars=
__write_vars=
__deploy=
__certsdir=
__confdir=
__modulesdir=
__sitesdir=
__cgibindir=
__wwwdir=
__certsconfdir=
__rrdir=
__restart=1
__TEMPLATECTL_SUPPLOPTS=(
-u,--update update=1
-r:,--certsdir: certsdir=
--confdir: confdir=
--modulesdir: modulesdir=
--sitesdir: sitesdir=
--cgibindir: cgibindir=
--wwwdir: wwwdir=
--certsconfdir: certsconfdir=
--rrdir: rrdir=
--restart restart=1
--no-restart restart=
-v:,--var: __vars
--list-vars __list_vars=1
--write-vars __write_vars=1
-u,--update,--deploy __deploy=1
-r:,--certsdir: __certsdir=
--confdir: __confdir=
--modulesdir: __modulesdir=
--sitesdir: __sitesdir=
--cgibindir: __cgibindir=
--wwwdir: __wwwdir=
--certsconfdir: __certsconfdir=
--rrdir: __rrdir=
--restart __restart=1
--no-restart __restart=
)
__templatectl_parseopts "$@" && \
set -- "${args[@]}" || die "$args"
# répertoire source
setx srcdir=templatesrc apacheconfig
setx __templatectl_srcdir=templatesrc apacheconfig
# répertoire de référence
autocreate=
if [ -z "$destdir" ]; then
__autocreate=
if [ -z "$__templatectl_destdir" ]; then
if [ -d apacheconfig ]; then
destdir=apacheconfig
elif setx destdir=parent_apacheconfig; then
estepn "Sélection automatique de $(ppath "$destdir")"
__templatectl_destdir=apacheconfig
elif setx __templatectl_destdir=parent_apacheconfig; then
estepn "Sélection automatique de $(ppath "$__templatectl_destdir")"
elif [ -e apacheconfig ]; then
die "Vous devez spécifier le répertoire de référence avec -d"
else
destdir=apacheconfig
autocreate=1
__templatectl_destdir=apacheconfig
__autocreate=1
fi
fi
if [ -z "$update" -a -z "$templatectl_opt" ]; then
# charger les variables
__apacheconfig_vars="$__templatectl_destdir/.apacheconfig"
if [ -f "$__apacheconfig_vars" ]; then
source "$__apacheconfig_vars"
for __var in "${__apacheconfig[@]}"; do
splitvar "$__var" __name __value
update_template_var "$__name" "$__value"
done
fi
# mettre à jour les variables
__modified=
for __var in "${__vars[@]}"; do
splitvar "$__var" __name __value
update_template_var "$__name" "$__value" && __modified=1
done
# enregistrer les valeurs des variables
if [ -n "$__modified" -o "$__write_vars" ]; then
>"$__apacheconfig_vars"
echo "__apacheconfig=(" >>"$__apacheconfig_vars"
for __var in "${TEMPLATE_VARS[@]}"; do
echo_setv "$__var=${!__var}" >>"$__apacheconfig_vars"
done
echo ")" >>"$__apacheconfig_vars"
fi
# afficher les variables
if [ -n "$__list_vars" ]; then
for __var in "${TEMPLATE_VARS[@]}"; do
echo_setv "$__var=${!__var}"
done
fi
# Gérer les templates et fichiers locaux
if [ -z "$templatectl_opt" -a -z "$__list_vars" -a -z "$__write_vars" -a -z "$__deploy" ]; then
templatectl_opt=1
templatectl_auto=1
fi
if [ -n "$templatectl_opt" ]; then
if [ -n "$autocreate" -a ! -d "$destdir" ]; then
estepn "Création automatique de $(ppath "$destdir")"
mkdir -p "$destdir" || die
if [ -n "$__autocreate" -a ! -d "$__templatectl_destdir" ]; then
estepn "Création automatique de $(ppath "$__templatectl_destdir")"
mkdir -p "$__templatectl_destdir" || die
fi
[ -d "$destdir" ] || die "$destdir: répertoire introuvable"
[ -d "$__templatectl_destdir" ] || die "$__templatectl_destdir: répertoire introuvable"
__templatectl_do "$@"
fi
if [ -n "$update" ]; then
# déploiement
if [ -n "$__deploy" ]; then
args=(
-d "$destdir"
-d "$__templatectl_destdir"
-u
${certsdir:+-r "$certsdir"}
${confdir:+--confdir "$confdir"}
${modulesdir:+--modulesdir "$modulesdir"}
${sitesdir:+--sitesdir "$sitesdir"}
${cgibindir:+--cgibindir "$cgibindir"}
${wwwdir:+--wwwdir "$wwwdir"}
${certsconfdir:+--certsconfdir "$certsconfdir"}
${rrdir:+--rrdir "$rrdir"}
${__certsdir:+-r "$__certsdir"}
${__confdir:+--confdir "$__confdir"}
${__modulesdir:+--modulesdir "$__modulesdir"}
${__sitesdir:+--sitesdir "$__sitesdir"}
${__cgibindir:+--cgibindir "$__cgibindir"}
${__wwwdir:+--wwwdir "$__wwwdir"}
${__certsconfdir:+--certsconfdir "$__certsconfdir"}
${__rrdir:+--rrdir "$__rrdir"}
)
run_as_root "${args[@]}"
etitle "Mise à jour du système"
[ -d "$destdir" ] || die "$destdir: répertoire introuvable"
args=("$destdir" "$certsdir"
${confdir:+--confdir "$confdir"}
${modulesdir:+--modulesdir "$modulesdir"}
${sitesdir:+--sitesdir "$sitesdir"}
${cgibindir:+--cgibindir "$cgibindir"}
${wwwdir:+--wwwdir "$wwwdir"}
${certsconfdir:+--certsconfdir "$certsconfdir"}
${rrdir:+--rrdir "$rrdir"}
[ -d "$__templatectl_destdir" ] || die "$__templatectl_destdir: répertoire introuvable"
args=("$__templatectl_destdir" "$__certsdir"
${__confdir:+--confdir "$__confdir"}
${__modulesdir:+--modulesdir "$__modulesdir"}
${__sitesdir:+--sitesdir "$__sitesdir"}
${__cgibindir:+--cgibindir "$__cgibindir"}
${__wwwdir:+--wwwdir "$__wwwdir"}
${__certsconfdir:+--certsconfdir "$__certsconfdir"}
${__rrdir:+--rrdir "$__rrdir"}
)
apache_autoconf "${args[@]}" || die
eend

View File

@ -46,6 +46,48 @@ function __template_plsort() {
# liste des variables qu'il faut remplacer dans les fichiers sources
TEMPLATE_VARS=()
function __template_setup_tmpfile() {
if [ ${#TEMPLATE_VARS[*]} -gt 0 ]; then
# S'il y a des variables à remplacer, préparer un fichier temporaire
ac_set_tmpfile tmpfile
fi
}
function __template_clean_tmpfile() {
if [ ${#TEMPLATE_VARS[*]} -gt 0 ]; then
ac_clean "$tmpfile"
fi
}
function __template_fillvars() {
# Pour chacune des variables VAR de TEMPLATE_VARS, remplacer dans le fichier
# $1 les occurences de @@VAR@@ par la valeur $VAR
# Afficher le chemin vers le fichier temporaire qui contient le fichier
# modifié. Si $2 est spécifié, prendre ce chemin comme fichier temporaire.
# Sinon, créer un nouveau fichier temporaire. Si le fichier ne contient
# aucune occurence de variable, afficher le chemin original $1.
[ ${#TEMPLATE_VARS[*]} -eq 0 ] && { echo "$1"; return; }
# chercher si le fichier contient au moins un des tags de TEMPLATE_VARS
local __var __tag __found
for __var in "${TEMPLATE_VARS[@]}"; do
__tag="@@${__var}@@"
if quietgrep "$__tag" "$1"; then
__found=1
break
fi
done
[ -n "$__found" ] || { echo "$1"; return; }
# construire le script sed pour le remplacement des variables
local __script __first=1
for __var in "${TEMPLATE_VARS[@]}"; do
[ -n "$__first" ] || __script="$__script"$'\n'
__first=
__script="${__script}s/@@${__var}@@/$(qseds "${!__var}")/g"
done
sed "$__script" <"$1" >"$2"
echo "$2"
}
function template_list() {
# Lister les fichiers du répertoire source $1 qui seraient fusionnées avec
@ -67,7 +109,9 @@ function template_list() {
[ -n "$rel2pwd" ] && set -- . || set -- "$destdir"
fi
local spec srcspec src dest list
local tmpfile; __template_setup_tmpfile
local spec srcspec src content dest list
local -a srcfiles
for spec in "$@"; do
setx srcspec=__template_prel_abspath "$spec" "$destdir"
@ -77,13 +121,14 @@ function template_list() {
[ -e "$srcdir$srcspec" ] || continue
array_from_lines srcfiles "$(find "$srcdir$srcspec" -type f)"
for src in "${srcfiles[@]}"; do
setx content=__template_fillvars "$src" "$tmpfile"
dest="$destdir/${src#$srcdir/}"
list=
if [ -L "$dest" ]; then
:
elif [ -f "$dest" ]; then
testsame "$src" "$dest" && list=1
testsame "$content" "$dest" && list=1
else
list=1
fi
@ -96,6 +141,8 @@ function template_list() {
fi
done
done | csort -u
__template_clean_tmpfile
}
function template_merge() {
@ -112,7 +159,9 @@ function template_merge() {
[ $# -gt 0 ] || set -- "$destdir"
local spec srcspec src dest
local tmpfile; __template_setup_tmpfile
local spec srcspec src content dest
local srcfiles
for spec in "$@"; do
setx srcspec=__template_prel_abspath "$spec"
@ -127,25 +176,28 @@ function template_merge() {
s=0
array_from_lines srcfiles "$(find "$srcdir$srcspec" -type f)"
for src in "${srcfiles[@]}"; do
setx content=__template_fillvars "$src" "$tmpfile"
dest="$destdir/${src#$srcdir/}"
if [ -L "$dest" ]; then
edotw 0 "LOCALLY MODIFIED: $(ppath "$dest")"
elif [ -f "$dest" ]; then
if testsame "$src" "$dest"; then
if testsame "$content" "$dest"; then
show_debug && edot 0 "ALREADY COPIED: $(ppath "$dest")"
else
edotw 0 "LOCALLY MODIFIED: $(ppath "$dest")"
fi
else
mkdirof "$dest"
cp "$src" "$dest"; r=$?
cp "$content" "$dest"; r=$?
edot $r "COPY: $(ppath "$dest")"
[ $r -eq 0 ] || s=$r
fi
done
eend $s
done
__template_clean_tmpfile
}
function template_unmerge() {
@ -163,7 +215,9 @@ function template_unmerge() {
[ $# -gt 0 ] || set -- "$destdir"
local spec srcspec src dest
local tmpfile; __template_setup_tmpfile
local spec srcspec src content dest
local srcfiles
for spec in "$@"; do
setx srcspec=__template_prel_abspath "$spec"
@ -178,12 +232,13 @@ function template_unmerge() {
ebegin "$(ppath "$destdir$srcspec")"
array_from_lines files "$(find "$srcdir$srcspec" -type f)"
for src in "${files[@]}"; do
setx content=__template_fillvars "$src" "$tmpfile"
dest="$destdir/${src#$srcdir/}"
if [ -L "$dest" ]; then
edotw 0 "LOCALLY MODIFIED: $(ppath "$dest")"
elif [ -f "$dest" ]; then
if testsame "$src" "$dest"; then
if testsame "$content" "$dest"; then
rm -f "$dest"; r=$?
edot $r "REMOVE: $(ppath "$dest")"
[ $r -eq 0 ] || s=$r
@ -196,6 +251,8 @@ function template_unmerge() {
done
eend $s
done
__template_clean_tmpfile
}
function template_cleandest() {
@ -219,15 +276,20 @@ function template_diff() {
__template_check_destdir "$destdir" || return 1
setx destdir=abspath "$destdir"
local src dest
local tmpfile; __template_setup_tmpfile
local src content dest
local -a srcfiles
array_from_lines srcfiles "$(find "$srcdir" -type f)"
for src in "${srcfiles[@]}"; do
setx content=__template_fillvars "$src" "$tmpfile"
dest="$destdir/${src#$srcdir/}"
if [ -f "$dest" ] && testdiff "$src" "$dest"; then
diff -uwB "$src" "$dest"
if [ -f "$dest" ] && testdiff "$content" "$dest"; then
diff -uwB "$content" "$dest"
fi
done | page_maybe -S
__template_clean_tmpfile
}
function templatesrc() {
@ -246,28 +308,28 @@ __TEMPLATECTL_SUPPLOPTS=()
function __templatectl_parseopts() {
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with __templatectl_display_help' \
-s:,--srcdir: srcdir= \
-d:,--destdir: destdir= \
-l,--list '$list=1; templatectl_opt=1' \
-m,--merge '$merge=1; templatectl_opt=1' \
-z,--unmerge '$unmerge=1; templatectl_opt=1' \
-C,--clean '$clean=1; templatectl_opt=1' \
-g,--diff '$diff=1; templatectl_opt=1' \
-s:,--srcdir: __templatectl_srcdir= \
-d:,--destdir: __templatectl_destdir= \
-l,--list '$__templatectl_list=1; templatectl_opt=1' \
-m,--merge '$__templatectl_merge=1; templatectl_opt=1' \
-z,--unmerge '$__templatectl_unmerge=1; templatectl_opt=1' \
-C,--clean '$__templatectl_clean=1; templatectl_opt=1' \
-g,--diff '$__templatectl_diff=1; templatectl_opt=1' \
"${__TEMPLATECTL_SUPPLOPTS[@]}" \
@ args -- "$@"
}
function __templatectl_do() {
__template_check_srcdir "$srcdir" || return 1
[ -n "$destdir" ] || destdir=.
__template_check_destdir "$destdir" || return 1
[ -n "$templatectl_auto" ] && list=1
__template_check_srcdir "$__templatectl_srcdir" || return 1
[ -n "$__templatectl_destdir" ] || __templatectl_destdir=.
__template_check_destdir "$__templatectl_destdir" || return 1
[ -n "$templatectl_auto" ] && __templatectl_list=1
[ -n "$list" ] && template_list "$srcdir" "$destdir" "$@"
[ -n "$merge" ] && template_merge "$srcdir" "$destdir" "$@"
[ -n "$unmerge" ] && template_unmerge "$srcdir" "$destdir" "$@"
[ -n "$clean" ] && template_cleandest "$destdir" "$@"
[ -n "$diff" ] && template_diff "$srcdir" "$destdir" "$@"
[ -n "$__templatectl_list" ] && template_list "$__templatectl_srcdir" "$__templatectl_destdir" "$@"
[ -n "$__templatectl_merge" ] && template_merge "$__templatectl_srcdir" "$__templatectl_destdir" "$@"
[ -n "$__templatectl_unmerge" ] && template_unmerge "$__templatectl_srcdir" "$__templatectl_destdir" "$@"
[ -n "$__templatectl_clean" ] && template_cleandest "$__templatectl_destdir" "$@"
[ -n "$__templatectl_diff" ] && template_diff "$__templatectl_srcdir" "$__templatectl_destdir" "$@"
return 0
}
@ -275,8 +337,8 @@ function templatectl() {
# fonction de haut niveau qui facilite l'utilisation des fonctions template_*
# définir la fonction override_display_templatectl_help() pour l'affichage de l'aide
local -a args
local list merge unmerge clean diff templatectl_opt templatectl_auto
local destdir
local __templatectl_list __templatectl_merge __templatectl_unmerge __templatectl_clean __templatectl_diff templatectl_opt templatectl_auto
local __templatectl_destdir
__templatectl_parseopts "$@" && set -- "${args[@]}" || { eerror "$args"; return 1; }
[ -z "$templatectl_opt" ] && templatectl_auto=1

View File

@ -2,13 +2,13 @@
# Ce fichier permet de configurer quels certificats du répertoire $certsdir il
# faut installer sur le serveur.
certsdir=renater
certsdir=@@certsdir@@
# Fichier contenant les certificats racines qui valident le certificat à
# installer, ainsi que les certificats qui sont rencontrés dans le dialogue avec
# d'autres serveurs web
ca=terena.crt
ca=@@caname@@
# Certificat et clé privée à installer
cert=host-20130523.pem
key=host-20130523.key
cert=@@certname@@
key=@@keyname@@

View File

@ -1,9 +1,9 @@
# -*- coding: utf-8 mode: conf -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
<VirtualHost *:80>
ServerName host.univ.run
ServerAlias host host1.univ.run host1
ServerAdmin sysrezo@support.univ-reunion.fr
ServerName @@host@@
ServerAlias @@aliases@@
ServerAdmin @@admin@@
DocumentRoot /var/www
<Directory />

View File

@ -2,9 +2,9 @@
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerName host.univ.run
ServerAlias host host1.univ.run host1
ServerAdmin sysrezo@support.univ-reunion.fr
ServerName @@host@@
ServerAlias @@aliases@@
ServerAdmin @@admin@@
DocumentRoot /var/www
<Directory />

View File

@ -1,7 +1,7 @@
worker.list=prod,dev
worker.prod.port=8009
worker.prod.host=host.univ.run
worker.prod.host=@@prod_host@@
worker.prod.type=ajp13
worker.prod.lbfactor=1
worker.prod.connection_pool_timeout=600
@ -9,7 +9,7 @@ worker.prod.socket_keepalive=1
worker.prod.socket_timeout=60
worker.dev.port=8009
worker.dev.host=hostdev.univ.run
worker.dev.host=@@dev_host@@
worker.dev.type=ajp13
worker.dev.lbfactor=1
worker.dev.connection_pool_timeout=600

View File

@ -33,10 +33,10 @@ __templatectl_parseopts "$@" && \
set -- "${args[@]}" || die "$args"
# répertoire source
setx srcdir=templatesrc runsconfig
setx __templatectl_srcdir=templatesrc runsconfig
# répertoire d'hôte
[ -n "$destdir" ] || destdir=.
[ -n "$__templatectl_destdir" ] || __templatectl_destdir=.
[ -n "$templatectl_opt" ] || templatectl_auto=1
[ -d "$destdir" ] || die "$destdir: répertoire introuvable"
[ -d "$__templatectl_destdir" ] || die "$__templatectl_destdir: répertoire introuvable"
__templatectl_do "$@"