re-écrire la gestion des templates pour apacheconfig et runsconfig

This commit is contained in:
Jephté Clain 2015-10-29 12:43:19 +04:00
parent 702c75317d
commit 93ac7ea005
16 changed files with 966 additions and 660 deletions

View File

@ -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

View File

@ -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= \

View File

@ -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

View File

@ -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[@]}" -- "$@"
}

View File

@ -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

View File

@ -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:

View File

@ -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:

View File

@ -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 <VirtualHost *:443>
# 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@@
</IfModule>
<IfModule mod_gnutls.c>
NameVirtualHost 10.82.80.100:443
Listen 10.82.80.100:443
#NameVirtualHost IP:443
#Listen IP:443
#@@ips_namevirtualhosts@@
#@@ips_listens@@
</IfModule>

View File

@ -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

View File

@ -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
<IfModule ssl_module>
Listen 443
#NameVirtualHost IP:443
#Listen IP:443
#@@ips_namevirtualhosts@@
#@@ips_listens@@
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
#NameVirtualHost IP:443
#Listen IP:443
#@@ips_namevirtualhosts@@
#@@ips_listens@@
</IfModule>

View File

@ -0,0 +1,31 @@
# -*- coding: utf-8 mode: conf -*- vim:syntax=apache:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
<VirtualHost *:80>
# 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
</VirtualHost>

View File

@ -0,0 +1,137 @@
# -*- coding: utf-8 mode: conf -*- vim:syntax=apache:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
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
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
# 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
</VirtualHost>
</IfModule>

View File

@ -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
# Chaque ligne contient le nom du script suivi des arguments éventuels

View File

@ -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 "$@"