394 lines
15 KiB
Bash
Executable File
394 lines
15 KiB
Bash
Executable File
#!/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 template apache.tools
|
|
apacheconfig_initvars
|
|
|
|
function display_help() {
|
|
uecho "$scriptname: Gérer la configuration d'un serveur web apache
|
|
|
|
USAGE
|
|
$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.
|
|
-f,--full
|
|
--partial
|
|
Indiquer respectivement que la configuration est complète ou partielle.
|
|
Avec la configuration complète, le serveur peut être complètement
|
|
configuré avec tous les fichiers présents. Avec la configuration
|
|
partielle, uniquement les informations spécifiques à un service en
|
|
particulier sont disponibles.
|
|
Cette option est utilisée avec --create. Par défaut, la configuration
|
|
est partielle.
|
|
Pour le moment, la seule différence est que --full crée un fichier de
|
|
configuration nommé .apacheconfig alors que --partial crée un fichier
|
|
nommé apacheconfig.conf qui est visible et donc découvrable et éditable
|
|
plus facilement
|
|
|
|
-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
|
|
--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.
|
|
|
|
-u, --update, --deploy
|
|
Mettre à jour la configuration système à partir du répertoire local.
|
|
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
|
|
-p, --fix-ip
|
|
Corriger les lignes de la forme '<VirtualHost *:PORT>#*ip:IP' et les
|
|
remplacer par '<VirtualHost IP:PORT>'
|
|
Cela permet de déployer une version de production des fichiers de
|
|
configuration.
|
|
-N, --network-config
|
|
Mettre aussi à jour la configuration réseau.
|
|
-r, --certsdir CERTSDIR
|
|
Spécifier le cas échéant le répertoire contenant les certificats à
|
|
déployer. Cet argument est requis si le répertoire certsconf/ existe,
|
|
sauf si les certificats sont déjà déployés.
|
|
|
|
--localhosts
|
|
Créer dans le fichier /etc/hosts tous les noms d'hôte ayant un suffixe
|
|
.local mentionnés dans les fichiers de site. Cette option est utile pour
|
|
le développement et les tests.
|
|
-C, --one-conf CONF
|
|
Ne déployer que le fichier de configuration spécifié. Cette option est
|
|
utilisée avec --deploy et est utile pour le développement et les tests.
|
|
-M, --one-module MODULE
|
|
Ne déployer que le fichier de module spécifié. Cette option est utilisée
|
|
avec --deploy et est utile pour le développement et les tests.
|
|
-S, --one-site SITE
|
|
Ne déployer que le fichier de site spécifié. Cette option est utilisée
|
|
avec --deploy ou --localhosts et est utile pour le développement et les
|
|
tests.
|
|
|
|
-k, --new-site HOST.TLD
|
|
Créer une définition pour un nouveau site à partir des fichiers du
|
|
répertoires templates/
|
|
-K, --new-site-templatedir TEMPLATEDIR
|
|
Spécifier le répertoire source pour les templates de site utilisés par
|
|
l'option --new-site. Par défaut, utiliser le répertoire templates/ situé
|
|
dans le répertoire de configuration.
|
|
Si TEMPLATEDIR est un nom simple sans séparateur de chemin '/' et qu'un
|
|
répertoire templates/TEMPLATEDIR existe, alors prendre ce répertoire-là
|
|
comme source.
|
|
--new-site-force
|
|
Avec --new-site, utiliser le nom d'hôte fourni même s'il n'est pas
|
|
pleinement qualifié"
|
|
}
|
|
|
|
action=
|
|
destdir=
|
|
nohideconfig=auto
|
|
templateopt=
|
|
FULLCONF=
|
|
fixip=
|
|
netconf=
|
|
aac_certsdir=
|
|
bits=
|
|
oneconf=
|
|
onemodule=
|
|
onesite=
|
|
site_host=
|
|
site_templdir=
|
|
site_force=
|
|
args=(
|
|
--help '$exit_with display_help'
|
|
-c,--create action=create
|
|
-d:,--destdir: destdir=
|
|
--no-hideconfig nohideconfig=1
|
|
--hideconfig nohideconfig=
|
|
-f,--full FULLCONF=1
|
|
--partial FULLCONF=
|
|
-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'
|
|
--bits: bits=
|
|
-u,--update,--deploy action=deploy
|
|
-p,--fix-ip fixip=1
|
|
-N,--network-config netconf=1
|
|
-r:,--certsdir: aac_certsdir=
|
|
--localhosts action=localhosts
|
|
-C:,--one-conf: oneconf=
|
|
-M:,--one-module: onemodule=
|
|
-S:,--one-site: onesite=
|
|
-k:,--new-site: '$action=new-site; set@ site_host'
|
|
-K:,--new-site-templatedir: site_templdir=
|
|
--new-site-force site_force=
|
|
)
|
|
parse_args "$@"; set -- "${args[@]}"
|
|
|
|
if [ "$nohideconfig" == auto ]; then
|
|
[ -n "$FULLCONF" ] && nohideconfig= || nohideconfig=1
|
|
fi
|
|
|
|
apacheconfig_loadconf "$destdir" "$nohideconfig" || die
|
|
apacheconfig_sysinfos "$sysname" "$sysdist" "$sysver" "$bits"
|
|
|
|
################################################################################
|
|
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"
|
|
|
|
[ -n "$host" ] || host="$1"
|
|
if [ -n "$host" ]; then
|
|
read_value -i "Veuillez entrer le nom d'hôte" host "$host"
|
|
else
|
|
check_interaction -c && einfo "Vous pouvez entrer un nom d'hôte spécifique pour la nouvelle configuration, ou laisser la valeur par défaut @@dhost@@ pour qu'il soit calculé dynamiquement lors du déploiement"
|
|
read_value "Veuillez entrer le nom d'hôte" host @@dhost@@
|
|
fi
|
|
__template_set_var host "$host"
|
|
|
|
if [ -f "$config" ]; then
|
|
ask_yesno "Le fichier $(ppath "$config") sera écrasé. Voulez-vous continuer?" O || die
|
|
rm -f "$config" || die
|
|
fi
|
|
templatectl -d "$destdir" --config "$config" ${nohideconfig:+--no-hide-config} --no-load-vars -m --write-vars
|
|
|
|
################################################################################
|
|
elif [ "$action" == template ]; then
|
|
__TEMPLATECTL_HELP="USAGE: $scriptname -t -- args...
|
|
|
|
$__TEMPLATECTL_HELP"
|
|
templatectl -d "$destdir" --config "$config" --no-load-vars ${templateopt:+-$templateopt} "$@"
|
|
|
|
################################################################################
|
|
elif [ "$action" == deploy -o "$action" == localhosts ]; then
|
|
[ -d "$destdir" ] || die "$destdir: répertoire introuvable"
|
|
|
|
args=(
|
|
-d "$destdir" --$action
|
|
${fixip:+--fix-ip}
|
|
${netconf:+--network-config}
|
|
${aac_certsdir:+-r "$aac_certsdir"}
|
|
${oneconf:+--one-conf "$oneconf"}
|
|
${onemodule:+--one-module "$onemodule"}
|
|
${onesite:+--one-site "$onesite"}
|
|
)
|
|
# sur une ligne séparée parce que $bits peut être vide
|
|
[ -n "$custom_sysinfos" ] && array_add args --sysname "$sysname" --sysdist "$sysdist" --sysver "$sysver" --bits "$bits"
|
|
for __name in "${TEMPLATE_DYNAMIC_VARS[@]}"; do
|
|
array_add args -v "$__name=${!__name}"
|
|
done
|
|
array_add args -- "$@"
|
|
run_as_root "${args[@]}"
|
|
|
|
if [ "$action" == deploy ]; then
|
|
etitle "Mise à jour du système"
|
|
apacheconfig_deploy \
|
|
"$destdir" "$aac_certsdir" \
|
|
"$config" "$oneconf" "$onemodule" "$onesite" \
|
|
"$custom_sysinfos" "$sysname" "$sysdist" "$sysver" "$bits" \
|
|
"$netconf" "$fixip" || die
|
|
eend
|
|
elif [ "$action" == localhosts ]; then
|
|
etitle "Mise à jour de /etc/hosts"
|
|
apacheconfig_localhosts "$destdir" "$aac_certsdir" "$onesite" || die
|
|
eend
|
|
fi
|
|
|
|
################################################################################
|
|
elif [ "$action" == new-site ]; then
|
|
host="$site_host"
|
|
templdir="$site_templdir"
|
|
|
|
if [ -z "$templdir" -a -d "$destdir/templates" ]; then
|
|
# si on ne précise pas le template à utiliser, alors afficher
|
|
# éventuellement un menu si plusieurs templates sont disponibles
|
|
templdirs=()
|
|
if [ -n "$(list_all "$destdir/templates" "*SITE*")" ]; then
|
|
array_add templdirs templates
|
|
templdir=templates
|
|
fi
|
|
array_from_lines stempldirs "$(list_dirs "$destdir/templates" | grep -v SITE)"
|
|
for stempldir in "${stempldirs[@]}"; do
|
|
if [ -n "$(list_all "$destdir/templates/$stempldir" "*SITE*")" ]; then
|
|
array_add templdirs "templates/$stempldir"
|
|
[ -n "$templdir" ] || templdir="templates/$stempldir"
|
|
fi
|
|
done
|
|
if [ ${#templdirs[*]} -gt 1 ]; then
|
|
simple_menu templdir templdirs -t "Choix du répertoire des modèles" -m "Veuillez choisir le modèle à utiliser"
|
|
fi
|
|
templdir="$destdir/$templdir"
|
|
fi
|
|
|
|
if [[ "$templdir" != */* ]] && [ -d "$destdir/templates/$templdir" ]; then
|
|
templdir="$destdir/templates/$templdir"
|
|
elif [ -z "$templdir" ]; then
|
|
templdir="$destdir/templates"
|
|
fi
|
|
[ -d "$templdir" ] || die "$templdir: répertoire introuvable"
|
|
force="$site_force"
|
|
|
|
clrtempl=
|
|
ssltempl=
|
|
certstempl=
|
|
wwwtempl=
|
|
array_from_lines clrtempls "$(list_files "$templdir" "*SITE*.conf")"
|
|
array_from_lines ssltempls "$(list_files "$templdir" "*SITE*.ssl.conf")"
|
|
array_from_lines certstempls "$(list_files "$templdir" "*SITE*-certs.conf")"
|
|
for xtempl in "${ssltempls[@]}" "${certstempls[@]}"; do
|
|
array_del clrtempls "$xtempl"
|
|
done
|
|
[ ${#clrtempls[*]} -gt 0 ] && clrtempl="${clrtempls[0]}"
|
|
[ ${#ssltempls[*]} -gt 0 ] && ssltempl="${ssltempls[0]}"
|
|
[ ${#certstempls[*]} -gt 0 ] && certstempl="${certstempls[0]}"
|
|
array_from_lines wwwtempls "$(list_dirs "$templdir" "*SITE*")"
|
|
[ ${#wwwtempls[*]} -gt 0 ] && wwwtempl="${wwwtempls[0]}"
|
|
|
|
found=
|
|
for i in "$clrtempl" "$ssltempl" "$certstempl" "$wwwtempl"; do
|
|
[ -n "$i" ] && { found=1; break; }
|
|
done
|
|
[ -n "$found" ] || die "Aucun template disponible"
|
|
|
|
if [ -z "$force" ] && [[ "$host" != *.* ]]; then
|
|
die "$host n'est pas un nom d'hôte pleinement qualifié"
|
|
fi
|
|
|
|
hostip=
|
|
for i in "$clrtempl" "$ssltempl"; do
|
|
[ -n "$i" -a -f "$templdir/$i" ] || continue
|
|
quietgrep SITE_IP "$templdir/$i" && { hostip=1; break; }
|
|
done
|
|
if [ -n "$hostip" ]; then
|
|
# Il y a un champ SITE_IP, il faut demander à l'utilisateur l'adresse ip
|
|
# correspondante
|
|
[[ "$host" == *.* ]] && hostdomain="${host#*.}" || hostdomain=
|
|
pri=
|
|
hostip=
|
|
i=0
|
|
while [ $i -lt ${#PUBDOMAINS[*]} ]; do
|
|
if [ "${PUBDOMAINS[$i]}" == "$hostdomain" ]; then
|
|
pri="$VSPREFIX${host%$hostdomain}${PRIDOMAINS[$i]}"
|
|
resolv_ips ips "$pri"
|
|
if [ -n "$ips" ]; then
|
|
hostip="${ips[0]}"
|
|
break
|
|
fi
|
|
fi
|
|
i=$(($i + 1))
|
|
done
|
|
if [ -z "$hostip" ]; then
|
|
pri="$VSPREFIX$host"
|
|
resolv_ips ips "$pri"
|
|
[ -n "$ips" ] && hostip="${ips[0]}"
|
|
fi
|
|
if [ -n "$pri" -a -n "$hostip" ]; then
|
|
enote "Correspondance automatique $host --> $pri"
|
|
read_value "Veuillez confirmer l'adresse IP d'écoute" hostip "$hostip" N
|
|
else
|
|
enote "Vous devez saisir l'adresse IP privée correspondant à $host"
|
|
read_value "Veuillez entrer l'adresse IP *privée* d'écoute" hostip "" N
|
|
fi
|
|
[ -n "$hostip" ] || ewarn "Vous avez choisi de ne pas spécifier d'adresse IP d'écoute. Il faudra corriger manuellement les fichiers générés"
|
|
fi
|
|
|
|
etitle "$host"
|
|
hostname="${host%%.*}"
|
|
clrconf="${clrtempl/SITE/$hostname}"
|
|
sslconf="${ssltempl/SITE/$hostname}"
|
|
certsconf="${certstempl/SITE/$hostname}"
|
|
wwwdir="${wwwtempl/SITE/$hostname}"
|
|
|
|
mkdir -p "$destdir/certsconf"
|
|
mkdir -p "$destdir/sites"
|
|
|
|
sedscript=
|
|
[ -n "$hostip" ] && sedscript="$sedscript
|
|
s/SITE_IP/$hostip/g"
|
|
sedscript="$sedscript
|
|
s/SITE.TLD/$host/g
|
|
s/SITE/$hostname/g"
|
|
|
|
if [ -z "$clrtempl" ]; then
|
|
:
|
|
elif [ ! -f "$templdir/$clrtempl" ]; then
|
|
ewarn "Le fichier $(ppath "$templdir/$clrtempl") n'existe pas. La copie ne sera pas complète"
|
|
elif [ -f "$destdir/sites/$clrconf" ]; then
|
|
ewarn "Le fichier sites/$clrconf existe déjà. Il ne sera pas écrasé."
|
|
else
|
|
estep "sites/$clrconf"
|
|
sed "$sedscript" "$templdir/$clrtempl" >"$destdir/sites/$clrconf" || die
|
|
fi
|
|
|
|
if [ -z "$ssltempl" ]; then
|
|
:
|
|
elif [ ! -f "$templdir/$ssltempl" ]; then
|
|
ewarn "Le fichier $(ppath "$templdir/$ssltempl") n'existe pas. La copie ne sera pas complète"
|
|
elif [ -f "$destdir/sites/$sslconf" ]; then
|
|
ewarn "Le fichier sites/$sslconf existe déjà. Il ne sera pas écrasé."
|
|
else
|
|
estep "sites/$sslconf"
|
|
sed "$sedscript" "$templdir/$ssltempl" >"$destdir/sites/$sslconf" || die
|
|
fi
|
|
|
|
if [ -z "$certstempl" ]; then
|
|
:
|
|
elif [ ! -f "$templdir/$certstempl" ]; then
|
|
ewarn "Le fichier $(ppath "$templdir/$certstempl") n'existe pas. La copie ne sera pas complète"
|
|
elif [ -f "$destdir/certsconf/$certsconf" ]; then
|
|
ewarn "Le fichier certsconf/$certsconf exite déjà. Il ne sera pas écrasé."
|
|
else
|
|
estep "certsconf/$certsconf"
|
|
sed "$sedscript" "$templdir/$certstempl" >"$destdir/certsconf/$certsconf" || die
|
|
fi
|
|
|
|
if [ -z "$wwwtempl" ]; then
|
|
:
|
|
elif [ ! -d "$templdir/$wwwtempl" ]; then
|
|
ewarn "Le répertoire $(ppath "$templdir/$wwwtempl") n'existe pas. La copie ne sera pas complète"
|
|
elif [ -d "$destdir/$wwwdir" ]; then
|
|
ewarn "Le répertoire $wwwdir existe déjà. Il ne sera pas écrasé."
|
|
else
|
|
estep "$wwwdir"
|
|
cpdirnovcs "$templdir/$wwwtempl" "$destdir/$wwwdir" || die
|
|
sed -i "$sedscript" "$destdir/$wwwdir/.udir" || die
|
|
fi
|
|
|
|
eend
|
|
|
|
if [ -n "$wwwtempl" ]; then
|
|
eimportant "Ne pas oublier le cas échéant de mettre à jour HTDMAPPINGS dans $(ppath "$config") e.g.
|
|
HTDMAPPINGS=($wwwdir)"
|
|
fi
|
|
fi
|