From acc03d0b06fc4951bcc6cb24a8241a89c52805f6 Mon Sep 17 00:00:00 2001 From: Jephte CLAIN Date: Fri, 24 Oct 2014 00:34:53 +0400 Subject: [PATCH] support des variables dans les templates --- apacheconfig | 191 +++++++++++++----- lib/ulib/template | 118 ++++++++--- ...acheconfig.txt => README-apacheconfig.txt} | 0 .../apacheconfig/certsconf/default-certs.conf | 8 +- .../templates/apacheconfig/sites/default.conf | 6 +- .../apacheconfig/sites/default.ssl.conf | 6 +- .../templates/apacheconfig/workers.properties | 4 +- runsconfig | 6 +- 8 files changed, 242 insertions(+), 97 deletions(-) rename lib/ulib/templates/apacheconfig/{apacheconfig.txt => README-apacheconfig.txt} (100%) diff --git a/apacheconfig b/apacheconfig index a3ce44c..9af1ec1 100755 --- a/apacheconfig +++ b/apacheconfig @@ -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 diff --git a/lib/ulib/template b/lib/ulib/template index 7bce0ea..cf9b640 100644 --- a/lib/ulib/template +++ b/lib/ulib/template @@ -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 diff --git a/lib/ulib/templates/apacheconfig/apacheconfig.txt b/lib/ulib/templates/apacheconfig/README-apacheconfig.txt similarity index 100% rename from lib/ulib/templates/apacheconfig/apacheconfig.txt rename to lib/ulib/templates/apacheconfig/README-apacheconfig.txt diff --git a/lib/ulib/templates/apacheconfig/certsconf/default-certs.conf b/lib/ulib/templates/apacheconfig/certsconf/default-certs.conf index 47c7996..1074ed9 100644 --- a/lib/ulib/templates/apacheconfig/certsconf/default-certs.conf +++ b/lib/ulib/templates/apacheconfig/certsconf/default-certs.conf @@ -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@@ diff --git a/lib/ulib/templates/apacheconfig/sites/default.conf b/lib/ulib/templates/apacheconfig/sites/default.conf index c838243..0fc5304 100644 --- a/lib/ulib/templates/apacheconfig/sites/default.conf +++ b/lib/ulib/templates/apacheconfig/sites/default.conf @@ -1,9 +1,9 @@ # -*- coding: utf-8 mode: conf -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 - 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 diff --git a/lib/ulib/templates/apacheconfig/sites/default.ssl.conf b/lib/ulib/templates/apacheconfig/sites/default.ssl.conf index 52ce4f1..75729a9 100644 --- a/lib/ulib/templates/apacheconfig/sites/default.ssl.conf +++ b/lib/ulib/templates/apacheconfig/sites/default.ssl.conf @@ -2,9 +2,9 @@ - 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 diff --git a/lib/ulib/templates/apacheconfig/workers.properties b/lib/ulib/templates/apacheconfig/workers.properties index 191e372..6c18ed2 100644 --- a/lib/ulib/templates/apacheconfig/workers.properties +++ b/lib/ulib/templates/apacheconfig/workers.properties @@ -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 diff --git a/runsconfig b/runsconfig index 0acd63e..952374a 100755 --- a/runsconfig +++ b/runsconfig @@ -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 "$@"