nutools/apacheconfig

296 lines
11 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
function display_help() {
uecho "$scriptname: Gérer une configuration apache pour déploiement
USAGE
$scriptname [options]
OPTIONS
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à
-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 la valeur par défaut des variables prédéfinies
--write-vars
Forcer l'écriture des valeurs actuelles des variables dans le fichier
.apacheconfig, ce qui permet d'éviter de les spécifier à chaque fois
avec l'option -v
-v, --var NAME=VALUE
Spécifier la valeur d'une variable. Il est possible de spécifier des
valeurs qui ne sont pas dans la liste prédéfinie.
Le répertoire local peut contenir les fichiers et répertoires suivants, qui sont
tous optionnels:
- 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
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.
-r, --certsdir CERTSDIR
Spécifier le cas échéant le répertoire contenant les certificats à
déployer.
OPTIONS AVANCEES
--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 __templatectl_display_help() { display_help; }
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
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
fi
dir="$(dirname -- "$dir")"
done
}
setx host=myhost
setx hostname=myhostname
aliases="$hostname"
admin=supervision-gdrsi@listes.univ-reunion.fr
certsdir=renater
caname=terena.crt
certname=
keyname=
TEMPLATE_VARS=(
host hostname aliases admin
certsdir caname certname keyname
)
function update_template_var() {
# mettre à jour la valeur d'une variable en tenant compte de certaines
# dépendances. par exemple, si on modifie host, il faut mettre à jour
# hostname.
local __orig_value="${!1}"
array_addu TEMPLATE_VARS "$1"
setv "$1" "$2"
local __update_aliases
case "$1" in
host)
[ "$aliases" == "$hostname" ] && __update_aliases=1
hostname="${host%%.*}"
[ -n "$__update_aliases" ] && aliases="$hostname"
;;
esac
[ "$2" != "$__orig_value" ]
}
__vars=()
__list_vars=
__write_vars=
__deploy=
__certsdir=
__confdir=
__modulesdir=
__sitesdir=
__cgibindir=
__wwwdir=
__certsconfdir=
__rrdir=
__restart=1
__TEMPLATECTL_SUPPLOPTS=(
-v:,--var: __vars
--list-vars __list_vars=1
--write-vars __write_vars=1
-u,--update,--deploy __deploy=1
-r:,--certsdir: __certsdir=
--confdir: __confdir=
--modulesdir: __modulesdir=
--sitesdir: __sitesdir=
--cgibindir: __cgibindir=
--wwwdir: __wwwdir=
--certsconfdir: __certsconfdir=
--rrdir: __rrdir=
--restart __restart=1
--no-restart __restart=
)
__templatectl_parseopts "$@" && \
set -- "${args[@]}" || die "$args"
# répertoire source
setx __templatectl_srcdir=templatesrc apacheconfig
# répertoire de référence
__autocreate=
if [ -z "$__templatectl_destdir" ]; then
if [ -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
fi
fi
# charger les variables
__apacheconfig_vars="$__templatectl_destdir/.apacheconfig"
if [ -f "$__apacheconfig_vars" ]; then
source "$__apacheconfig_vars"
for __var in "${__apacheconfig[@]}"; do
splitvar "$__var" __name __value
update_template_var "$__name" "$__value"
done
fi
# mettre à jour les variables
__modified=
for __var in "${__vars[@]}"; do
splitvar "$__var" __name __value
update_template_var "$__name" "$__value" && __modified=1
done
# enregistrer les valeurs des variables
if [ -n "$__modified" -o "$__write_vars" ]; then
>"$__apacheconfig_vars"
echo "__apacheconfig=(" >>"$__apacheconfig_vars"
for __var in "${TEMPLATE_VARS[@]}"; do
echo_setv "$__var=${!__var}" >>"$__apacheconfig_vars"
done
echo ")" >>"$__apacheconfig_vars"
fi
# afficher les variables
if [ -n "$__list_vars" ]; then
for __var in "${TEMPLATE_VARS[@]}"; do
echo_setv "$__var=${!__var}"
done
fi
# Gérer les templates et fichiers locaux
if [ -z "$__templatectl_opt" -a -z "$__list_vars" -a -z "$__write_vars" -a -z "$__deploy" ]; then
__templatectl_opt=1
__templatectl_auto=1
fi
if [ -n "$__templatectl_opt" ]; then
if [ -n "$__autocreate" -a ! -d "$__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
# 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"}
)
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"}
)
apache_autoconf "${args[@]}" || die
eend
fi