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 @@ + + + + + +host.univ.run + + +

host.univ.run

+ + + diff --git a/lib/ulib/support/apacheconfig.template/RewriteRules/update.conf b/lib/ulib/support/apacheconfig.template/RewriteRules/update.conf new file mode 100644 index 0000000..167833b --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/RewriteRules/update.conf @@ -0,0 +1,15 @@ +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + +# Adresse canonique privée de l'hôte +#PRIHOST=host1.univ.run + +# Adresse canonique publique de l'hôte. Si cette valeur n'est pas spécifiée, +# prendre la valeur PRIHOST +#PUBHOST=host.univ.run +#PUBHOST=service.univ-reunion.fr + +# Liste des suffixes à considérer pour les fichiers en entrée +#SUFFIXES=("-clr" "-ssl") + +# Faut-il générer les ACLs pour les réécritures de type proxy (avec l'option P) +#PROXY=1 diff --git a/lib/ulib/support/apacheconfig.template/RewriteRules/update.sh b/lib/ulib/support/apacheconfig.template/RewriteRules/update.sh new file mode 100755 index 0000000..03f8c10 --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/RewriteRules/update.sh @@ -0,0 +1,77 @@ +#!/bin/bash +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + +source /etc/ulib && +urequire DEFAULTS || +exit 1 +OENC="$UTF8" + +PRIHOST= +PUBHOST= +PROXY=1 +SUFFIXES=("-clr" "-ssl") +source "$scriptdir/update.conf" + +function display_help() { + local OENC="$UTF8" + uecho "$scriptname: Mettre à jour RewriteRules.conf et le déployer + +USAGE + $scriptname [options] [prihost [pubhost]] + +OPTIONS + -f INPUT[=rewrite.rules] + -o OUTPUT[=RewriteRules.conf] + -w HTML[=rules.html] + Spécifier le fichier à traiter en entrée et les fichiers à générer en + sortie. Si l'option -f n'est pas spécifiée, consulter la description de + l'option -s pour le comportement par défaut. + -s SUFFIX + Ajouter un suffixe à la liste des suffixes considérés pour les fichiers + en entrée. Cette option est ignorée si l'option -f est spécifiée. Par + défaut, le fichier rewrite.rules puis les fichiers de la forme + rewrite\$SUFFIX.rules sont traités s'ils existent. + La liste des suffixes par défaut est (${SUFFIXES[*]}) + -d, --deploy + Déployer la configuration avec uinst après la génération + -n, --no-proxy + Ne pas générer les ACLs pour les réécritures de type proxy" +} + +input= +rules= +html=--NOT-SET-- +suffixes=() +deploy= +proxy="$PROXY" +parse_opts \ + --help '$exit_with display_help' \ + -f:,--input: input= \ + -o:,--output: rules= \ + -w:,--html:,--html: html= \ + -s:,--suffix: suffixes \ + -d,--deploy deploy=1 \ + -n,--no-proxy proxy= \ + "${PRETTYOPTS[@]}" @ args -- "$@" && set -- "${args[@]}" || die "$args" + +prihost="${1:-$PRIHOST}" +pubhost="${2:-${PUBHOST:-$prihost}}" + +[ -n "$prihost" ] || die "Il faut spécifier l'hôte pour lequel faire la génération. Modifiez le cas échéant le fichier update.conf" + +if [ -n "$input" ]; then + [ -n "$rules" ] || rules=RewriteRules.conf + [ -n "$html" ] || html=rules.html + [ "$html" == "--NOT-SET--" ] && html= + mkRewriteRules ${proxy:+-p} -f "$input" -o "$rules" ${html:+-w "$html"} "$pubhost" +else + for suffix in "" "${SUFFIXES[@]}"; do + input="$scriptdir/rewrite$suffix.rules" + rules="$scriptdir/RewriteRules$suffix.conf" + html="$scriptdir/rules$suffix.html" + [ -f "$input" ] || continue + mkRewriteRules ${proxy:+-p} -f "$input" -o "$rules" -w "$html" "$pubhost" + done +fi + +[ -n "$deploy" ] && ruinst -h "root@$prihost" "$scriptdir" -- -y diff --git a/lib/ulib/support/apacheconfig.template/apacheconfig.txt b/lib/ulib/support/apacheconfig.template/apacheconfig.txt new file mode 100644 index 0000000..69ddb6f --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/apacheconfig.txt @@ -0,0 +1,46 @@ +# -*- coding: utf-8 mode: text -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + +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 '-' + +- 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 configuration n'est pour le moment supporté que sur debian diff --git a/lib/ulib/support/apacheconfig.template/certsconf/default-certs.conf b/lib/ulib/support/apacheconfig.template/certsconf/default-certs.conf new file mode 100644 index 0000000..47c7996 --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/certsconf/default-certs.conf @@ -0,0 +1,14 @@ +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + +# Ce fichier permet de configurer quels certificats du répertoire $certsdir il +# faut installer sur le serveur. +certsdir=renater + +# Fichier contenant les certificats racines qui valident le certificat à +# installer, ainsi que les certificats qui sont rencontrés dans le dialogue avec +# d'autres serveurs web +ca=terena.crt + +# Certificat et clé privée à installer +cert=host-20130523.pem +key=host-20130523.key diff --git a/lib/ulib/support/apacheconfig.template/cgi-bin/.udir b/lib/ulib/support/apacheconfig.template/cgi-bin/.udir new file mode 100644 index 0000000..93bb2e5 --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/cgi-bin/.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="Fichiers à déployer sur host.univ.run dans /usr/lib/cgi-bin" +udir_note="" +udir_types=("uinst:rsync") +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=CGIBINDIR +srcdir=. +files=() +owner=root: +modes=(u=rwX,g=rX,o=rX) +root_scripts=() diff --git a/lib/ulib/support/apacheconfig.template/cgi-bin/test.cgi b/lib/ulib/support/apacheconfig.template/cgi-bin/test.cgi new file mode 100755 index 0000000..dd4bf37 --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/cgi-bin/test.cgi @@ -0,0 +1,6 @@ +#!/bin/bash +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + +echo "Content-Type: text/plain" +echo "" +echo "OK" diff --git a/lib/ulib/support/apacheconfig.template/modules.conf b/lib/ulib/support/apacheconfig.template/modules.conf new file mode 100644 index 0000000..84e06fb --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/modules.conf @@ -0,0 +1,4 @@ +# -*- coding: utf-8 mode: conf -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +# Liste des modules à activer. Syntaxe: +# module ou +module pour activer un module +# -module pour le désactiver diff --git a/lib/ulib/support/apacheconfig.template/ports.conf b/lib/ulib/support/apacheconfig.template/ports.conf new file mode 100644 index 0000000..e1cd77e --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/ports.conf @@ -0,0 +1,24 @@ +# 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 +# This is also true if you have upgraded from before 2.2.9-3 (i.e. from +# Debian etch). See /usr/share/doc/apache2.2-common/NEWS.Debian.gz and +# README.Debian.gz + +NameVirtualHost *:80 +Listen *:80 + + + # If you add NameVirtualHost *:443 here, you will also have to change + # the VirtualHost statement in /etc/apache2/sites-available/default-ssl + # to + # 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 10.82.80.100:443 + Listen 10.82.80.100:443 + diff --git a/lib/ulib/support/apacheconfig.template/sites.conf b/lib/ulib/support/apacheconfig.template/sites.conf new file mode 100644 index 0000000..0a2108b --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/sites.conf @@ -0,0 +1,4 @@ +# -*- coding: utf-8 mode: conf -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +# Liste des sites à activer. Syntaxe: +# site ou +site pour activer un site +# -site pour le désactiver diff --git a/lib/ulib/support/apacheconfig.template/sites/default.conf b/lib/ulib/support/apacheconfig.template/sites/default.conf new file mode 100644 index 0000000..c838243 --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/sites/default.conf @@ -0,0 +1,51 @@ +# -*- coding: utf-8 mode: conf -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + + + ServerName host.univ.run + ServerAlias host host1.univ.run host1 + ServerAdmin sysrezo@support.univ-reunion.fr + + DocumentRoot /var/www + + Options FollowSymLinks + AllowOverride None + + + Options Indexes FollowSymLinks MultiViews + AllowOverride None + Order allow,deny + allow from all + + + # Pour les serveurs qui ont le module mod_WebObjects: + # mod_WebObjects et ScriptAlias ne peuvent pas gérer le même préfixe. Pour + # utiliser des cgi-bin avec WebObjects, il faut soit changer le préfixe de + # ScriptAlias, soit changer le préfixe de WebObjectsAlias dans le fichier + # mod-webobjects.conf + # Sinon, il suffit de commenter les lignes suivantes: + ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ + + AllowOverride None + Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch + Order allow,deny + Allow from all + + + ErrorLog ${APACHE_LOG_DIR}/error.log + + # Possible values include: debug, info, notice, warn, error, crit, + # alert, emerg. + LogLevel warn + + CustomLog ${APACHE_LOG_DIR}/access.log combined + + # Pour les serveurs qui ont le module mod_WebObjects: + + Order allow,deny + Allow from all + + + Order allow,deny + Allow from all + + diff --git a/lib/ulib/support/apacheconfig.template/sites/default.ssl.conf b/lib/ulib/support/apacheconfig.template/sites/default.ssl.conf new file mode 100644 index 0000000..52ce4f1 --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/sites/default.ssl.conf @@ -0,0 +1,183 @@ +# -*- coding: utf-8 mode: conf -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + + + + ServerName host.univ.run + ServerAlias host host1.univ.run host1 + ServerAdmin sysrezo@support.univ-reunion.fr + + DocumentRoot /var/www + + Options FollowSymLinks + AllowOverride None + + + Options Indexes FollowSymLinks MultiViews + AllowOverride None + Order allow,deny + allow from all + + + # Pour les serveurs qui ont le module mod_WebObjects: + # mod_WebObjects et ScriptAlias ne peuvent pas gérer le même préfixe. Pour + # utiliser des cgi-bin avec WebObjects, il faut soit changer le préfixe de + # ScriptAlias, soit changer le préfixe de WebObjectsAlias dans le fichier + # mod-webobjects.conf + # Sinon, il suffit de commenter les lignes suivantes: + ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ + + AllowOverride None + Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch + Order allow,deny + Allow from all + + + ErrorLog ${APACHE_LOG_DIR}/ssl_error.log + + # Possible values include: debug, info, notice, warn, error, crit, + # alert, emerg. + LogLevel warn + + CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined + + + Order allow,deny + Allow from all + + + + Order allow,deny + Allow from all + + + # 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.2-common/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 + + # Access Control: + # With SSLRequire you can do per-directory access control based + # on arbitrary complex boolean expressions containing server + # variable checks and other lookup directives. The syntax is a + # mixture between C and Perl. See the mod_ssl documentation + # for more details. + # + #SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \ + # and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \ + # and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \ + # and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \ + # and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \ + # or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/ + # + + # 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 StrictRequire: + # This denies access when "SSLRequireSSL" or "SSLRequire" applied even + # under a "Satisfy any" situation, i.e. when it applies access is denied + # and no other module can change it. + # o OptRenegotiate: + # This enables optimized SSL connection renegotiation handling when SSL + # directives are used in per-directory context. + #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire + + SSLOptions +StdEnvVars + + + SSLOptions +StdEnvVars + + + # 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 + + + diff --git a/lib/ulib/support/apacheconfig.template/workers.properties b/lib/ulib/support/apacheconfig.template/workers.properties new file mode 100644 index 0000000..191e372 --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/workers.properties @@ -0,0 +1,17 @@ +worker.list=prod,dev + +worker.prod.port=8009 +worker.prod.host=host.univ.run +worker.prod.type=ajp13 +worker.prod.lbfactor=1 +worker.prod.connection_pool_timeout=600 +worker.prod.socket_keepalive=1 +worker.prod.socket_timeout=60 + +worker.dev.port=8009 +worker.dev.host=hostdev.univ.run +worker.dev.type=ajp13 +worker.dev.lbfactor=1 +worker.dev.connection_pool_timeout=600 +worker.dev.socket_keepalive=1 +worker.dev.socket_timeout=60 diff --git a/lib/ulib/support/apacheconfig.template/www/.udir b/lib/ulib/support/apacheconfig.template/www/.udir new file mode 100644 index 0000000..de4b9a8 --- /dev/null +++ b/lib/ulib/support/apacheconfig.template/www/.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="Fichiers à déployer sur host.univ.run dans /var/www" +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=() +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=root@host.univ.run:/var/www +srcdir=. +files=() +owner=www-data: +modes=(u=rwX,g=rX,o=rX) +root_scripts=() diff --git a/lib/ulib/template b/lib/ulib/template index 510ba6d..3812a8d 100644 --- a/lib/ulib/template +++ b/lib/ulib/template @@ -120,7 +120,7 @@ function template_merge() { srcspec="${srcspec#$destdir}" [ -e "$srcdir$srcspec" ] || continue - ebegin "$srcspec" + ebegin "$(ppath "$destdir$srcspec")" s=0 array_from_lines srcfiles "$(find "$srcdir$srcspec" -type f)" for src in "${srcfiles[@]}"; do @@ -172,7 +172,7 @@ function template_unmerge() { [ -e "$srcdir$srcspec" ] || continue s=0 - ebegin "$srcspec" + ebegin "$(ppath "$destdir$srcspec")" array_from_lines files "$(find "$srcdir$srcspec" -type f)" for src in "${files[@]}"; do dest="$destdir/${src#$srcdir/}" @@ -200,8 +200,9 @@ function template_cleandest() { # Cette fonction est habituellement utilisée après template_unmerge() local -a dirs [ -d "$1" ] || return 1 - array_from_lines dirs "$(cd "$1"; find "$1" -type d | __template_plsort -r)" - rmdir "${dirs[@]}" 2>/dev/null + array_from_lines dirs "$(cd "$1"; find . -type d | __template_plsort -r)" + array_del dirs . + (cd "$1"; rmdir "${dirs[@]}" 2>/dev/null) } function template_diff() { @@ -226,30 +227,26 @@ function template_diff() { done | page_maybe -S } -function override_display_templatectl_help() { :; } -function templatectl() { -# fonction de haut niveau qui facilite l'utilisation des fonctions template_* -# définir la fonction override_display_templatectl_help() pour l'affichage de l'aide - local -a args - local help list merge unmerge clean diff auto=1 - local destdir +function __templatectl_display_help() { :; } +__TEMPLATECTL_OTHER_OPTS=() +function __templatectl_parseopts() { parse_opts "${PRETTYOPTS[@]}" \ - --help help=1 \ + --help '$exit_with __templatectl_display_help' \ -s:,--srcdir: srcdir= \ - -o:,--destdir: destdir= \ - -l,--list '$list=1; auto=' \ - -m,--merge '$merge=1; auto=' \ - -z,--unmerge '$unmerge=1; auto=' \ - -C,--clean '$clean=1; auto=' \ - -d,--diff '$diff=1; auto=' \ - @ args -- "$@" && set -- "${args[@]}" || { eerror "$args"; return 1; } - - [ -n "$help" ] && { override_display_templatectl_help; return 0; } - + -d:,--destdir: destdir= \ + -l,--list '$list=1; templatectl_opt=1' \ + -m,--merge '$merge=1; templatectl_opt=1' \ + -z,--unmerge '$unmerge=1; templatectl_opt=1' \ + -C,--clean '$clean=1; templatectl_opt=1' \ + -g,--diff '$diff=1; templatectl_opt=1' \ + "${__TEMPLATECTL_OTHER_OPTS[@]}" \ + @ args -- "$@" +} +function __templatectl_do() { __template_check_srcdir "$srcdir" || return 1 [ -n "$destdir" ] || destdir=. __template_check_destdir "$destdir" || return 1 - [ -n "$auto" ] && list=1 + [ -n "$templatectl_auto" ] && list=1 [ -n "$list" ] && template_list "$srcdir" "$destdir" "$@" [ -n "$merge" ] && template_merge "$srcdir" "$destdir" "$@" @@ -258,3 +255,14 @@ function templatectl() { [ -n "$diff" ] && template_diff "$srcdir" "$destdir" "$@" return 0 } +function templatectl() { +# fonction de haut niveau qui facilite l'utilisation des fonctions template_* +# définir la fonction override_display_templatectl_help() pour l'affichage de l'aide + local -a args + local list merge unmerge clean diff templatectl_opt templatectl_auto + local destdir + + __templatectl_parseopts "$@" && set -- "${args[@]}" || { eerror "$args"; return 1; } + [ -z "$templatectl_opt" ] && templatectl_auto=1 + __templatectl_do "$@" +}