diff --git a/apacheconfig b/apacheconfig new file mode 100755 index 0000000..0cfcfc0 --- /dev/null +++ b/apacheconfig @@ -0,0 +1,217 @@ +#!/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 apache.config + +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 avant le déploiement. Ce répertoire est aussi appelé +répertoire local. + -d, --destdir DESTDIR + Spécifier le répertoire de référence dans lequel copier la configuration + apache. + -l, --list + Lister les templates disponibles. + -m, --merge + Copier les templates spécifiés dans le répertoire de référence s'il + n'y existent pas déjà + -z, --unmerge + Supprimer les fichiers du répertoire de référence 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 de référence. + +Le répertoire de référence 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 de +référence sur le système. + -u, --update + Mettre à jour la configuration système à partir du répertoire de + référence. + -r, --certsdir CERTSDIR + Spécifier le cas échéant le répertoire contenant les certificats à + déployer. + +IMPORTANT: les fonctions de déploiement ne sont pour le moment supportées que +sur debian + +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 de référence. + --modulesdir MODULESDIR + Spécifier l'emplacement des fichiers de configuration des modules. + Par défaut, utiliser AUTOCONFDIR/modules si ce répertoire existe. + --sitesdir SITESDIR + Spécifier l'emplacement des fichiers de configuration des sites. + Par défaut, utiliser AUTOCONFDIR/sites si ce répertoire existe. + --cgibindir CGIBINDIR + Spécifier l'emplacement des scripts cgi à installer. + Par défaut, utiliser AUTOCONFDIR/cgi-bin si ce répertoire existe. + --wwwdir WWWDIR + Spécifier l'emplacement des fichiers du serveur web + Par défaut, utiliser AUTOCONFDIR/www si ce répertoire existe. + --certsconfdir CERTSCONFDIR + Spécifier l'emplacement des fichiers de configuration des certificats. + Par défaut, utiliser AUTOCONFDIR/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 AUTOCONFDIR/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 +} + +update= +certsdir= +confdir= +modulesdir= +sitesdir= +cgibindir= +wwwdir= +certsconfdir= +rrdir= +restart=1 +__TEMPLATECTL_OTHER_OPTS=( + -u,--update update=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 +srcdir="$ULIBDIR/support/apacheconfig.template" +# répertoire de référence +autocreate= +if [ -z "$destdir" ]; then + if [ -d apacheconfig ]; then + destdir=apacheconfig + elif setx destdir=parent_apacheconfig; then + estepn "Sélection automatique de $(ppath "$destdir")" + elif [ -e apacheconfig ]; then + die "Vous devez spécifier le répertoire de référence avec -d" + else + destdir=apacheconfig + autocreate=1 + fi +fi + +if [ -z "$update" -a -z "$templatectl_opt" ]; then + templatectl_opt=1 + templatectl_auto=1 +fi +if [ -n "$templatectl_opt" ]; then + etitle "Mise à jour du répertoire de référence" + 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" + __templatectl_do "$@" + eend +fi + +if [ -n "$update" ]; then + args=( + -d "$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 "$destdir" ] || die "$destdir: répertoire introuvable" + args=("$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 diff --git a/lib/ulib/apache b/lib/ulib/apache index 3b99bb5..17612f0 100644 --- a/lib/ulib/apache +++ b/lib/ulib/apache @@ -245,443 +245,3 @@ function get_CGIBINDIR_prefix() { __compute_apache_prefixes echo "$CGIBINDIR" } - -function __apache_resolvcert() { - [ -n "$__rc_dir" ] || __rc_dir="$(dirname "$__rc_conf")" - eval "$( - source "$__rc_conf" - set_var_cmd __rc_cert "$cert" - set_var_cmd __rc_key "$key" - set_var_cmd __rc_ca "$ca" - )" - [ -n "$__rc_cert" ] && __rc_cert="$(abspath "$__rc_cert" "$__rc_dir")" - [ -n "$__rc_key" ] && __rc_key="$(abspath "$__rc_key" "$__rc_dir")" - [ -n "$__rc_ca" ] && __rc_ca="$(abspath "$__rc_ca" "$__rc_dir")" -} - -function __apache_checkvars() { - if [ -n "$__rc_cert" -a -z "$__rc_key" ]; then - local __rc_name __rc_ext - splitname "$__rc_cert" __rc_name __rc_ext - if [ "$__rc_ext" == "crt" -o "$__rc_ext" == "pem" ]; then - __rc_key="$__rc_name.key" - enote "La clé privée n'a pas été spécifiée. La valeur $(ppath "$__rc_key") sera utilisée" - else - eerror "Impossible de trouver la clé privée correspondant au certificat $(ppath "$__rc_cert")" - return 1 - fi - fi - if [ -z "$__rc_cert" -a -z "$__rc_ca" ]; then - eerror "Vous devez spécifier le certificat à installer" - return 1 - elif [ -z "$__rc_cert" ]; then - eattention "Seul le certificat autorité a été spécifié." - elif [ -z "$__rc_ca" ]; then - ewarn "Aucun certificat autorité n'a pas été spécifié. Cela ne peut marcher que si le certificat est autosigné" - fi - - local i - for i in "$__rc_cert" "$__rc_key" "$__rc_ca"; do - [ -n "$i" ] || continue - [ -f "$i" ] || { - eerror "$i: Fichier introuvable" - return 1 - } - done -} - -function apache_resolvecert() { - # Calculer l'emplacement des certificats correspondant aux arguments $1 et - # $2 (qui correspondent aux options --conf et --dir de apache_addcert()), - # puis initialiser les variables $3(=cert), $4(=key) et $5(=ca) - local __rc_conf="$1" __rc_dir="$2" - local __rc_cert __rc_key __rc_ca - - __apache_resolvcert - __apache_checkvars || return 1 - set_var "${3:-cert}" "$__rc_cert" - set_var "${4:-key}" "$__rc_key" - set_var "${5:-ca}" "$__rc_ca" -} - -function apache_addcert() { - function __apache_addcert_display_help() { - uecho "apache_addcert: Installer un certificat sur le serveur - -USAGE - apache_addcert [options] [cert.pem [cert.key [ca.pem]]] - -OPTIONS - --conf certsconf - --dir certsdir - Spécifier un fichier de configuration et un répertoire depuis lesquels - prendre les informations sur les certificats à utiliser. - Le fichier de configuration doit définir les variables cert, key et ca - avec les noms des fichiers contenant respectivement le certificat, la - clé privée, et les certificats autorités, exprimés relativement au - répertoire certsdir. - Si ces options ne sont pas spécifiées, les fichiers doivent être donnés - sur la ligne de commande. - - --out-cert cert - --out-key key - --out-ca ca - Au lieu d'installer les certificats, placer les chemins vers les - fichiers correspondant dans les variables spécifiées" - } - - eval "$(utools_local)" - local action=install - local certsconf certsdir cert key ca - local __out_cert __out_key __out_ca - parse_opts "${PRETTYOPTS[@]}" \ - --help '$exit_with __apache_addcert_display_help' \ - -C:,--conf: certsconf= \ - -d:,--dir: certsdir= \ - --out-cert: '$set@ __out_cert; action=dump' \ - --out-key: '$set@ __out_key; action=dump' \ - --out-ca: '$set@ __out_ca; action=dump' \ - @ args -- "$@" && set -- "${args[@]}" || die "$args" - - local __rc_conf __rc_dir - local __rc_cert __rc_key __rc_ca - if [ -n "$certsconf" ]; then - __rc_conf="$certsconf" - __rc_dir="$certsdir" - __apache_resolvconf - __apache_checkvars || return 1 - else - __rc_cert="$1" - __rc_key="$2" - __rc_ca="$3" - __apache_checkvars || return 1 - fi - cert="$__rc_cert" - key="$__rc_key" - ca="$__rc_ca" - - if [ -n "$cert" ]; then - estepi "Certificat: $(ppath "$cert")" - estepi "Clé privée: $(ppath "$key")" - fi - [ -n "$ca" ] && estepi "CAutorités: $(ppath "$ca")" - ask_yesno "Voulez-vous continuer?" O || return 1 - urequire install - - etitle "Installation des certificats" - certsdir="$(get_APACHESSLCERTSDIR_prefix)" - keysdir="$(get_APACHESSLKEYSDIR_prefix)" - if [ ! -d "$certsdir" ]; then - mkdir -p "$certsdir" || return 1 - chmod 755 "$certsdir" || return 1 - fi - if [ ! -d "$keysdir" ]; then - mkdir -p "$keysdir" || return 1 - chmod 710 "$keysdir" || return 1 - fi - if [ -n "$cert" ]; then - copy_replace "$cert" "$certsdir" || return 1 - chmod 644 "$certsdir/$(basename "$cert")" || return 1 - copy_replace "$key" "$keysdir" || return 1 - chmod 640 "$keysdir/$(basename "$key")" || return 1 - fi - if [ -n "$ca" ]; then - copy_replace "$ca" "$certsdir" || return 1 - chmod 644 "$certsdir/$(basename "$ca")" || return 1 - fi - eend - - return 0 -} - -function apache_autoconf() { - function __apache_autoconf_display_help() { - uecho "apache_autoconf: Mettre à jour la configuration d'apache - -USAGE - apache_autoconf AUTOCONFDIR [CERTSDIR] - -AUTOCONFDIR 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 - -IMPORTANT: Cette fonction n'est pour le moment supporté que sur debian - -OPTIONS - --confdir CONFDIR - Spécifier l'emplacement des fichiers de configuration apache ainsi que - modules.conf et sites.conf - Par défaut, utiliser AUTOCONFDIR - --modulesdir MODULESDIR - Spécifier l'emplacement des fichiers de configuration des modules. - Par défaut, utiliser AUTOCONFDIR/modules si ce répertoire existe. - --sitesdir SITESDIR - Spécifier l'emplacement des fichiers de configuration des sites. - Par défaut, utiliser AUTOCONFDIR/sites si ce répertoire existe. - --cgibindir CGIBINDIR - Spécifier l'emplacement des scripts cgi à installer. - Par défaut, utiliser AUTOCONFDIR/cgi-bin si ce répertoire existe. - --wwwdir WWWDIR - Spécifier l'emplacement des fichiers du serveur web - Par défaut, utiliser AUTOCONFDIR/www si ce répertoire existe. - --certsconfdir CERTSCONFDIR - Spécifier l'emplacement des fichiers de configuration des certificats. - Par défaut, utiliser AUTOCONFDIR/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 AUTOCONFDIR/RewriteRules si ce répertoire existe. - --no-restart - Ne pas redémarrer apache en cas de modification de la configuration" - } - - eval "$(utools_local)" - local autoconfdir certsdir confdir modulesdir sitesdir cgibindir wwwdir certsconfdir rrdir - local restart=1 - parse_opts "${PRETTYOPTS[@]}" \ - --help '$exit_with __apache_autoconf_display_help' \ - --confdir: confdir= \ - --modulesdir: modulesdir= \ - --sitesdir: sitesdir= \ - --cgibindir: cgibindir= \ - --wwwdir: wwwdir= \ - --certsconfdir: certsconfdir= \ - --rrdir: rrdir= \ - --no-restart restart= \ - @ args -- "$@" && set -- "${args[@]}" || die "$args" - - if ! check_sysinfos -s linux -d debian; then - eerror "apache_autoconf n'est supporté que sur Debian linux" - return 1 - fi - urequire install - compute_apache_prefixes - - autoconfdir="$1" - [ -n "$autoconfdir" ] || { - eerror "Vous devez spécifier le répertoire de base de la configuration apache" - return 1 - } - certsdir="$2" - if [ -z "$confdir" -o -z "$modulesdir" -o -z "$sitesdir" \ - -o -z "$cgibindir" -o -z "$wwwdir" -o -z "$certsconfdir" \ - -o -z "$rrdir" ]; then - [ -d "$autoconfdir" ] || { - eerror "$autoconfdir: répertoire invalide" - return 1 - } - fi - [ -n "$confdir" ] || confdir="$autoconfdir" - [ -n "$modulesdir" ] || modulesdir="$autoconfdir/modules" - [ -n "$sitesdir" ] || sitesdir="$autoconfdir/sites" - [ -n "$cgibindir" ] || cgibindir="$autoconfdir/cgi-bin" - [ -n "$wwwdir" ] || wwwdir="$autoconfdir/www" - [ -n "$certsconfdir" ] || certsconfdir="$autoconfdir/certsconf" - [ -n "$rrdir" ] || rrdir="$autoconfdir/RewriteRules" - if [ -d "$certsconfdir" ]; then - if [ -z "$certsdir" ]; then - eerror "CERTSDIR est requis si --certsconfdir est spécifié" - return 1 - elif [ ! -d "$certsdir" ]; then - eerror "$certsdir: répertoire invalide" - return 1 - fi - fi - - local modified conf - if [ -d "$certsconfdir" ]; then - local -a certsconfs - local certsconf cert key ca - etitle "Installation des certificats" - array_lsfiles certsconfs "$certsconfdir" "*.conf" - for certsconf in "${certsconfs[@]}"; do - apache_resolvecert "$certsconf" "$certsdir" cert key ca || return 1 - apache_addcert -y "$cert" "$key" "$ca" - modified=1 - done - eend - fi - - if [ -d "$modulesdir" ]; then - local -a confs - local conf - etitle "Installation des configurations des modules" - array_from_lines confs "$(list_files "$modulesdir" "*.conf")" - for conf in "${confs[@]}"; do - estep "$conf" - copy_update "$modulesdir/$conf" "$APACHECONFDIR/mods-available/$conf" && modified=1 - done - eend - fi - - if [ -d "$rrdir" ]; then - local -a confs - local conf - etitle "Installation des règles de réécriture" - array_from_lines confs "$(list_files "$rrdir" "RewriteRules*.conf")" - for conf in "${confs[@]}"; do - estep "$conf" - copy_update "$rrdir/$conf" "$APACHECONFDIR/$conf" && modified=1 - done - eend - fi - - local -a enablesites disablesites - if [ -d "$sitesdir" ]; then - local -a confs - local conf confname destconf certsconf tmpconf - etitle "Installation des sites" - array_lsfiles confs "$sitesdir" "*.conf" - for conf in "${confs[@]}"; do - confname="$(basename "$conf")" - destconf="$confname" - certsconf= - if [ "${destconf%.ssl.conf}" != "$destconf" ]; then - if [ -d "$certsconfdir" ]; then - certsconf="${destconf%.ssl.conf}-certs.conf" - else - ewarn "$conf: fichier ignoré parce que --certsconfdir n'a pas été spécifié" - fi - fi - case "$destconf" in - default.conf) destconf=default;; - default.ssl.conf) destconf=default-ssl;; - esac - - if [ -n "$certsconf" ]; then - certsconf="$certsconfdir/$certsconf" - if [ -f "$certsconf" ]; then - apache_resolvecert "$certsconf" "$certsdir" cert key ca || return 1 - ac_set_tmpfile tmpconf - sed "\ -s#@@cert@@#$APACHESSLCERTSDIR/$(basename "$cert")#g -s#@@key@@#$APACHESSLKEYSDIR/$(basename "$key")#g -s#@@ca@@#$APACHESSLCERTSDIR/$(basename "$ca")#g -" <"$conf" >"$tmpconf" - copy_update "$tmpconf" "$APACHEAVSITESDIR/$destconf" - else - eerror "$(ppath "$certsconf"): fichier introuvable. Il a été ignoré" - fi - else - copy_update "$conf" "$APACHEAVSITESDIR/$destconf" - fi - enablesites=("${enablesites[@]}" "$destconf") - modified=1 - done - eend - fi - if [ -d "$confdir" ]; then - local -a confs - local conf - etitle "Configuration de base" - array_from_lines confs "$(list_files "$confdir")" - for conf in "${confs[@]}"; do - case "$conf" in - modules.conf|sites.conf) continue;; - esac - estep "$conf" - copy_update "$confdir/$conf" "$APACHECONFDIR/$conf" && modified=1 - done - if [ -f "$confdir/modules.conf" ]; then - local -a modules - local module - array_from_lines modules "$(<"$confdir/modules.conf" filter_conf)" - for module in "${modules[@]}"; do - if [ "${module#-}" != "$module" ]; then - module="${module#-}" - if a2dismod "$module"; then - estep "Désactivation du module $module" - modified=1 - fi - else - module="${module#+}" - if a2enmod "$module"; then - estep "Activation du module $module" - modified=1 - fi - fi - done - fi - if [ -f "$confdir/sites.conf" ]; then - local -a sitesconfs; local sitesconf - array_from_lines sitesconfs "$(<"$confdir/sites.conf" filter_conf)" - if [ ${#sitesconfs[*]} -gt 0 ]; then - # si une configuration existe, ignorer la configuration - # automatique - enablesites=() - disablesites=() - for sitesconf in "${sitesconfs[@]}"; do - if [ "${sitesconf#+}" != "$sitesconf" ]; then - array_del disablesites "${sitesconf#+}" - array_add enablesites "${sitesconf#+}" - elif [ "${sitesconf#-}" != "$sitesconf" ]; then - array_del enablesites "${sitesconf#-}" - array_add disablesites "${sitesconf#-}" - else - array_del disablesites "$sitesconf" - array_add enablesites "$sitesconf" - fi - done - fi - fi - eend - fi - if [ -d "$cgibindir" ]; then - etitle "Installation des scripts CGI" - cpdirnovcs "$cgibindir" "$CGIBINDIR" - eend - fi - if [ -d "$wwwdir" ]; then - etitle "Installation des fichiers du serveur web" - cpdirnovcs "$wwwdir" "$HTDOCSDIR" - eend - fi - - if [ -n "${enablesites[*]}" -o -n "${disablesites[*]}" ]; then - etitle "(dés)Activation des sites" - local site - for site in "${enablesites[@]}"; do - a2ensite "$site" - done - for site in "${disablesites[@]}"; do - a2dissite "$site" - done - eend - fi - - if [ -n "$modified" -a -n "$restart" ]; then - estep "Redémarrage d'apache" - "$APACHECTL" restart - fi -} diff --git a/lib/ulib/apache.config b/lib/ulib/apache.config new file mode 100644 index 0000000..a0d2ccb --- /dev/null +++ b/lib/ulib/apache.config @@ -0,0 +1,376 @@ +##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +## Templates pour apache +##@cooked nocomments +##@require base +##@require sysinfos +##@require template +uprovide apache.config +urequire base sysinfos template apache + +function __apache_resolvcert() { + [ -n "$__rc_dir" ] || __rc_dir="$(dirname "$__rc_conf")" + eval "$( + source "$__rc_conf" + set_var_cmd __rc_cert "$cert" + set_var_cmd __rc_key "$key" + set_var_cmd __rc_ca "$ca" + )" + [ -n "$__rc_cert" ] && __rc_cert="$(abspath "$__rc_cert" "$__rc_dir")" + [ -n "$__rc_key" ] && __rc_key="$(abspath "$__rc_key" "$__rc_dir")" + [ -n "$__rc_ca" ] && __rc_ca="$(abspath "$__rc_ca" "$__rc_dir")" +} + +function __apache_checkvars() { + if [ -n "$__rc_cert" -a -z "$__rc_key" ]; then + local __rc_name __rc_ext + splitname "$__rc_cert" __rc_name __rc_ext + if [ "$__rc_ext" == "crt" -o "$__rc_ext" == "pem" ]; then + __rc_key="$__rc_name.key" + enote "La clé privée n'a pas été spécifiée. La valeur $(ppath "$__rc_key") sera utilisée" + else + eerror "Impossible de trouver la clé privée correspondant au certificat $(ppath "$__rc_cert")" + return 1 + fi + fi + if [ -z "$__rc_cert" -a -z "$__rc_ca" ]; then + eerror "Vous devez spécifier le certificat à installer" + return 1 + elif [ -z "$__rc_cert" ]; then + eattention "Seul le certificat autorité a été spécifié." + elif [ -z "$__rc_ca" ]; then + ewarn "Aucun certificat autorité n'a pas été spécifié. Cela ne peut marcher que si le certificat est autosigné" + fi + + local i + for i in "$__rc_cert" "$__rc_key" "$__rc_ca"; do + [ -n "$i" ] || continue + [ -f "$i" ] || { + eerror "$i: Fichier introuvable" + return 1 + } + done +} + +function apache_resolvecert() { + # Calculer l'emplacement des certificats correspondant aux arguments $1 et + # $2 (qui correspondent aux options --conf et --dir de apache_addcert()), + # puis initialiser les variables $3(=cert), $4(=key) et $5(=ca) + local __rc_conf="$1" __rc_dir="$2" + local __rc_cert __rc_key __rc_ca + + __apache_resolvcert + __apache_checkvars || return 1 + set_var "${3:-cert}" "$__rc_cert" + set_var "${4:-key}" "$__rc_key" + set_var "${5:-ca}" "$__rc_ca" +} + +function apache_addcert() { + function __apache_addcert_display_help() { + uecho "apache_addcert: Installer un certificat sur le serveur + +USAGE + apache_addcert [options] [cert.pem [cert.key [ca.pem]]] + +OPTIONS + --conf certsconf + --dir certsdir + Spécifier un fichier de configuration et un répertoire depuis lesquels + prendre les informations sur les certificats à utiliser. + Le fichier de configuration doit définir les variables cert, key et ca + avec les noms des fichiers contenant respectivement le certificat, la + clé privée, et les certificats autorités, exprimés relativement au + répertoire certsdir. + Si ces options ne sont pas spécifiées, les fichiers doivent être donnés + sur la ligne de commande. + + --out-cert cert + --out-key key + --out-ca ca + Au lieu d'installer les certificats, placer les chemins vers les + fichiers correspondant dans les variables spécifiées" + } + + eval "$(utools_local)" + local action=install + local certsconf certsdir cert key ca + local __out_cert __out_key __out_ca + parse_opts "${PRETTYOPTS[@]}" \ + --help '$exit_with __apache_addcert_display_help' \ + -C:,--conf: certsconf= \ + -d:,--dir: certsdir= \ + --out-cert: '$set@ __out_cert; action=dump' \ + --out-key: '$set@ __out_key; action=dump' \ + --out-ca: '$set@ __out_ca; action=dump' \ + @ args -- "$@" && set -- "${args[@]}" || die "$args" + + local __rc_conf __rc_dir + local __rc_cert __rc_key __rc_ca + if [ -n "$certsconf" ]; then + __rc_conf="$certsconf" + __rc_dir="$certsdir" + __apache_resolvconf + __apache_checkvars || return 1 + else + __rc_cert="$1" + __rc_key="$2" + __rc_ca="$3" + __apache_checkvars || return 1 + fi + cert="$__rc_cert" + key="$__rc_key" + ca="$__rc_ca" + + if [ -n "$cert" ]; then + estepi "Certificat: $(ppath "$cert")" + estepi "Clé privée: $(ppath "$key")" + fi + [ -n "$ca" ] && estepi "CAutorités: $(ppath "$ca")" + ask_yesno "Voulez-vous continuer?" O || return 1 + urequire install + + etitle "Installation des certificats" + certsdir="$(get_APACHESSLCERTSDIR_prefix)" + keysdir="$(get_APACHESSLKEYSDIR_prefix)" + if [ ! -d "$certsdir" ]; then + mkdir -p "$certsdir" || return 1 + chmod 755 "$certsdir" || return 1 + fi + if [ ! -d "$keysdir" ]; then + mkdir -p "$keysdir" || return 1 + chmod 710 "$keysdir" || return 1 + fi + if [ -n "$cert" ]; then + copy_replace "$cert" "$certsdir" || return 1 + chmod 644 "$certsdir/$(basename "$cert")" || return 1 + copy_replace "$key" "$keysdir" || return 1 + chmod 640 "$keysdir/$(basename "$key")" || return 1 + fi + if [ -n "$ca" ]; then + copy_replace "$ca" "$certsdir" || return 1 + chmod 644 "$certsdir/$(basename "$ca")" || return 1 + fi + eend + + return 0 +} + +function apache_autoconf() { + eval "$(utools_local)" + local autoconfdir certsdir confdir modulesdir sitesdir cgibindir wwwdir certsconfdir rrdir + local restart=1 + parse_opts "${PRETTYOPTS[@]}" \ + --confdir: confdir= \ + --modulesdir: modulesdir= \ + --sitesdir: sitesdir= \ + --cgibindir: cgibindir= \ + --wwwdir: wwwdir= \ + --certsconfdir: certsconfdir= \ + --rrdir: rrdir= \ + --no-restart restart= \ + @ args -- "$@" && set -- "${args[@]}" || die "$args" + + if ! check_sysinfos -s linux -d debian; then + eerror "apache_autoconf n'est supporté que sur Debian linux" + return 1 + fi + urequire install + compute_apache_prefixes + + autoconfdir="$1" + [ -n "$autoconfdir" ] || { + eerror "Vous devez spécifier le répertoire de base de la configuration apache" + return 1 + } + certsdir="$2" + if [ -z "$confdir" -o -z "$modulesdir" -o -z "$sitesdir" \ + -o -z "$cgibindir" -o -z "$wwwdir" -o -z "$certsconfdir" \ + -o -z "$rrdir" ]; then + [ -d "$autoconfdir" ] || { + eerror "$autoconfdir: répertoire invalide" + return 1 + } + fi + [ -n "$confdir" ] || confdir="$autoconfdir" + [ -n "$modulesdir" ] || modulesdir="$autoconfdir/modules" + [ -n "$sitesdir" ] || sitesdir="$autoconfdir/sites" + [ -n "$cgibindir" ] || cgibindir="$autoconfdir/cgi-bin" + [ -n "$wwwdir" ] || wwwdir="$autoconfdir/www" + [ -n "$certsconfdir" ] || certsconfdir="$autoconfdir/certsconf" + [ -n "$rrdir" ] || rrdir="$autoconfdir/RewriteRules" + if [ -d "$certsconfdir" ]; then + if [ -z "$certsdir" ]; then + eerror "CERTSDIR est requis si --certsconfdir est spécifié" + return 1 + elif [ ! -d "$certsdir" ]; then + eerror "$certsdir: répertoire invalide" + return 1 + fi + fi + + local modified conf + if [ -d "$certsconfdir" ]; then + local -a certsconfs + local certsconf cert key ca + etitle "Installation des certificats" + array_lsfiles certsconfs "$certsconfdir" "*.conf" + for certsconf in "${certsconfs[@]}"; do + apache_resolvecert "$certsconf" "$certsdir" cert key ca || return 1 + apache_addcert -y "$cert" "$key" "$ca" + modified=1 + done + eend + fi + + if [ -d "$modulesdir" ]; then + local -a confs + local conf + etitle "Installation des configurations des modules" + array_from_lines confs "$(list_files "$modulesdir" "*.conf")" + for conf in "${confs[@]}"; do + estep "$conf" + copy_update "$modulesdir/$conf" "$APACHECONFDIR/mods-available/$conf" && modified=1 + done + eend + fi + + if [ -d "$rrdir" ]; then + local -a confs + local conf + etitle "Installation des règles de réécriture" + array_from_lines confs "$(list_files "$rrdir" "RewriteRules*.conf")" + for conf in "${confs[@]}"; do + estep "$conf" + copy_update "$rrdir/$conf" "$APACHECONFDIR/$conf" && modified=1 + done + eend + fi + + local -a enablesites disablesites + if [ -d "$sitesdir" ]; then + local -a confs + local conf confname destconf certsconf tmpconf + etitle "Installation des sites" + array_lsfiles confs "$sitesdir" "*.conf" + for conf in "${confs[@]}"; do + confname="$(basename "$conf")" + destconf="$confname" + certsconf= + if [ "${destconf%.ssl.conf}" != "$destconf" ]; then + if [ -d "$certsconfdir" ]; then + certsconf="${destconf%.ssl.conf}-certs.conf" + else + ewarn "$conf: fichier ignoré parce que --certsconfdir n'a pas été spécifié" + fi + fi + case "$destconf" in + default.conf) destconf=default;; + default.ssl.conf) destconf=default-ssl;; + esac + + if [ -n "$certsconf" ]; then + certsconf="$certsconfdir/$certsconf" + if [ -f "$certsconf" ]; then + apache_resolvecert "$certsconf" "$certsdir" cert key ca || return 1 + ac_set_tmpfile tmpconf + sed "\ +s#@@cert@@#$APACHESSLCERTSDIR/$(basename "$cert")#g +s#@@key@@#$APACHESSLKEYSDIR/$(basename "$key")#g +s#@@ca@@#$APACHESSLCERTSDIR/$(basename "$ca")#g +" <"$conf" >"$tmpconf" + copy_update "$tmpconf" "$APACHEAVSITESDIR/$destconf" + else + eerror "$(ppath "$certsconf"): fichier introuvable. Il a été ignoré" + fi + else + copy_update "$conf" "$APACHEAVSITESDIR/$destconf" + fi + enablesites=("${enablesites[@]}" "$destconf") + modified=1 + done + eend + fi + if [ -d "$confdir" ]; then + local -a confs + local conf + etitle "Configuration de base" + array_from_lines confs "$(list_files "$confdir")" + for conf in "${confs[@]}"; do + case "$conf" in + modules.conf|sites.conf) continue;; + esac + estep "$conf" + copy_update "$confdir/$conf" "$APACHECONFDIR/$conf" && modified=1 + done + if [ -f "$confdir/modules.conf" ]; then + local -a modules + local module + array_from_lines modules "$(<"$confdir/modules.conf" filter_conf)" + for module in "${modules[@]}"; do + if [ "${module#-}" != "$module" ]; then + module="${module#-}" + if a2dismod "$module"; then + estep "Désactivation du module $module" + modified=1 + fi + else + module="${module#+}" + if a2enmod "$module"; then + estep "Activation du module $module" + modified=1 + fi + fi + done + fi + if [ -f "$confdir/sites.conf" ]; then + local -a sitesconfs; local sitesconf + array_from_lines sitesconfs "$(<"$confdir/sites.conf" filter_conf)" + if [ ${#sitesconfs[*]} -gt 0 ]; then + # si une configuration existe, ignorer la configuration + # automatique + enablesites=() + disablesites=() + for sitesconf in "${sitesconfs[@]}"; do + if [ "${sitesconf#+}" != "$sitesconf" ]; then + array_del disablesites "${sitesconf#+}" + array_add enablesites "${sitesconf#+}" + elif [ "${sitesconf#-}" != "$sitesconf" ]; then + array_del enablesites "${sitesconf#-}" + array_add disablesites "${sitesconf#-}" + else + array_del disablesites "$sitesconf" + array_add enablesites "$sitesconf" + fi + done + fi + fi + eend + fi + if [ -d "$cgibindir" ]; then + etitle "Installation des scripts CGI" + cpdirnovcs "$cgibindir" "$CGIBINDIR" + eend + fi + if [ -d "$wwwdir" ]; then + etitle "Installation des fichiers du serveur web" + cpdirnovcs "$wwwdir" "$HTDOCSDIR" + eend + fi + + if [ -n "${enablesites[*]}" -o -n "${disablesites[*]}" ]; then + etitle "(dés)Activation des sites" + local site + for site in "${enablesites[@]}"; do + a2ensite "$site" + done + for site in "${disablesites[@]}"; do + a2dissite "$site" + done + eend + fi + + if [ -n "$modified" -a -n "$restart" ]; then + estep "Redémarrage d'apache" + "$APACHECTL" restart + fi +} diff --git a/lib/ulib/support/apacheconfig.template/RewriteRules/.udir b/lib/ulib/support/apacheconfig.template/RewriteRules/.udir new file mode 100644 index 0000000..7d54745 --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/RewriteRules/.udir @@ -0,0 +1,23 @@ +# -*- 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="" +udir_note="" +udir_types=("uinst") +uinc=release +uinc_options=() +uinc_args=() +configure_variables=(dest) +configure_dest_for=() +config_scripts=() +install_profiles=false +profiledir=lib/profile.d +bashrcdir=lib/bashrc.d +defaultdir=lib/default +copy_files=true +destdir=APACHECONFDIR +srcdir=. +files=(RewriteRules.conf) +owner=root: +modes=(u=rwX,g=rX,o=rX) +root_scripts=(lib/uinst/rootconf) diff --git a/lib/ulib/support/apacheconfig.template/RewriteRules/RewriteRules.conf b/lib/ulib/support/apacheconfig.template/RewriteRules/RewriteRules.conf new file mode 100644 index 0000000..e69de29 diff --git a/lib/ulib/support/apacheconfig.template/RewriteRules/lib/uinst/rootconf b/lib/ulib/support/apacheconfig.template/RewriteRules/lib/uinst/rootconf new file mode 100644 index 0000000..3187d17 --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/RewriteRules/lib/uinst/rootconf @@ -0,0 +1,8 @@ +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + +source "$1" || exit 1 +source "$ULIBDIR/ulib" && urequire DEFAULTS apache || exit 1 + +compute_apache_prefixes +[ -n "$APACHECTL" ] && etitle "Redémarrage de apache" \ + "$APACHECTL" graceful diff --git a/lib/ulib/support/apacheconfig.template/RewriteRules/rewrite.rules b/lib/ulib/support/apacheconfig.template/RewriteRules/rewrite.rules new file mode 100644 index 0000000..b445618 --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/RewriteRules/rewrite.rules @@ -0,0 +1,2 @@ +# -*- coding: utf-8 mode: conf -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + diff --git a/lib/ulib/support/apacheconfig.template/RewriteRules/rules.html b/lib/ulib/support/apacheconfig.template/RewriteRules/rules.html new file mode 100644 index 0000000..897c3f7 --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/RewriteRules/rules.html @@ -0,0 +1,14 @@ + + + +
+ +