2014-10-23 15:47:21 +04:00
#!/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
2014-10-23 21:26:42 +04:00
urequire DEFAULTS template apache.tools
2016-08-18 17:01:49 +04:00
apacheconfig_initvars
2014-10-23 15:47:21 +04:00
function display_help() {
2015-10-29 12:43:19 +04:00
uecho "$scriptname: Gérer la configuration d'un serveur web apache
2014-10-23 15:47:21 +04:00
USAGE
2015-10-29 12:43:19 +04:00
$scriptname -c
$scriptname -t -- args...
2014-10-23 15:47:21 +04:00
OPTIONS
2015-10-29 12:43:19 +04:00
-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.
2016-12-30 18:10:59 +04:00
-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
2015-10-29 12:43:19 +04:00
-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
2015-07-17 16:22:21 +04:00
--help-template
2015-10-29 12:43:19 +04:00
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.
2015-07-17 16:22:21 +04:00
-u, --update, --deploy
Mettre à jour la configuration système à partir du répertoire local.
2015-10-29 12:43:19 +04:00
Lors du déploiement de la configuration, les valeurs des variables
2015-07-17 16:22:21 +04:00
dynamiques sont remplacées dans les fichiers destination.
2015-10-29 12:43:19 +04:00
Les arguments qui restent sont passés tels quels à apache_autoconf
2017-06-20 13:09:23 +04:00
-p, --pull
Faire 'git pull' avant --update
-F, --fix-ip
2017-03-24 15:06:40 +04:00
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.
2016-12-30 18:10:59 +04:00
-N, --network-config
Mettre aussi à jour la configuration réseau.
2015-07-17 16:22:21 +04:00
-r, --certsdir CERTSDIR
Spécifier le cas échéant le répertoire contenant les certificats à
2016-12-30 18:10:59 +04:00
déployer. Cet argument est requis si le répertoire certsconf/ existe,
sauf si les certificats sont déjà déployés.
2015-12-07 04:43:46 +04:00
--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
2015-12-07 11:14:29 +04:00
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
2016-12-30 18:10:59 +04:00
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é"
2015-07-17 16:22:21 +04:00
}
2015-10-29 12:43:19 +04:00
action=
destdir=
2016-12-30 18:10:59 +04:00
nohideconfig=auto
2015-10-29 12:43:19 +04:00
templateopt=
2016-12-30 18:10:59 +04:00
FULLCONF=
2017-06-20 13:09:23 +04:00
pull=
2017-03-24 15:06:40 +04:00
fixip=
2016-12-30 18:10:59 +04:00
netconf=
2015-11-02 10:59:48 +04:00
aac_certsdir=
2015-12-24 09:58:09 +04:00
bits=
2015-12-07 04:43:46 +04:00
oneconf=
onemodule=
onesite=
2016-12-30 18:10:59 +04:00
site_host=
site_templdir=
site_force=
2015-10-29 12:43:19 +04:00
args=(
--help '$exit_with display_help'
-c,--create action=create
-d:,--destdir: destdir=
2015-10-30 21:46:49 +04:00
--no-hideconfig nohideconfig=1
--hideconfig nohideconfig=
2016-12-30 18:10:59 +04:00
-f,--full FULLCONF=1
--partial FULLCONF=
2015-10-29 12:43:19 +04:00
-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'
2015-12-24 09:58:09 +04:00
--bits: bits=
2015-10-29 12:43:19 +04:00
-u,--update,--deploy action=deploy
2017-06-20 13:09:23 +04:00
-p,--pull pull=1
-F,--fix-ip fixip=1
2016-12-30 18:10:59 +04:00
-N,--network-config netconf=1
2015-11-02 10:59:48 +04:00
-r:,--certsdir: aac_certsdir=
2015-12-07 04:43:46 +04:00
--localhosts action=localhosts
2015-12-07 11:14:29 +04:00
-C:,--one-conf: oneconf=
-M:,--one-module: onemodule=
-S:,--one-site: onesite=
2016-12-30 18:10:59 +04:00
-k:,--new-site: '$action=new-site; set@ site_host'
-K:,--new-site-templatedir: site_templdir=
--new-site-force site_force=
2014-10-23 15:47:21 +04:00
)
2015-10-29 12:43:19 +04:00
parse_args "$@"; set -- "${args[@]}"
2016-12-30 18:10:59 +04:00
if [ "$nohideconfig" == auto ]; then
[ -n "$FULLCONF" ] && nohideconfig= || nohideconfig=1
fi
2017-06-20 13:11:30 +04:00
if [ -n "$pull" ]; then
estep "Mise à jour du dépôt"
2017-06-20 13:17:30 +04:00
if [ -n "$destdir" ]; then
[ -d "$destdir" ] || die "$destdir: répertoire introuvable"
(cd "$destdir" && git pull) || die
else
git pull || die
fi
2017-06-20 13:11:30 +04:00
fi
2016-12-30 18:10:59 +04:00
apacheconfig_loadconf "$destdir" "$nohideconfig" || die
2016-08-18 17:01:49 +04:00
apacheconfig_sysinfos "$sysname" "$sysdist" "$sysver" "$bits"
2014-10-24 00:34:53 +04:00
2015-10-29 12:43:19 +04:00
################################################################################
if [ "$action" == create ]; then
if [ -n "$autocreate" -a ! -d "$destdir" ]; then
estepn "Création automatique de $(ppath "$destdir")"
mkdir -p "$destdir" || die
2014-11-29 22:11:51 +04:00
fi
2015-10-29 12:43:19 +04:00
[ -d "$destdir" ] || die "$destdir: répertoire introuvable"
2014-10-24 00:34:53 +04:00
2015-11-02 10:59:48 +04:00
[ -n "$host" ] || host="$1"
2015-10-30 21:46:49 +04:00
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"
2015-10-29 12:43:19 +04:00
if [ -f "$config" ]; then
2015-10-30 21:46:49 +04:00
ask_yesno "Le fichier $(ppath "$config") sera écrasé. Voulez-vous continuer?" O || die
2015-10-29 12:43:19 +04:00
rm -f "$config" || die
2014-10-23 15:47:21 +04:00
fi
2016-12-30 18:10:59 +04:00
templatectl -d "$destdir" --config "$config" ${nohideconfig:+--no-hide-config} --no-load-vars -m --write-vars
2015-10-29 12:43:19 +04:00
################################################################################
elif [ "$action" == template ]; then
__TEMPLATECTL_HELP="USAGE: $scriptname -t -- args...
$__TEMPLATECTL_HELP"
2015-10-30 21:46:49 +04:00
templatectl -d "$destdir" --config "$config" --no-load-vars ${templateopt:+-$templateopt} "$@"
2015-10-29 12:43:19 +04:00
################################################################################
2015-12-07 04:43:46 +04:00
elif [ "$action" == deploy -o "$action" == localhosts ]; then
2015-10-29 12:43:19 +04:00
[ -d "$destdir" ] || die "$destdir: répertoire introuvable"
2014-10-23 15:47:21 +04:00
2015-12-07 04:43:46 +04:00
args=(
2016-12-30 18:10:59 +04:00
-d "$destdir" --$action
2017-03-24 15:06:40 +04:00
${fixip:+--fix-ip}
2016-12-30 18:10:59 +04:00
${netconf:+--network-config}
${aac_certsdir:+-r "$aac_certsdir"}
2015-12-07 04:43:46 +04:00
${oneconf:+--one-conf "$oneconf"}
${onemodule:+--one-module "$onemodule"}
${onesite:+--one-site "$onesite"}
)
2016-03-08 11:51:46 +04:00
# 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"
2015-10-29 12:43:19 +04:00
for __name in "${TEMPLATE_DYNAMIC_VARS[@]}"; do
2014-11-29 23:02:48 +04:00
array_add args -v "$__name=${!__name}"
done
2015-10-29 12:43:19 +04:00
array_add args -- "$@"
2014-10-23 15:47:21 +04:00
run_as_root "${args[@]}"
2015-12-07 04:43:46 +04:00
if [ "$action" == deploy ]; then
etitle "Mise à jour du système"
2016-08-18 17:01:49 +04:00
apacheconfig_deploy \
"$destdir" "$aac_certsdir" \
"$config" "$oneconf" "$onemodule" "$onesite" \
2016-12-30 18:10:59 +04:00
"$custom_sysinfos" "$sysname" "$sysdist" "$sysver" "$bits" \
2017-03-24 15:06:40 +04:00
"$netconf" "$fixip" || die
2016-08-18 17:01:49 +04:00
eend
2015-12-07 04:43:46 +04:00
elif [ "$action" == localhosts ]; then
etitle "Mise à jour de /etc/hosts"
2017-03-23 12:15:27 +04:00
apacheconfig_localhosts "$destdir" "$aac_certsdir" "$onesite" || die
2016-08-18 17:01:49 +04:00
eend
2015-12-07 04:43:46 +04:00
fi
2016-12-30 18:10:59 +04:00
################################################################################
elif [ "$action" == new-site ]; then
host="$site_host"
templdir="$site_templdir"
2017-02-20 22:31:12 +04:00
2017-02-21 19:19:07 +04:00
if [ -z "$templdir" -a -d "$destdir/templates" ]; then
2017-02-20 22:31:12 +04:00
# si on ne précise pas le template à utiliser, alors afficher
# éventuellement un menu si plusieurs templates sont disponibles
2017-02-21 19:19:07 +04:00
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"
2017-02-20 22:31:12 +04:00
fi
2016-12-30 18:10:59 +04:00
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=
2017-03-24 17:14:11 +04:00
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]}"
2016-12-30 18:10:59 +04:00
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
2017-03-24 09:42:38 +04:00
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
2016-12-30 18:10:59 +04:00
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"
2017-03-24 09:42:38 +04:00
sedscript=
[ -n "$hostip" ] && sedscript="$sedscript
s/SITE_IP/$hostip/g"
sedscript="$sedscript
2016-12-30 18:10:59 +04:00
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
2014-10-23 15:47:21 +04:00
fi