diff --git a/apacheconfig b/apacheconfig index 37ce7cf..0e5622a 100755 --- a/apacheconfig +++ b/apacheconfig @@ -4,383 +4,199 @@ source "$(dirname "$0")/lib/ulib/ulib" || exit 1 urequire DEFAULTS template apache.tools function display_help() { - uecho "$scriptname: Gérer une configuration apache pour déploiement + uecho "$scriptname: Gérer la configuration d'un serveur web apache USAGE - $scriptname [options] + $scriptname -c + $scriptname -t -- args... OPTIONS + -c, --create + Créer un nouveau répertoire de configuration pour un hôte + -d, --destdir DESTDIR[=$TEMPLATECTL_NAME] + Nom du répertoire local de configuration. + + -t, --template [OPT] + Gérer les fichiers du répertoire local avec templatectl. La valeur de + cette option est utilisée comme argument court pour l'invocation de + templatectl, e.g + $scriptname -tm args + est équivalent à + templatectl -m args + Les arguments qui restent sont passés tels quels à templatectl + Les options courantes de templatectl -l, -v, -m, -L sont disponibles + directement --help-template - Afficher toutes les options qui concernent la gestion des templates - --help-files - Afficher une description des fichiers qui peuvent se trouver dans le - répertoire local - --help-deploy - Afficher l'aide sur les options avancées pour le déploiement + Afficher l'aide concernent la gestion des templates. + Equivalent à -t -- --help + -h, --host HOST + Spécifier l'hôte. Equivalent à -v host=HOST + --sysname SYSNAME + --sysdist SYSDIST + -s, --sysver SYSVER + Spécifier la distribution pour laquelle synchroniser le template. Par + défaut, choisir les valeurs correspondantes au système courant. + Les options -7 et -8 sont des aliases respectivement pour -s wheezy et + -s jessie, parce que les fichiers par défaut ont changé à partir de + debian jessie. -Les options suivantes servent à mettre à jour la configuration apache dans un -répertoire de référence appelé répertoire local, avant son déploiement. - -d, --destdir DESTDIR - Spécifier le répertoire local dans lequel copier la configuration - apache. - -l, --list - Lister les templates disponibles. - -m, --merge - Copier les templates spécifiés dans le répertoire local s'il n'y - existent pas déjà. Les templates ayant l'extension '.template' doivent - être demandés explicitement. Sinon, ils sont ignorés. - -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, --deploy Mettre à jour la configuration système à partir du répertoire local. - Lors du déploiement de la configuration, les valeurs de variables + Lors du déploiement de la configuration, les valeurs des variables dynamiques sont remplacées dans les fichiers destination. + Les arguments qui restent sont passés tels quels à apache_autoconf -r, --certsdir CERTSDIR Spécifier le cas échéant le répertoire contenant les certificats à déployer." } -function __templatectl_display_help() { display_help; } -function display_template_help() { - uecho "\ -Les options suivantes servent à mettre à jour la configuration apache dans un -répertoire de référence appelé répertoire local, avant son déploiement. --d, --destdir DESTDIR - Spécifier le répertoire local dans lequel copier la configuration apache. --l, --list - Lister les templates disponibles. --m, --merge - Copier les templates spécifiés dans le répertoire local s'il n'y existent - pas déjà. Les templates ayant l'extension '.template' doivent être demandés - explicitement. Sinon, ils sont ignorés. --z, --unmerge - Supprimer les fichiers du répertoire local s'ils n'ont pas été modifiés par - rapport aux templates. --C, --clean - Supprimer les répertoires vides dans le répertoire local. Peut être utile - après -z --g, --diff - Afficher les différences entre les templates et les fichiers du répertoire - local. ---list-vars - Afficher pour information les valeurs par défaut des variables de template. ---write-vars - Ecrire dans le fichier .apacheconfig les valeurs par défaut des variables, - ce qui permet après édition du fichier d'éviter de les spécifier à chaque - fois avec l'option -v - Le fichier n'est pas écrasé s'il existe déjà. --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. Par défaut, c'est une variable de - template, utilisée pour mettre à jour la copie locale d'un template avec - l'option --merge - Dans le fichier .apacheconfig, les valeurs des variables de template n'est - pas censée changer. Lors de la copie des templates avec --merge, chaque - occurence de @@VAR@@ dans un template est remplacée dans la copie locale par - la valeur de la variable de template VAR - Les variables dynamiques sont remplacées lors du déploiement du fichier avec - l'option --update" +TEMPLATE_STATIC_VARS=() +TEMPLATE_DYNAMIC_VARS=( + host hostname aliases + ips ips_default_namevirtualhost ips_namevirtualhosts ips_listens + admin certsdir caname certname keyname configdir) +TEMPLATE_NOWRITE_VARS=(hostname aliases configdir) + +__TEMPLATE_DEFAULTF_host=__template_defaultf_host +__TEMPLATE_UPDATEF_host=__template_updatef_host +function __template_defaultf_host() { + myhost } -function display_files_help() { - uecho "\ -Le répertoire local peut contenir les fichiers et répertoires suivants, qui sont -tous optionnels: - -- modules.conf la liste des modules qu'il faut activer. Si un module n'existe - pas dans ce fichier, ou si ce fichier n'existe pas, aucune modification n'est - effectuée. Si un module est de la forme -module, il est désactivé. Si un - module est de la forme +module, il est activé. Cette syntaxe permet de - supporter les modules dont le nom commencerait par '-' -- sites.conf la liste des sites qu'il faut activer. Si un site ne figure pas - dans ce fichier, il est désactivé. Si ce fichier n'existe pas, tous les sites - existant sont activés. -- tous les autres fichiers sont copiés tels quels dans /etc/apache2. Notamment, - apache2.conf est le fichier de configuration principal d'apache et ports.conf - le fichier de configuration des ports d'écoute. -- modules/ le répertoire des configurations de modules à installer. Les fichiers - de ce répertoire sont de la forme MODULE.conf et sont installés dans le - répertoire /etc/apache2/mods-available. Il faut mentioner le module dans le - fichier modules.conf pour l'activer. -- sites/ le répertoire des sites à installer. Les fichiers de ce répertoire sont - de la forme NAME.conf pour les sites écoutant en clair, et NAME.ssl.conf pour - les sites écoutant en https. Pour chaque site NAME.ssl.conf, un fichier - NAME-certs.conf doit exister dans certsconf/ - Dans les fichiers NAME.ssl.conf, les valeurs @@cert@@, @@key@@ et @@ca@@ sont - respectivement remplacées par l'emplacement des fichiers de certificats - définis dans les fichiers correspondants NAME-certs.conf -- cgi-bin/ le répertoire des scripts cgi à installer -- www/ le répertoire qui contient les fichiers du serveur web à installer dans - l'emplacement par défaut. -- certsconf/ le répertoire qui contient la configuration pour les certificats à - installer. Si ce répertoire existe, il faut spécifier CERTSDIR - Les fichiers de ce répertoire sont de la forme NAME-certs.conf et chacun d'eux - correspondant en principe à un fichier NAME.ssl.conf dans sites/ -- RewriteRules/ le répertoire qui contient la configuration de réécriture. Tous - les fichiers RewriteRules*.conf de ce répertoire sont copiés dans /etc/apache2" -} -function display_deploy_help() { - uecho "\ -Les options suivantes sont des options avancées pour le déploiment des fichiers: - ---confdir CONFDIR - Spécifier l'emplacement des fichiers de configuration apache ainsi que les - fichiers 'modules.conf' et 'sites.conf'. Par défaut, prendre le répertoire - local. ---modulesdir MODULESDIR - Spécifier l'emplacement des fichiers de configuration des modules. Par - défaut, utiliser DESTDIR/modules si ce répertoire existe. ---sitesdir SITESDIR - Spécifier l'emplacement des fichiers de configuration des sites. Par défaut, - utiliser DESTDIR/sites si ce répertoire existe. ---cgibindir CGIBINDIR - Spécifier l'emplacement des scripts cgi à installer. Par défaut, utiliser - DESTDIR/cgi-bin si ce répertoire existe. ---wwwdir WWWDIR - Spécifier l'emplacement des fichiers du serveur web. Par défaut, utiliser - DESTDIR/www si ce répertoire existe. ---certsconfdir CERTSCONFDIR - Spécifier l'emplacement des fichiers de configuration des certificats. Par - défaut, utiliser DESTDIR/certsconf si ce répertoire existe. Il faut alors - spécifier aussi CERTSDIR, l'emplacement des certificats à installer. ---rrdir RRDIR - Spécifier l'emplacement des fichiers de réécriture. Par défaut, utiliser - DESTDIR/RewriteRules si ce répertoire existe. ---no-restart - Ne pas redémarrer apache en cas de modification de la configuration" +function __template_updatef_host() { + local update_aliases + [ "$aliases" == "$hostname" ] && update_aliases=1 + __template_set_var hostname "${host%%.*}" + [ -n "$update_aliases" ] && __template_set_var aliases "$hostname" + [ -n "$ips" ] || __template_set_var ips "" } -# Valeurs par défaut des variables de template -DEFAULT_TEMPLATE_VARS=( - hostname= aliases= # mettre ces variables AVANT host - host= +__TEMPLATE_DEFAULTF_ips=__template_defaultf_ips +__TEMPLATE_UPDATEF_ips=__template_updatef_ips +function __template_defaultf_ips() { + local -a ips + resolv_ips ips "$host" + echo "${ips[*]}" +} +function __template_updatef_ips() { + local -a ipports; local ipport ip port + local dnvh nvhs ls + nvhs= + ls= + array_split ipports "$ips" " " + for ipport in "${ipports[@]}"; do + splitpair "$ipport" ip port + [ -n "$port" ] || port=443 + [ -n "$dnvh" ] || dnvh="#ips_default_namevirtualhost +NameVirtualHost *:80" + [ -n "$nvhs" ] || nvhs="#ips_namevirtualhosts" + [ -n "$ls" ] || ls="#ips_listens" + + nvhs="$nvhs +NameVirtualHost $ip:$port" + ls="$ls +Listen $ip:$port" + done + [ -n "$dnvh" ] && __template_set_var ips_default_namevirtualhost "$dnvh" + [ -n "$nvhs" ] && __template_set_var ips_namevirtualhosts "$nvhs" + [ -n "$ls" ] && __template_set_var ips_listens "$ls" +} + +TEMPLATECTL_NAME=apacheconfig +TEMPLATECTL_SRCDIRS=(apacheconfig) +TEMPLATECTL_CONFIG=".$TEMPLATECTL_NAME" +TEMPLATECTL_DEFAULTS=( admin=supervision-gdrsi@listes.univ-reunion.fr certsdir=renater - caname=terena.crt - certname= - keyname= - #configdir= # défini ci-dessous ) +TEMPLATECTL_VARS=() -function parent_apacheconfig() { - # chercher à partir du répertoire courant si un des répertoires parents - # s'appelle apacheconfig - local dir="$(pwd)" dirname - - while true; do - setx dirname=basename -- "$dir" - if [ "$dir" == / ]; then - # s'arrêter à la racine - return 1 - elif [ "$dir" == "$HOME" ]; then - # s'arrêter au répertoire HOME - return 1 - elif [ "$dirname" == apacheconfig ]; then - echo "$dir" - return 0 - elif [ "$dirname" == .apacheconfig ]; then - echo "$dir" - return 0 - fi - setx dir=dirname -- "$dir" - done -} - -TEMPLATE_VARS=() -DYNAMIC_VARS=() -function update_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_contains DYNAMIC_VARS "$1" || array_addu TEMPLATE_VARS "$1" - - # Valeurs par défaut - case "$1" in - host) [ -n "$2" ] || set -- "$1" "$(myhost)";; - esac - - # Mettre à jour la variable - setv "$1" "$2" - - # Mettre à jour des variables dépendantes - local __update_aliases - case "$1" in - host) - # attention à ne pas créer de boucle infinies :-) - [ "$aliases" == "$hostname" ] && __update_aliases=1 - update_var hostname "${host%%.*}" - [ -n "$__update_aliases" ] && update_var aliases "$hostname" - ;; - esac - - [ "$2" != "$__orig_value" ] -} - -__vars=() -__list_vars= -__write_vars= -__deploy= -__certsdir= -__confdir= -__modulesdir= -__sitesdir= -__cgibindir= -__wwwdir= -__certsconfdir= -__rrdir= -__restart=1 -__TEMPLATECTL_SUPPLOPTS=( - --help-template '$exit_with display_template_help' - --help-files '$exit_with display_files_help' - --help-deploy '$exit_with display_deploy_help' - -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= +action= +destdir= +templateopt= +certsdir= +args=( + --help '$exit_with display_help' + -c,--create action=create + -d:,--destdir: destdir= + -t::,--template:: '$set@ templateopt; action=template' + --help-template '$templateopt=-help; action=template' + -l,--list '$templateopt=l; action=template' + -v:,--var: TEMPLATECTL_VARS + -m,--merge '$templateopt=m; action=template' + -L,--list-vars '$templateopt=L; action=template' + -h:,--host: '$array_add TEMPLATECTL_VARS host="$value_"' + --sysname: '$array_add TEMPLATECTL_VARS sysname="$value_"' + --sysdist: '$array_add TEMPLATECTL_VARS sysdist="$value_"' + -s:,--sysver: '$array_add TEMPLATECTL_VARS sysver="$value_"' + -6,--squeeze '$array_add TEMPLATECTL_VARS sysver=squeeze' + -7,--wheezy '$array_add TEMPLATECTL_VARS sysver=wheezy' + -8,--jessie '$array_add TEMPLATECTL_VARS sysver=jessie' + -u,--update,--deploy action=deploy + -r:,--certsdir: certsdir= ) -__templatectl_parseopts "$@" && set -- "${args[@]}" || die "$args" +parse_args "$@"; set -- "${args[@]}" -# répertoire de template -setx __templatectl_srcdir=templatesrc apacheconfig +__template_set_destdir destdir autocreate "$TEMPLATECTL_NAME" || die +setx config=templatectl_config "$destdir" +modified= +templatectl_loadvars "$config" && modified=1 -# répertoire local -__autocreate= -if [ -z "$__templatectl_destdir" ]; then - if [ -d apacheconfig ]; then - __templatectl_destdir=apacheconfig - elif [ -d .apacheconfig ]; then - __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 - __templatectl_destdir=apacheconfig - __autocreate=1 +if [ -n "$sysname" -o -n "$sysdist" -o -n "$sysver" ]; then + ensure_sysinfos sysname sysdist sysver +else + sysname="$MYSYSNAME" + sysdist="$MYSYSDIST" + sysver="$MYSYSVER" +fi +__template_set_var sysname "$sysname" +__template_set_var sysdist "$sysdist" +__template_set_var sysver "$sysver" +bits= +if check_sysinfos --vars sysname sysdist sysver bits -d debian -v jessie+; then + array_add TEMPLATECTL_SRCDIRS apacheconfig8 +elif check_sysinfos --vars sysname sysdist sysver bits -d debian; then + array_add TEMPLATECTL_SRCDIRS apacheconfig7 +else + ewarn "$(get_sysinfos_desc sysname sysdist sysver): système non supporté pour le déploiement" +fi + +################################################################################ +if [ "$action" == create ]; then + if [ -n "$autocreate" -a ! -d "$destdir" ]; then + estepn "Création automatique de $(ppath "$destdir")" + mkdir -p "$destdir" || die fi -fi -setx __templatectl_destdir=abspath "$__templatectl_destdir" + [ -d "$destdir" ] || die "$destdir: répertoire introuvable" -# charger les variables. important: la liste des variables définie dans le -# fichier .apacheconfig prend la précédence sur la liste définie par défaut -__template_vars=("${DEFAULT_TEMPLATE_VARS[@]}") -__dynamic_vars=() -__apacheconfig_vars="$__templatectl_destdir/.apacheconfig" -# d'abord charger __template_vars -[ -f "$__apacheconfig_vars" ] && source "$__apacheconfig_vars" -for __var in "${__template_vars[@]}"; do - splitvar "$__var" __name __value - update_var "$__name" "$__value" -done -array_contains TEMPLATE_VARS configdir || update_var configdir "$__templatectl_destdir" -# puis charger __dynamic_vars -[ -f "$__apacheconfig_vars" ] && source "$__apacheconfig_vars" -for __var in "${__dynamic_vars[@]}"; do - splitvar "$__var" __name __value - array_del TEMPLATE_VARS "$__name" - array_addu DYNAMIC_VARS "$__name" - update_var "$__name" "$__value" -done - -# mettre à jour les variables -__modified= -for __var in "${__vars[@]}"; do - splitvar "$__var" __name __value - update_var "$__name" "$__value" && __modified=1 -done - -# enregistrer les valeurs des variables -if [ -n "$__write_vars" ]; then - [ -f "$__apacheconfig_vars" ] && - die "Refus d'écraser le fichier existant $(ppath "$__apacheconfig_vars")" - - echo "# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8" >"$__apacheconfig_vars" - echo "__template_vars=(" >>"$__apacheconfig_vars" - for __var in "${TEMPLATE_VARS[@]}"; do - echo_setv "$__var=${!__var}" >>"$__apacheconfig_vars" - done - echo ")" >>"$__apacheconfig_vars" - echo "__dynamic_vars=(" >>"$__apacheconfig_vars" - for __var in "${DYNAMIC_VARS[@]}"; do - echo_setv "$__var=${!__var}" >>"$__apacheconfig_vars" - done - echo ")" >>"$__apacheconfig_vars" -fi - -# afficher les variables -if [ -n "$__list_vars" ]; then - echo "# template vars" - for __var in "${TEMPLATE_VARS[@]}"; do - echo_setv "$__var=${!__var}" - done - if [ ${#DYNAMIC_VARS[*]} -gt 0 ]; then - echo "# dynamic vars" - for __var in "${DYNAMIC_VARS[@]}"; do - echo_setv "$__var=${!__var}" - done + if [ -f "$config" ]; then + ask_yesno "Le fichier $(ppath "$config") existe. Voulez-vous l'écraser?" O || die + rm -f "$config" || die fi -fi + templatectl -d "$destdir" --no-load-vars -m --write-vars -# 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 "$__templatectl_destdir" ]; then - estepn "Création automatique de $(ppath "$__templatectl_destdir")" - mkdir -p "$__templatectl_destdir" || die - fi - [ -d "$__templatectl_destdir" ] || die "$__templatectl_destdir: répertoire introuvable" - __templatectl_do "$@" -fi +################################################################################ +elif [ "$action" == template ]; then + __TEMPLATECTL_HELP="USAGE: $scriptname -t -- args... -# déploiement -if [ -n "$__deploy" ]; then - args=( - -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"} - ) - for __name in "${DYNAMIC_VARS[@]}"; do +$__TEMPLATECTL_HELP" + templatectl -d "$destdir" --no-load-vars ${templateopt:+-$templateopt} "$@" + +################################################################################ +elif [ "$action" == deploy ]; then + [ -d "$destdir" ] || die "$destdir: répertoire introuvable" + + args=(-d "$destdir" --deploy ${certsdir:+-r "$certsdir"}) + for __name in "${TEMPLATE_DYNAMIC_VARS[@]}"; do array_add args -v "$__name=${!__name}" done + array_add args -- "$@" run_as_root "${args[@]}" etitle "Mise à jour du système" - [ -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"} - ) - for __name in "${DYNAMIC_VARS[@]}"; do + args=("$destdir" "$certsdir") + for __name in "${TEMPLATE_DYNAMIC_VARS[@]}"; do array_add args "$__name=${!__name}" done - apache_autoconf "${args[@]}" || die + apache_autoconf "${args[@]}" "$@" || die eend fi diff --git a/lib/ulib/apache.tools b/lib/ulib/apache.tools index 8564da3..f645929 100644 --- a/lib/ulib/apache.tools +++ b/lib/ulib/apache.tools @@ -180,11 +180,42 @@ $sedscript" <"$src" >"$FILLTEMP" copy_update "$src" "$dest" "$perms" } +__APACHE_AUTOCONF_HELP="\ +--confdir CONFDIR + Spécifier l'emplacement des fichiers de configuration apache ainsi que des + fichiers 'confs.conf', 'modules.conf' et 'sites.conf'. Par défaut, prendre + le répertoire local DESTDIR. +--confsdir CONFSDIR + Spécifier l'emplacement des fichiers de configuration des configuration. Par + défaut, utiliser DESTDIR/confs si ce répertoire existe. +--modulesdir MODULESDIR + Spécifier l'emplacement des fichiers de configuration des modules. Par + défaut, utiliser DESTDIR/modules si ce répertoire existe. +--sitesdir SITESDIR + Spécifier l'emplacement des fichiers de configuration des sites. Par défaut, + utiliser DESTDIR/sites si ce répertoire existe. +--cgibindir CGIBINDIR + Spécifier l'emplacement des scripts cgi à installer. Par défaut, utiliser + DESTDIR/cgi-bin si ce répertoire existe. +--wwwdir WWWDIR + Spécifier l'emplacement des fichiers du serveur web. Par défaut, utiliser + DESTDIR/www si ce répertoire existe. +--certsconfdir CERTSCONFDIR + Spécifier l'emplacement des fichiers de configuration des certificats. Par + défaut, utiliser DESTDIR/certsconf si ce répertoire existe. Il faut alors + spécifier aussi CERTSDIR, l'emplacement des certificats à installer. +--rrdir RRDIR + Spécifier l'emplacement des fichiers de réécriture. Par défaut, utiliser + DESTDIR/RewriteRules si ce répertoire existe. +--no-restart + Ne pas redémarrer apache en cas de modification de la configuration" +function __display_apache_autoconf_help() { eecho "$__APACHE_AUTOCONF_HELP"; } function apache_autoconf() { eval "$(utools_local)" local autoconfdir certsdir confdir modulesdir sitesdir cgibindir wwwdir certsconfdir rrdir local restart=1 parse_opts "${PRETTYOPTS[@]}" \ + --help '$exit_with __display_apache_autoconf_help' \ --confdir: confdir= \ --modulesdir: modulesdir= \ --sitesdir: sitesdir= \ diff --git a/lib/ulib/sysinfos b/lib/ulib/sysinfos index 1362ece..704d547 100644 --- a/lib/ulib/sysinfos +++ b/lib/ulib/sysinfos @@ -316,9 +316,21 @@ function ensure_sysinfos() { __fix_sysinfos_downward } +function get_sysinfos_desc() { + # Afficher une chaine de la forme SYSNAME/SYSDIST/SYSVER qui décrit le + # système actuel + local sysname_="${1:-MYSYSNAME}"; sysname_="${!sysname_}" + local sysdist_="${2:-MYSYSDIST}"; sysdist_="${!sysdist_}" + local sysver_="${3:-MYSYSVER}"; sysver_="${!sysver_}" + echo "$sysname_${sysdist_:+/$sysdist_}${sysver_:+/$sysver_}" +} + function check_sysinfos() { # Tester si le système courant ($MYSYSNAME, $MYSYSDIST, $MYSYSVER, $MYBITS) # correspond à au moins un des arguments. + # Il est possible de spécifier des variables différentes pour tester le + # système courant avec l'option --vars qui doit être spécifiée en premier: + # check_sysinfos --vars sysname sysdist sysver bits -d debian # Les options -s, -d, -v, -b permettent respectivement de vérifier le # système, la distribution, la version et le nombre de bits. Il est possible # de spécifier plusieurs tests à effectuer, e.g.: @@ -335,10 +347,20 @@ function check_sysinfos() { # cela n'a actuellement de sens qu'avec les version de MacOS X. Il faut # aussi impérativement filtrer sur le système, e.g: # check_sysinfos -s macosx -d 10.5+ - local sysnamevar_="MYSYSNAME" - local sysdistvar_="MYSYSDIST" - local sysvervar_="MYSYSVER" - local bitsvar_="MYBITS" + local sysnamevar_ sysdistvar_ sysvervar_ bitsvar_ + if [ "$1" == --vars ]; then + shift + if [[ "$1" != -* ]]; then sysnamevar_="${1:-MYSYSNAME}"; shift; fi + if [[ "$1" != -* ]]; then sysdistvar_="${1:-MYSYSDIST}"; shift; fi + if [[ "$1" != -* ]]; then sysvervar_="${1:-MYSYSVER}"; shift; fi + if [[ "$1" != -* ]]; then bitsvar_="${1:-MYBITS}"; shift; fi + else + sysnamevar_="MYSYSNAME" + sysdistvar_="MYSYSDIST" + sysvervar_="MYSYSVER" + bitsvar_="MYBITS" + fi + local check_=sysname r_=0 while [ -n "$1" ]; do if [[ "$1" == -* ]]; then diff --git a/lib/ulib/template b/lib/ulib/template index fba0d10..08a660e 100644 --- a/lib/ulib/template +++ b/lib/ulib/template @@ -43,32 +43,100 @@ function __template_plsort() { sort -n "$@" | awk '{sub(/[0-9]+:/, ""); print}' } +function __template_search_destdir() { + # Chercher à partir du répertoire courant si un des répertoires parents + # s'appelle $1. Retourner vrai si le répertoire a été trouvé. + local dir="$(pwd)" dirname + + while true; do + setx dirname=basename -- "$dir" + if [ "$dir" == / ]; then + # s'arrêter à la racine + return 1 + elif [ "$dir" == "$HOME" ]; then + # s'arrêter au répertoire HOME + return 1 + elif [ "$dirname" == "$1" ]; then + echo "$dir" + return 0 + elif [ "$dirname" == ".$1" ]; then + echo "$dir" + return 0 + fi + setx dir=dirname -- "$dir" + done +} +function __template_set_destdir() { + local __destdir="${1:-destdir}" __autocreate="${2:-autocreate}" __name="${3:-template}" + setv "$__autocreate" + if [ -z "${!__destdir}" ]; then + if [ -d "$__name" ]; then + setv "$__destdir" "$__name" + elif [ -d ".$__name" ]; then + setv "$__destdir" ".$__name" + elif setx "$__destdir" __template_search_destdir "$__name"; then + estepn "Sélection automatique de $(ppath "${!__destdir}")" + elif [ -e "$__name" ]; then + eerror "Vous devez spécifier le répertoire de destination avec -d" + return 1 + else + setv "$__destdir" "$__name" + setv "$__autocreate" 1 + fi + fi + setx "$__destdir" abspath "${!__destdir}" + return 0 +} +function __template_set_var() { + # Mettre à jour la variable $1 avec la valeur $2 en tenant compte de + # certaines dépendances. Par exemple, si on modifie host, il faut mettre à + # jour hostname. + # La variable __TEMPLATE_DEFAULTF_var contient le nom d'une fonction qui + # retourne la valeur par défaut de la variable. Cette fonction est appelée + # avec le nom de la variable comme premier argument. + # La variable __TEMPLATE_UPDATEF_var contient le nom d'une fonction qui met + # à jour les variables dépendantes. Cette fonction est appelée avec le nom + # de la variable comme premier argument et sa nouvelle valeur en deuxième + # argument. + # Retourner vrai si la valeur a été changée + local __orig_value="${!1}" + local __defaultf="__TEMPLATE_DEFAULTF_$1" __updatef="__TEMPLATE_UPDATEF_$1" + + array_contains TEMPLATE_DYNAMIC_VARS "$1" || array_addu TEMPLATE_STATIC_VARS "$1" + [ "$3" == writable ] && array_del TEMPLATE_NOWRITE_VARS + + [ -z "$2" -a -n "${!__defaultf}" ] && set -- "$1" "$("${!__defaultf}" "$1")" + setv "$1" "$2" + [ -n "${!__updatef}" ] && "${!__updatef}" "$1" "$2" + [ "$2" != "$__orig_value" ] +} # liste des variables qu'il faut remplacer dans les fichiers sources -TEMPLATE_VARS=() +TEMPLATE_STATIC_VARS=() function __template_setup_tmpfile() { - if [ ${#TEMPLATE_VARS[*]} -gt 0 ]; then + if [ ${#TEMPLATE_STATIC_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 + if [ ${#TEMPLATE_STATIC_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 + # Pour chacune des variables VAR de TEMPLATE_STATIC_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; } + [ ${#TEMPLATE_STATIC_VARS[*]} -eq 0 ] && { echo "$1"; return; } - # chercher si le fichier contient au moins un des tags de TEMPLATE_VARS + # chercher si le fichier contient au moins un des tags de + # TEMPLATE_STATIC_VARS local __var __tag __found - for __var in "${TEMPLATE_VARS[@]}"; do + for __var in "${TEMPLATE_STATIC_VARS[@]}"; do __tag="@@${__var}@@" if quietgrep "$__tag" "$1"; then __found=1 @@ -79,7 +147,7 @@ function __template_fillvars() { # construire le script sed pour le remplacement des variables local __script __first=1 - for __var in "${TEMPLATE_VARS[@]}"; do + for __var in "${TEMPLATE_STATIC_VARS[@]}"; do [ -n "$__first" ] || __script="$__script"$'\n' __first= __script="${__script}s/@@${__var}@@/$(qseds "${!__var}")/g" @@ -90,18 +158,25 @@ function __template_fillvars() { } function template_list() { -# Lister les fichiers du répertoire source $1 qui seraient fusionnées avec -# template_merge() ou supprimés avec template_unmerge() du répertoire -# destination $2. Si des chemins sont spécifiés avec les arguments $3..@, ne -# traiter que les fichiers qui correspondent à ces spécifications - local srcdir="$1"; shift - __template_check_srcdir "$srcdir" || return 1 - setx srcdir=abspath "$srcdir" - +# Soit $N le séparateur --, lister les fichiers des répertoires sources +# $2..$(N-1) qui seraient fusionnés avec template_merge() ou supprimés avec +# template_unmerge() du répertoire destination $1. Si des chemins sont spécifiés +# avec les arguments $(N+1)..@, ne traiter que les fichiers qui correspondent à +# ces spécifications. Exemple: +# template_list destdir srcdirs... -- specs... local destdir="${1:-.}"; shift __template_check_destdir "$destdir" || return 1 setx destdir=abspath "$destdir" + local -a srcdirs; local srcdir + while [ $# -gt 0 ]; do + srcdir="$1"; shift + [ "$srcdir" == -- ] && break + __template_check_srcdir "$srcdir" || return 1 + setx srcdir=abspath "$srcdir" + array_add srcdirs "$srcdir" + done + local rel2pwd withinpath "$destdir" "$(pwd)" && rel2pwd=1 @@ -118,27 +193,29 @@ function template_list() { withinpath "$destdir" "$srcspec" || continue srcspec="${srcspec#$destdir}" - [ -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/}" + for srcdir in "${srcdirs[@]}"; do + [ -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 "$content" "$dest" && list=1 - else - list=1 - fi - [ -n "$list" ] || continue + list= + if [ -L "$dest" ]; then + : + elif [ -f "$dest" ]; then + testsame "$content" "$dest" && list=1 + else + list=1 + fi + [ -n "$list" ] || continue - if [ -n "$rel2pwd" ]; then - relpath "$dest" - else - echo "${src#$srcdir/}" - fi + if [ -n "$rel2pwd" ]; then + relpath "$dest" + else + echo "${src#$srcdir/}" + fi + done done done | csort -u @@ -146,19 +223,26 @@ function template_list() { } function template_merge() { -# Copier dans le répertoire destination $2 tous les fichiers provenant du -# répertoire source $1 correspondant aux spécifications $3..@, si ces fichiers -# n'ont pas été modifiés dans le répertoire de destination. +# Soit $N le séparateur --, copier dans le répertoire destination $1 les +# fichiers des répertoires sources $2..$(N-1) correspondant aux spécifications +# $(N+1)..@, si ces fichiers n'ont pas été modifiés dans le répertoire de +# destination. # Les fichiers sources ayant l'extension .template sont ignorés par défaut, sauf -# s'ils sonts demandés explicitement. - local srcdir="$1"; shift - __template_check_srcdir "$srcdir" || return 1 - setx srcdir=abspath "$srcdir" - +# s'ils sonts demandés explicitement. Exemple: +# template_merge destdir srcdirs... -- specs... local destdir="${1:-.}"; shift __template_check_destdir "$destdir" || return 1 setx destdir=abspath "$destdir" + local -a srcdirs; local srcdir + while [ $# -gt 0 ]; do + srcdir="$1"; shift + [ "$srcdir" == -- ] && break + __template_check_srcdir "$srcdir" || return 1 + setx srcdir=abspath "$srcdir" + array_add srcdirs "$srcdir" + done + [ $# -gt 0 ] || set -- "$destdir" local tmpfile; __template_setup_tmpfile @@ -174,53 +258,61 @@ function template_merge() { fi srcspec="${srcspec#$destdir}" - [ -e "$srcdir$srcspec" ] || continue - ebegin "$(ppath "$destdir$srcspec")" - s=0 - if [ -n "$template" ]; then - array_from_lines srcfiles "$(find "$srcdir$srcspec" -type f)" - else - array_from_lines srcfiles "$(find "$srcdir$srcspec" -type f | grep -v '\.template$')" - fi - for src in "${srcfiles[@]}"; do - setx content=__template_fillvars "$src" "$tmpfile" - dest="$destdir/${src#$srcdir/}" - [ -n "$template" ] && dest="${dest%.template}" - - if [ -L "$dest" ]; then - edotw 0 "LOCALLY MODIFIED: $(ppath "$dest")" - elif [ -f "$dest" ]; then - if testsame "$content" "$dest"; then - show_debug && edot 0 "ALREADY COPIED: $(ppath "$dest")" - else - edotw 0 "LOCALLY MODIFIED: $(ppath "$dest")" - fi + for srcdir in "${srcdirs[@]}"; do + [ -e "$srcdir$srcspec" ] || continue + ebegin "$(basename -- "$srcdir") --> $(ppath "$destdir$srcspec")" + s=0 + if [ -n "$template" ]; then + array_from_lines srcfiles "$(find "$srcdir$srcspec" -type f)" else - mkdirof "$dest" - cp "$content" "$dest"; r=$? - edot $r "COPY: $(ppath "$dest")" - [ $r -eq 0 ] || s=$r + array_from_lines srcfiles "$(find "$srcdir$srcspec" -type f | grep -v '\.template$')" fi + for src in "${srcfiles[@]}"; do + setx content=__template_fillvars "$src" "$tmpfile" + dest="$destdir/${src#$srcdir/}" + [ -n "$template" ] && dest="${dest%.template}" + + if [ -L "$dest" ]; then + edotw 0 "LOCALLY MODIFIED: $(ppath "$dest")" + elif [ -f "$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 "$content" "$dest"; r=$? + edot $r "COPY: $(ppath "$dest")" + [ $r -eq 0 ] || s=$r + fi + done + eend $s done - eend $s done __template_clean_tmpfile } function template_unmerge() { -# Supprimer du répertoire de destination $2 tous les fichiers provenant du -# répertoire source $1 et qui n'ont pas été modifiés. Si des chemins sont -# spécifiés avec les arguments $3..@, ne traiter que les fichiers qui -# correspondent à ces spécifications. - local srcdir="$1"; shift - __template_check_srcdir "$srcdir" || return 1 - setx srcdir=abspath "$srcdir" - +# Soit $N le séparateur --, supprimer du répertoire destination $1 les fichiers +# provenant des répertoires sources $2..$(N-1) et qui n'ont pas été modifiés. Si +# des chemins sont spécifiés avec les arguments $(N+1)..@, ne traiter que les +# fichiers qui correspondent à ces spécifications. Exemple: +# template_unmerge destdir srcdirs... -- specs... local destdir="${1:-.}"; shift __template_check_destdir "$destdir" || return 1 setx destdir=abspath "$destdir" + local -a srcdirs; local srcdir + while [ $# -gt 0 ]; do + srcdir="$1"; shift + [ "$srcdir" == -- ] && break + __template_check_srcdir "$srcdir" || return 1 + setx srcdir=abspath "$srcdir" + array_add srcdirs "$srcdir" + done + [ $# -gt 0 ] || set -- "$destdir" local tmpfile; __template_setup_tmpfile @@ -235,29 +327,31 @@ function template_unmerge() { fi srcspec="${srcspec#$destdir}" - [ -e "$srcdir$srcspec" ] || continue - s=0 - 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/}" + for srcdir in "${srcdirs[@]}"; do + [ -e "$srcdir$srcspec" ] || continue + s=0 + 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 "$content" "$dest"; then - rm -f "$dest"; r=$? - edot $r "REMOVE: $(ppath "$dest")" - [ $r -eq 0 ] || s=$r - else + if [ -L "$dest" ]; then edotw 0 "LOCALLY MODIFIED: $(ppath "$dest")" + elif [ -f "$dest" ]; then + if testsame "$content" "$dest"; then + rm -f "$dest"; r=$? + edot $r "REMOVE: $(ppath "$dest")" + [ $r -eq 0 ] || s=$r + else + edotw 0 "LOCALLY MODIFIED: $(ppath "$dest")" + fi + else + show_debug && edot 0 "ALREADY REMOVED: $(ppath "$dest")" fi - else - show_debug && edot 0 "ALREADY REMOVED: $(ppath "$dest")" - fi + done + eend $s done - eend $s done __template_clean_tmpfile @@ -274,35 +368,42 @@ function template_cleandest() { } function template_diff() { -# Afficher les différences entre les fichiers du répertoire de destination $2 et -# les fichiers du répertoire source $1 - local srcdir="$1"; shift - __template_check_srcdir "$srcdir" || return 1 - setx srcdir=abspath "$srcdir" - +# Afficher les différences entre les fichiers du répertoire de destination $1 et +# les fichiers des répertoires sources $2..@ local destdir="${1:-.}"; shift __template_check_destdir "$destdir" || return 1 setx destdir=abspath "$destdir" + local -a srcdirs; local srcdir + while [ $# -gt 0 ]; do + srcdir="$1"; shift + [ "$srcdir" == -- ] && break + __template_check_srcdir "$srcdir" || return 1 + setx srcdir=abspath "$srcdir" + array_add srcdirs "$srcdir" + done + 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 "$content" "$dest"; then - diff -uwB "$content" "$dest" - fi + for srcdir in "${srcdirs[@]}"; do + 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 "$content" "$dest"; then + diff -uwB "$content" "$dest" + fi + done done | page_maybe -S __template_clean_tmpfile } -function templatesrc() { - # obtenir le chemin vers le répertoire source de templates $1, situé dans - # ULIBDIR/templates +function template_srcdir() { +# Obtenir le chemin vers le répertoire source de templates $1, situé dans +# ULIBDIR/templates urequire ulib if [ -n "$ULIBDIR" ]; then echo "$ULIBDIR/templates/$1" @@ -311,44 +412,193 @@ function templatesrc() { fi } -function __templatectl_display_help() { :; } -__TEMPLATECTL_SUPPLOPTS=() -function __templatectl_parseopts() { - parse_opts "${PRETTYOPTS[@]}" \ - --help '$exit_with __templatectl_display_help' \ - -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_config() { +# Obtenir le chemin vers le fichier de configuration pour le répertoire $1 + echo "$1/$(basename -- "$TEMPLATECTL_CONFIG")" } -function __templatectl_do() { - __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 +function templatectl_loadvars() { +# Charger les valeurs des variables depuis le fichier $1 +# Les variables suivantes doivent être définies: +# - Le tableau TEMPLATECTL_DEFAULTS permet de donner une valeur par défaut aux +# variables mentionnées dans TEMPLATE_STATIC_VARS. C'est une liste de valeurs +# de la forme 'name=value' +# - Le tableau TEMPLATECTL_VARS contient des variables supplémentaires +# spécifiées par l'utilisateur. C'est une liste de valeurs de la forme +# 'name=value' +# - TEMPLATE_STATIC_VARS doit contenir une liste de noms de variables qui +# peuvent être remplacés dans les fichiers de template. +# - TEMPLATE_DYNAMIC_VARS contient une liste de noms de variables valides, mais +# qui ne doivent pas être remplacés, en effet, ils sont utilisés pour le +# déploiement des fichiers. +# - TEMPLATE_NOWRITE_VARS contient une liste de noms de variables qui ne +# devraient pas être écrits dans le fichier des variables, sauf si elles +# reçoivent une valeur explicite de la part de l'utilisateur. Ce tableau est +# mis à jour lors de l'analyse du tableau TEMPLATECTL_VARS + local -a __template_vars __dynamic_vars + local __t_var __t_name __t_value - [ -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 + array_copy __template_vars TEMPLATECTL_DEFAULTS + configdir="$(dirname -- "$1")" + [ -f "$1" ] && source "$1" + + for __t_var in "${__template_vars[@]}"; do + splitvar "$__t_var" __t_name __t_value + __template_set_var "$__t_name" "$__t_value" + done + array_contains TEMPLATE_STATIC_VARS configdir && __template_set_var configdir "$configdir" + for __t_var in "${__dynamic_vars[@]}"; do + splitvar "$__t_var" __t_name __t_value + array_del TEMPLATE_STATIC_VARS "$__t_name" + array_addu TEMPLATE_DYNAMIC_VARS "$__t_name" + __template_set_var "$__t_name" "$__t_value" + done + array_contains TEMPLATE_DYNAMIC_VARS configdir && __template_set_var configdir "$configdir" + + local __t_modified=1 + for __t_var in "${TEMPLATECTL_VARS[@]}"; do + splitvar "$__t_var" __t_name __t_value + __template_set_var "$__t_name" "$__t_value" writable && __t_modified=0 + done + return $__t_modified } +function templatectl_writevars() { +# Ecrire les variables dans le fichier $1 + local __t_var + echo "# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8" >"$1" + echo "__template_vars=(" >>"$1" + for __t_var in "${TEMPLATE_STATIC_VARS[@]}"; do + array_contains TEMPLATE_NOWRITE_VARS "$__t_var" && continue + echo_setv "$__t_var=${!__t_var}" >>"$1" + done + echo ")" >>"$1" + echo "__dynamic_vars=(" >>"$1" + for __t_var in "${TEMPLATE_DYNAMIC_VARS[@]}"; do + array_contains TEMPLATE_NOWRITE_VARS "$__t_var" && continue + echo_setv "$__t_var=${!__t_var}" >>"$1" + done + echo ")" >>"$1" +} + +function templatectl_list_vars() { +# Afficher les valeurs des variables + local __var + echo "# template vars" + for __var in "${TEMPLATE_STATIC_VARS[@]}"; do + echo_setv "$__var=${!__var}" + done + if [ ${#TEMPLATE_DYNAMIC_VARS[*]} -gt 0 ]; then + echo "# dynamic vars" + for __var in "${TEMPLATE_DYNAMIC_VARS[@]}"; do + echo_setv "$__var=${!__var}" + done + fi +} + +__TEMPLATECTL_HELP="\ +-d, --destdir DESTDIR + Spécifier le répertoire local dans lequel copier les fichiers templates +-s, --srcdir SRCDIR + Ajouter un répertoire à la liste des répertoires sources pour les templates. + Si ce n'est pas un chemin, c'est le nom d'un répertoire dans le répertoires + des templates par défaut. +-l, --list + Lister les templates disponibles. +-m, --merge + Copier les templates spécifiés dans le répertoire local s'il n'y existent + pas déjà. Les templates ayant l'extension '.template' doivent être demandés + explicitement. Sinon, ils sont ignorés. +-z, --unmerge + Supprimer les fichiers du répertoire local s'ils n'ont pas été modifiés par + rapport aux templates. +-C, --clean + Supprimer les répertoires vides dans le répertoire local. Peut être utile + après -z +-g, --diff + Afficher les différences entre les templates et les fichiers du répertoire + local. +-L, --list-vars + Afficher pour information les valeurs par défaut des variables de template. +-v, --var NAME=VALUE + Spécifier la valeur d'une variable. Toutes les variables sont autorisées, + sauf celles qui figurent dans la liste des variables dynamiques. +-w, --write-vars + Ecrire dans le fichier $TEMPLATECTL_CONFIG les valeurs des variables, ce qui + permet après édition du fichier d'éviter de les spécifier à chaque fois avec + l'option -v + Le fichier n'est pas écrasé s'il existe déjà." +function __display_templatectl_help() { uecho "$__TEMPLATECTL_HELP"; } function templatectl() { -# fonction de haut niveau qui facilite l'utilisation des fonctions template_* -# définir la fonction __templatectl_display_help() pour l'affichage de l'aide - local -a args - local __templatectl_list __templatectl_merge __templatectl_unmerge __templatectl_clean __templatectl_diff __templatectl_opt __templatectl_auto - local __templatectl_destdir +# Fonction de haut niveau qui facilite l'utilisation des fonctions template_* +# définir la fonction __display_templatectl_help() pour l'affichage de l'aide +# - Le tableau TEMPLATECTL_SRCDIRS doit contenir la liste des répertoires +# sources pour les templates. Alternativement, il est possible de définir la +# variable TEMPLATECTL_SRCDIR s'il n'y a qu'un seul répertoire source pour le +# template +# - TEMPLATECTL_CONFIG est le nom de base du fichier à partir duquel sont +# chargées les variables et dans lequel sont écrites les variables avec +# l'option --write-vars +# Les variables de template_loadvars() sont aussi prises en compte + local -a __tc_srcdirs; local __tc_srcdir + if [ ${#TEMPLATECTL_SRCDIRS[*]} -gt 0 ]; then + : + elif [ -n "$TEMPLATECTL_SRCDIR" ]; then + local -a TEMPLATECTL_SRCDIRS + TEMPLATECTL_SRCDIRS=("$TEMPLATECTL_SRCDIR") + fi + for __tc_srcdir in "${TEMPLATECTL_SRCDIRS[@]}"; do + if ! withpath "$__tc_srcdir"; then + __tc_srcdir="$(template_srcdir "$__tc_srcdir")" + fi + array_add __tc_srcdirs "$__tc_srcdir" + done - __templatectl_parseopts "$@" && set -- "${args[@]}" || { eerror "$args"; return 1; } - [ -z "$__templatectl_opt" ] && __templatectl_auto=1 - __templatectl_do "$@" + local -a __tc_args + local __tc_auto=1 __tc_load_vars=1 + local __tc_destdir __tc_list __tc_merge __tc_unmerge __tc_clean __tc_diff __tc_list_vars __tc_write_vars + parse_opts "${PRETTYOPTS[@]}" \ + --help '$exit_with __display_templatectl_help' \ + -d:,--destdir: __tc_destdir= \ + -s:,--srcdir: __tc_srcdirs \ + --load-vars __tc_load_vars=1 \ + --no-load-vars __tc_load_vars= \ + --noop __tc_auto= \ + -l,--list '$__tc_list=1; __tc_auto=' \ + -m,--merge '$__tc_merge=1; __tc_auto=' \ + -z,--unmerge '$__tc_unmerge=1; __tc_auto=' \ + -C,--clean '$__tc_clean=1; __tc_auto=' \ + -g,--diff '$__tc_diff=1; __tc_auto=' \ + -L,--list-vars '$__tc_list_vars=1; __tc_auto=' \ + -v:,--var: TEMPLATECTL_VARS \ + -w,--write-vars __tc_write_vars=1 \ + @ __tc_args -- "$@" && set -- "${__tc_args[@]}" || { eerror "$__tc_args"; return 1; } + + [ -n "$__tc_destdir" ] || __tc_destdir=. + __template_check_destdir "$__tc_destdir" || return 1 + + array_isempty __tc_srcdirs && return 1 + for __tc_srcdir in "${__tc_srcdirs[@]}"; do + __template_check_srcdir "$__tc_srcdir" || return 1 + done + + local __tc_config="$__tc_destdir/$(basename -- "$TEMPLATECTL_CONFIG")" + if [ -n "$__tc_load_vars" ]; then + templatectl_loadvars "$__tc_config" + fi + if [ -n "$__tc_write_vars" ]; then + if [ -f "$__tc_config" ]; then + ewarn "Refus d'écraser le fichier existant $(ppath "$__tc_config")" + else + templatectl_writevars "$__tc_config" + fi + fi + + [ -n "$__tc_auto" ] && __tc_list=1 + [ -n "$__tc_list_vars" ] && templatectl_list_vars + [ -n "$__tc_list" ] && template_list "$__tc_destdir" "${__tc_srcdirs[@]}" -- "$@" + [ -n "$__tc_merge" ] && template_merge "$__tc_destdir" "${__tc_srcdirs[@]}" -- "$@" + [ -n "$__tc_unmerge" ] && template_unmerge "$__tc_destdir" "${__tc_srcdirs[@]}" -- "$@" + [ -n "$__tc_clean" ] && template_cleandest "$__tc_destdir" "$@" + [ -n "$__tc_diff" ] && template_diff "$__tc_destdir" "${__tc_srcdirs[@]}" -- "$@" } diff --git a/lib/ulib/templates/apacheconfig/README-apacheconfig.txt b/lib/ulib/templates/apacheconfig/README-apacheconfig.txt index a7f97de..b9f63a0 100644 --- a/lib/ulib/templates/apacheconfig/README-apacheconfig.txt +++ b/lib/ulib/templates/apacheconfig/README-apacheconfig.txt @@ -3,47 +3,69 @@ Ce répertoire peut contenir les fichiers et répertoires suivants, qui sont tous optionnels: -- modules.conf la liste des modules qu'il faut activer. Si un module n'existe - pas dans ce fichier, ou si ce fichier n'existe pas, aucune modification n'est - effectuée. Si un module est de la forme -module, il est désactivé. Si un - module est de la forme +module, il est activé. Cette syntaxe permet de - supporter les modules dont le nom commencerait par '-' +confs.conf + Liste des configurations qu'il faut activer. Si un fichier de configuration + existe mais n'est pas mentionnée dans ce fichier, ou si ce fichier n'existe + pas, aucune modification n'est effectuée. Ce fichier contient une liste de + ligne de configuration. + Si une configuration est de la forme -conf, elle est désactivée. Si une + configuration est de la forme +conf, elle est activée. Cette syntaxe permet + de supporter les configurations dont le nom commencerait par '-' + Ce fichier n'est supporté qu'à partir de debian jessie. -- sites.conf la liste des sites qu'il faut activer. Si un site ne figure pas - dans ce fichier, il est désactivé. Si ce fichier n'existe pas, tous les sites - existant sont activés. +modules.conf + Liste des modules qu'il faut activer. Si un module existe mais n'est pas + mentionné dans ce fichier, ou si ce fichier n'existe pas, aucune + modification n'est effectuée. + Si un module est de la forme -module, il est désactivé. Si un module est de + la forme +module, il est activé. Cette syntaxe permet de supporter les + modules dont le nom commencerait par '-' -- tous les autres fichiers sont copiés tels quels dans /etc/apache2. Notamment, - apache2.conf est le fichier de configuration principal d'apache et ports.conf - le fichier de configuration des ports d'écoute. +sites.conf + Liste des sites qu'il faut activer. Si ce fichier n'existe pas, tous les + sites existant sont activés. Si un site existe mais ne figure pas dans ce + fichier, il est désactivé. -- modules/ le répertoire des configurations de modules à installer. Les fichiers - de ce répertoire sont de la forme MODULE.conf et sont installés dans le - répertoire /etc/apache2/mods-available. Il faut mentioner le module dans le - fichier modules.conf pour l'activer. +confs/ + Répertoire des configurations à installer. Les fichiers de ce répertoire + sont de la forme CONF.conf et sont installés dans le répertoire + /etc/apache2/conf-available. Il faut mentionner la configuration dans le + fichier confs.con pour l'activer. + Ce répertoire n'est supporté qu'à partir de debian jessie. -- sites/ le répertoire des sites à installer. Les fichiers de ce répertoire sont - de la forme NAME.conf pour les sites écoutant en clair, et NAME.ssl.conf pour - les sites écoutant en https. Pour chaque site NAME.ssl.conf, un fichier - NAME-certs.conf doit exister dans certsconf/ - Dans les fichiers NAME.ssl.conf, les valeurs @@cert@@, @@key@@ et @@ca@@ sont - respectivement remplacées par l'emplacement des fichiers de certificats - définis dans les fichiers correspondants NAME-certs.conf +modules/ + Répertoire des configurations de modules à installer. Les fichiers de ce + répertoire sont de la forme MODULE.conf et sont installés dans le répertoire + /etc/apache2/mods-available. Il faut mentioner le module dans le fichier + modules.conf pour l'activer. -- cgi-bin/ le répertoire des scripts cgi à installer +sites/ + Répertoire des sites à installer. Les fichiers de ce répertoire sont de la + forme SITE.conf pour les sites écoutant en clair, et SITE.ssl.conf pour les + sites écoutant en https. + Pour chaque site SITE.ssl.conf, un fichier SITE-certs.conf doit exister dans + certsconf/. Pour chaque fichier SITE.ssl.conf, les balises @@ca@@, @@cert@@ + et @@key@@ sont remplacés par les valeurs des variables ca, cert et key + définies dans le fichier correspondant SITE-certs.conf -- www/ le répertoire qui contient les fichiers du serveur web à installer dans - l'emplacement par défaut. +cgi-bin/ + Répertoire des scripts cgi -- certsconf/ le répertoire qui contient la configuration pour les certificats à - installer. Si ce répertoire existe, il faut spécifier CERTSDIR - Les fichiers de ce répertoire sont de la forme NAME-certs.conf et chacun d'eux - correspondant en principe à un fichier NAME.ssl.conf dans sites/ +www/ + Répertoire des fichiers du serveur web -- RewriteRules/ le répertoire qui contient la configuration de réécriture. Tous - les fichiers RewriteRules*.conf de ce répertoire sont copiés dans /etc/apache2 +certsconf/ + Répertoire qui contient la configuration pour les certificats à installer. + Les fichiers de ce répertoire sont de la forme SITE-certs.conf et chacun + d'eux correspond à un fichier SITE.ssl.conf dans sites/ -IMPORTANT: Cette configuration n'est pour le moment supporté que sur debian +RewriteRules/ + Répertoire qui contient la configuration de réécriture. Tous les fichiers + RewriteRules*.conf de ce répertoire sont copiés dans /etc/apache2 + +Tous les autres fichiers sont copiés tels quels dans /etc/apache2. Notamment, +apache2.conf est le fichier de configuration principal d'apache et ports.conf le +fichier de configuration des ports d'écoute. ## Configuration TLS diff --git a/lib/ulib/templates/apacheconfig/cgi-bin/.udir b/lib/ulib/templates/apacheconfig/cgi-bin/.udir index 93bb2e5..eb74a9a 100644 --- a/lib/ulib/templates/apacheconfig/cgi-bin/.udir +++ b/lib/ulib/templates/apacheconfig/cgi-bin/.udir @@ -1,9 +1,9 @@ # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 # Utiliser 'udir --help-vars' pour une description de la signification des # variables suivantes: -udir_desc="Fichiers à déployer sur host.univ.run dans /usr/lib/cgi-bin" -udir_note="" -udir_types=("uinst:rsync") +udir_desc="Fichiers à déployer sur @@host@@ dans le répertoire des cgi-bins" +udir_note="Il est possible de déployer les modifications dans ce répertoire avec 'uinst -y'" +udir_types=(uinst:rsync) uinc=release uinc_options=() uinc_args=() @@ -11,11 +11,12 @@ configure_variables=(dest) configure_dest_for=() config_scripts=() install_profiles=false -profiledir=lib/profile.d -bashrcdir=lib/bashrc.d -defaultdir=lib/default +workdir_rsync_options=() +workdir_excludes=() +workdir_includes=() copy_files=true -destdir=CGIBINDIR +rsync_options=() +destdir=root@@@host@@:CGIBINDIR srcdir=. files=() owner=root: diff --git a/lib/ulib/templates/apacheconfig/www/.udir b/lib/ulib/templates/apacheconfig/www/.udir index de4b9a8..e10ec1c 100644 --- a/lib/ulib/templates/apacheconfig/www/.udir +++ b/lib/ulib/templates/apacheconfig/www/.udir @@ -1,9 +1,9 @@ # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 # Utiliser 'udir --help-vars' pour une description de la signification des # variables suivantes: -udir_desc="Fichiers à déployer sur host.univ.run dans /var/www" +udir_desc="Fichiers à déployer sur @@host@@ dans le répertoire des documents web" udir_note="Il est possible de déployer les modifications dans ce répertoire avec 'uinst -y'" -udir_types=("uinst:rsync") +udir_types=(uinst:rsync) uinc=release uinc_options=() uinc_args=() @@ -11,11 +11,12 @@ configure_variables=(dest) configure_dest_for=() config_scripts=() install_profiles=false -profiledir=lib/profile.d -bashrcdir=lib/bashrc.d -defaultdir=lib/default +workdir_rsync_options=() +workdir_excludes=() +workdir_includes=() copy_files=true -destdir=root@host.univ.run:/var/www +rsync_options=() +destdir=root@@@host@@:HTDOCSDIR srcdir=. files=() owner=www-data: diff --git a/lib/ulib/templates/apacheconfig/ports.conf b/lib/ulib/templates/apacheconfig7/ports.conf similarity index 71% rename from lib/ulib/templates/apacheconfig/ports.conf rename to lib/ulib/templates/apacheconfig7/ports.conf index e1cd77e..a6bceab 100644 --- a/lib/ulib/templates/apacheconfig/ports.conf +++ b/lib/ulib/templates/apacheconfig7/ports.conf @@ -1,3 +1,4 @@ +# -*- coding: utf-8 mode: conf -*- vim:syntax=apache:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 # If you just change the port or add more ports here, you will likely also # have to change the VirtualHost statement in # /etc/apache2/sites-enabled/000-default @@ -14,11 +15,15 @@ Listen *:80 # to # Server Name Indication for SSL named virtual hosts is currently not # supported by MSIE on Windows XP. - NameVirtualHost 10.82.80.100:443 - Listen 10.82.80.100:443 + #NameVirtualHost IP:443 + #Listen IP:443 + #@@ips_namevirtualhosts@@ + #@@ips_listens@@ - NameVirtualHost 10.82.80.100:443 - Listen 10.82.80.100:443 + #NameVirtualHost IP:443 + #Listen IP:443 + #@@ips_namevirtualhosts@@ + #@@ips_listens@@ diff --git a/lib/ulib/templates/apacheconfig/sites/default.conf b/lib/ulib/templates/apacheconfig7/sites/default.conf similarity index 100% rename from lib/ulib/templates/apacheconfig/sites/default.conf rename to lib/ulib/templates/apacheconfig7/sites/default.conf diff --git a/lib/ulib/templates/apacheconfig/sites/default.ssl.conf b/lib/ulib/templates/apacheconfig7/sites/default.ssl.conf similarity index 100% rename from lib/ulib/templates/apacheconfig/sites/default.ssl.conf rename to lib/ulib/templates/apacheconfig7/sites/default.ssl.conf diff --git a/lib/ulib/templates/apacheconfig8/confs.conf b/lib/ulib/templates/apacheconfig8/confs.conf new file mode 100644 index 0000000..aa7a4aa --- /dev/null +++ b/lib/ulib/templates/apacheconfig8/confs.conf @@ -0,0 +1,4 @@ +# -*- coding: utf-8 mode: conf -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +# Liste des configurations à activer. Syntaxe: +# conf ou +conf pour activer une configuration +# -conf pour le désactiver diff --git a/lib/ulib/templates/apacheconfig8/ports.conf b/lib/ulib/templates/apacheconfig8/ports.conf new file mode 100644 index 0000000..091f55f --- /dev/null +++ b/lib/ulib/templates/apacheconfig8/ports.conf @@ -0,0 +1,23 @@ +# -*- coding: utf-8 mode: conf -*- vim:syntax=apache:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +# If you just change the port or add more ports here, you will likely also +# have to change the VirtualHost statement in +# /etc/apache2/sites-enabled/000-default.conf + +#@@ips_default_namevirtualhost@@ +Listen 80 + + + Listen 443 + #NameVirtualHost IP:443 + #Listen IP:443 + #@@ips_namevirtualhosts@@ + #@@ips_listens@@ + + + + Listen 443 + #NameVirtualHost IP:443 + #Listen IP:443 + #@@ips_namevirtualhosts@@ + #@@ips_listens@@ + diff --git a/lib/ulib/templates/apacheconfig8/sites/000-default.conf b/lib/ulib/templates/apacheconfig8/sites/000-default.conf new file mode 100644 index 0000000..01672aa --- /dev/null +++ b/lib/ulib/templates/apacheconfig8/sites/000-default.conf @@ -0,0 +1,31 @@ +# -*- coding: utf-8 mode: conf -*- vim:syntax=apache:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + + # The ServerName directive sets the request scheme, hostname and port that + # the server uses to identify itself. This is used when creating + # redirection URLs. In the context of virtual hosts, the ServerName + # specifies what hostname must appear in the request's Host: header to + # match this virtual host. For the default virtual host (this file) this + # value is not decisive as it is used as a last resort host regardless. + # However, you must set it for any further virtual host explicitly. + ServerName @@host@@ + ServerAlias @@aliases@@ + ServerAdmin @@admin@@ + + DocumentRoot /var/www/html + + # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, + # error, crit, alert, emerg. + # It is also possible to configure the loglevel for particular + # modules, e.g. + #LogLevel info ssl:warn + + ErrorLog ${APACHE_LOG_DIR}/error.log + CustomLog ${APACHE_LOG_DIR}/access.log combined + + # For most configuration files from conf-available/, which are + # enabled or disabled at a global level, it is possible to + # include a line for only one particular virtual host. For example the + # following line enables the CGI configuration for this host only + # after it has been globally disabled with "a2disconf". + #Include conf-available/serve-cgi-bin.conf + diff --git a/lib/ulib/templates/apacheconfig8/sites/default-ssl.conf b/lib/ulib/templates/apacheconfig8/sites/default-ssl.conf new file mode 100644 index 0000000..80819ac --- /dev/null +++ b/lib/ulib/templates/apacheconfig8/sites/default-ssl.conf @@ -0,0 +1,137 @@ +# -*- coding: utf-8 mode: conf -*- vim:syntax=apache:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + + + ServerName @@host@@ + ServerAlias @@aliases@@ + ServerAdmin @@admin@@ + + DocumentRoot /var/www/html + + # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, + # error, crit, alert, emerg. + # It is also possible to configure the loglevel for particular + # modules, e.g. + #LogLevel info ssl:warn + + ErrorLog ${APACHE_LOG_DIR}/ssl_error.log + CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined + + # For most configuration files from conf-available/, which are + # enabled or disabled at a global level, it is possible to + # include a line for only one particular virtual host. For example the + # following line enables the CGI configuration for this host only + # after it has been globally disabled with "a2disconf". + #Include conf-available/serve-cgi-bin.conf + + # SSL Engine Switch: + # Enable/Disable SSL for this virtual host. + SSLEngine on + + # A self-signed (snakeoil) certificate can be created by installing + # the ssl-cert package. See + # /usr/share/doc/apache2/README.Debian.gz for more info. + # If both key and certificate are stored in the same file, only the + # SSLCertificateFile directive is needed. + SSLCertificateFile @@cert@@ + SSLCertificateKeyFile @@key@@ + + # Server Certificate Chain: + # Point SSLCertificateChainFile at a file containing the + # concatenation of PEM encoded CA certificates which form the + # certificate chain for the server certificate. Alternatively + # the referenced file can be the same as SSLCertificateFile + # when the CA certificates are directly appended to the server + # certificate for convinience. + SSLCertificateChainFile @@ca@@ + + # Certificate Authority (CA): + # Set the CA certificate verification path where to find CA + # certificates for client authentication or alternatively one + # huge file containing all of them (file must be PEM encoded) + # Note: Inside SSLCACertificatePath you need hash symlinks + # to point to the certificate files. Use the provided + # Makefile to update the hash symlinks after changes. + #SSLCACertificatePath /etc/ssl/certs/ + #SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt + + # Certificate Revocation Lists (CRL): + # Set the CA revocation path where to find CA CRLs for client + # authentication or alternatively one huge file containing all + # of them (file must be PEM encoded) + # Note: Inside SSLCARevocationPath you need hash symlinks + # to point to the certificate files. Use the provided + # Makefile to update the hash symlinks after changes. + #SSLCARevocationPath /etc/apache2/ssl.crl/ + #SSLCARevocationFile /etc/apache2/ssl.crl/ca-bundle.crl + + # Client Authentication (Type): + # Client certificate verification type and depth. Types are + # none, optional, require and optional_no_ca. Depth is a + # number which specifies how deeply to verify the certificate + # issuer chain before deciding the certificate is not valid. + #SSLVerifyClient require + #SSLVerifyDepth 10 + + # SSL Engine Options: + # Set various options for the SSL engine. + # o FakeBasicAuth: + # Translate the client X.509 into a Basic Authorisation. This means that + # the standard Auth/DBMAuth methods can be used for access control. The + # user name is the `one line' version of the client's X.509 certificate. + # Note that no password is obtained from the user. Every entry in the user + # file needs this password: `xxj31ZMTZzkVA'. + # o ExportCertData: + # This exports two additional environment variables: SSL_CLIENT_CERT and + # SSL_SERVER_CERT. These contain the PEM-encoded certificates of the + # server (always existing) and the client (only existing when client + # authentication is used). This can be used to import the certificates + # into CGI scripts. + # o StdEnvVars: + # This exports the standard SSL/TLS related `SSL_*' environment variables. + # Per default this exportation is switched off for performance reasons, + # because the extraction step is an expensive operation and is usually + # useless for serving static content. So one usually enables the + # exportation for CGI and SSI requests only. + # o OptRenegotiate: + # This enables optimized SSL connection renegotiation handling when SSL + # directives are used in per-directory context. + #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire + + SSLOptions +StdEnvVars + + + SSLOptions +StdEnvVars + + + # SSL Protocol Adjustments: + # The safe and default but still SSL/TLS standard compliant shutdown + # approach is that mod_ssl sends the close notify alert but doesn't wait for + # the close notify alert from client. When you need a different shutdown + # approach you can use one of the following variables: + # o ssl-unclean-shutdown: + # This forces an unclean shutdown when the connection is closed, i.e. no + # SSL close notify alert is send or allowed to received. This violates + # the SSL/TLS standard but is needed for some brain-dead browsers. Use + # this when you receive I/O errors because of the standard approach where + # mod_ssl sends the close notify alert. + # o ssl-accurate-shutdown: + # This forces an accurate shutdown when the connection is closed, i.e. a + # SSL close notify alert is send and mod_ssl waits for the close notify + # alert of the client. This is 100% SSL/TLS standard compliant, but in + # practice often causes hanging connections with brain-dead browsers. Use + # this only for browsers where you know that their SSL implementation + # works correctly. + # Notice: Most problems of broken clients are also related to the HTTP + # keep-alive facility, so you usually additionally want to disable + # keep-alive for those clients, too. Use variable "nokeepalive" for this. + # Similarly, one has to force some clients to use HTTP/1.0 to workaround + # their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and + # "force-response-1.0" for this. + BrowserMatch "MSIE [2-6]" \ + nokeepalive ssl-unclean-shutdown \ + downgrade-1.0 force-response-1.0 + # MSIE 7 and newer should be able to use keepalive + BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown + + + diff --git a/lib/ulib/templates/runsconfig/userdefault b/lib/ulib/templates/runsconfig/userdefault index 33bc3f5..655e0c2 100644 --- a/lib/ulib/templates/runsconfig/userdefault +++ b/lib/ulib/templates/runsconfig/userdefault @@ -1,4 +1,4 @@ # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 # Ce fichier contient la liste des script à lancer avec le compte utilisateur # pour configurer @@host@@ -# Chaque ligne contient le nom du script suivi des arguments éventuels \ No newline at end of file +# Chaque ligne contient le nom du script suivi des arguments éventuels diff --git a/runsconfig b/runsconfig index cb93f31..dd24c96 100755 --- a/runsconfig +++ b/runsconfig @@ -1,50 +1,38 @@ #!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 source "$(dirname "$0")/lib/ulib/ulib" || exit 1 -urequire DEFAULTS runs template +urequire DEFAULTS template runs function display_help() { uecho "$scriptname: Gérer un répertoire d'hôte de runs USAGE - $scriptname [options] + $scriptname -c [host [destdir]] + $scriptname -t -- args... OPTIONS - -d, --destdir DESTDIR - Spécifier le répertoire d'hôte dans lequel copier les fichiers. - -l, --list - Lister les templates disponibles. - -m, --merge - Copier les templates spécifiés dans le répertoire d'hôte s'il n'y - existent pas déjà. Les templates ayant l'extension '.template' doivent - être demandés explicitement. Sinon, ils sont ignorés. - -z, --unmerge - Supprimer les fichiers du répertoire d'hôte s'ils n'ont pas été modifiés - par rapport aux templates. - -C, --clean - Supprimer les répertoires vides dans le répertoire de référence. Peut - être utile après -z - -g, --diff - Afficher les différences entre les templates et les fichiers du - répertoire d'hôte. - --list-vars - Afficher pour information les valeurs par défaut des variables de - template. - --write-vars - Ecrire dans le fichier .runsconfig les valeurs par défaut des variables, - ce qui permet d'éviter de les spécifier à chaque fois avec l'option -v - Le fichier n'est pas écrasé s'il existe déjà. - -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. Par défaut, il s'agit - d'une variable de template, utilisée pour mettre à jour la copie locale - d'un template avec l'option --merge - Dans le fichier .runsconfig, les valeurs des variables de template n'est - pas censée changer. Lors de la copie des templates avec --merge, chaque - occurence de @@VAR@@ dans un template est remplacée dans la copie locale - par la valeur de la variable de template VAR" + -c, --create + Créer un nouveau répertoire de configuration pour un hôte + -d, --destdir DESTDIR[=$TEMPLATECTL_NAME] + Nom du répertoire local de configuration. Utiliser 'apacheconfig' par + défaut. + + -t, --template [OPT] + Gérer les fichiers du répertoire local avec templatectl. La valeur de + cette option est utilisée comme argument court pour l'invocation de + templatectl, e.g + $scriptname -tm args + est équivalent à + templatectl -m args + Les arguments qui restent sont passés tels quels à templatectl + Les options courantes de templatectl -l, -v, -m, -L sont disponibles + directement + --help-template + Afficher l'aide concernent la gestion des templates. + Equivalent à -t -- --help + -h, --host HOST + Spécifier l'hôte. Equivalent à -v host=HOST" } -function __templatectl_display_help() { display_help; } ## Valeurs par défaut des variables de template set_defaults runs @@ -74,95 +62,70 @@ if [ -z "$DEFAULT_HOST" ]; then [ -n "$__domain" ] || DEFAULT_HOST="$(runs_add_domain "$DEFAULT_HOST")" fi -DEFAULT_TEMPLATE_VARS=( - hostname= # mettre cette variables AVANT host - host= -) +TEMPLATE_STATIC_VARS=(host hostname) +TEMPLATE_DYNAMIC_VARS=() +TEMPLATE_NOWRITE_VARS=(hostname) -TEMPLATE_VARS=() -function update_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" - - # Valeurs par défaut - case "$1" in - host) [ -n "$2" ] || set -- "$1" "$(myhost)";; - esac - - # Mettre à jour la variable - setv "$1" "$2" - - # Mettre à jour des variables dépendantes - case "$1" in - host) update_var hostname "${host%%.*}";; - esac - - [ "$2" != "$__orig_value" ] +__TEMPLATE_DEFAULTF_host=__template_defaultf_host +__TEMPLATE_UPDATEF_host=__template_updatef_host +function __template_defaultf_host() { + echo "$DEFAULT_HOST" +} +function __template_updatef_host() { + __template_set_var hostname "${host%%.*}" } -__vars=() -__list_vars= -__write_vars= -__TEMPLATECTL_SUPPLOPTS=( - -v:,--var: __vars - --list-vars __list_vars=1 - --write-vars __write_vars=1 +TEMPLATECTL_NAME=runs +TEMPLATECTL_SRCDIRS=(runsconfig) +TEMPLATECTL_CONFIG=".runsconfig" +TEMPLATECTL_DEFAULTS=() +TEMPLATECTL_VARS=() + +action= +destdir= +templateopt= +certsdir= +args=( + --help '$exit_with display_help' + -t::,--template:: '$set@ templateopt; action=template' + --help-template '$templateopt=-help; action=template' + -l,--list '$templateopt=l; action=template' + -v:,--var: TEMPLATECTL_VARS + -m,--merge '$templateopt=m; action=template' + -L,--list-vars '$templateopt=L; action=template' + -c,--create action=create + -h:,--host: '$array_add TEMPLATECTL_VARS host="$value_"' + -d:,--destdir: destdir= ) -__templatectl_parseopts "$@" && \ - set -- "${args[@]}" || die "$args" +parse_args "$@"; set -- "${args[@]}" -# répertoire de template -setx __templatectl_srcdir=templatesrc runsconfig +__template_set_destdir destdir autocreate "$TEMPLATECTL_NAME" || die +setx config=templatectl_config "$destdir" +templatectl_loadvars "$config" -# répertoire d'hôte -[ -n "$__templatectl_destdir" ] || __templatectl_destdir=. -setx __templatectl_destdir=abspath "$__templatectl_destdir" - -# charger les variables. important: la liste des variables définie dans le -# fichier .runsconfig prend la précédence sur la liste définie par défaut -__template_vars=("${DEFAULT_TEMPLATE_VARS[@]}") -__runsconfig_vars="$__templatectl_destdir/.runsconfig" -[ -f "$__runsconfig_vars" ] && source "$__runsconfig_vars" -for __var in "${__template_vars[@]}"; do - splitvar "$__var" __name __value - update_var "$__name" "$__value" -done -array_contains TEMPLATE_VARS configdir || update_var configdir "$__templatectl_destdir" - -# mettre à jour les variables -__modified= -for __var in "${__vars[@]}"; do - splitvar "$__var" __name __value - update_var "$__name" "$__value" && __modified=1 -done - -# enregistrer les valeurs des variables -if [ -n "$__write_vars" ]; then - [ -f "$__runsconfig_vars" ] && - die "Refus d'écraser le fichier existant $(ppath "$__runsconfig_vars")" - - echo "# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8" >"$__runsconfig_vars" - echo "__template_vars=(" >>"$__runsconfig_vars" - for __var in "${TEMPLATE_VARS[@]}"; do - echo_setv "$__var=${!__var}" >>"$__runsconfig_vars" - done - echo ")" >>"$__runsconfig_vars" +if [ -z "$host" ]; then + [ -n "$host" ] || host="$1" + [ -n "$host" ] || host="$DEFAULT_HOST" + __template_set_var host "$host" fi -# afficher les variables -if [ -n "$__list_vars" ]; then - echo "# template vars" - for __var in "${TEMPLATE_VARS[@]}"; do - echo_setv "$__var=${!__var}" - done -fi +################################################################################ +if [ "$action" == create ]; then + if [ -n "$autocreate" -a ! -d "$destdir" ]; then + estepn "Création automatique de $(ppath "$destdir")" + mkdir -p "$destdir" || die + fi + [ -d "$destdir" ] || die "$destdir: répertoire introuvable" -# gérer les fichiers template et locaux -if [ -z "$__templatectl_opt" -a -z "$__list_vars" -a -z "$__write_vars" ]; then - __templatectl_auto=1 + read_value ${host:+-i} "Veuillez entrer le nom d'hôte" host "$host" + __template_set_var host "$host" + + templatectl -d "$destdir" --no-load-vars -m + +################################################################################ +elif [ "$action" == template ]; then + __TEMPLATECTL_HELP="USAGE: $scriptname -t -- args... + +$__TEMPLATECTL_HELP" + templatectl -d "$destdir" --no-load-vars ${templateopt:+-$templateopt} "$@" fi -[ -d "$__templatectl_destdir" ] || die "$__templatectl_destdir: répertoire introuvable" -__templatectl_do "$@"