818 lines
29 KiB
Bash
818 lines
29 KiB
Bash
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
|
## Outils de haut niveau pour gérer apache et sa configuration
|
|
##@cooked nocomments
|
|
##@require base
|
|
##@require sysinfos
|
|
##@require apache
|
|
uprovide apache.tools
|
|
urequire base sysinfos 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
|
|
}
|
|
|
|
__APACHE_AUTOCONF_SUFFIXES=(d8 d)
|
|
__APACHE_AUTOCONF_SUFFIX_d8=(-d debian -v jessie+)
|
|
__APACHE_AUTOCONF_SUFFIX_d=(-d debian)
|
|
function __apache_autoconf_check_suffix() {
|
|
array_contains __APACHE_AUTOCONF_SUFFIXES "$1" || return 1
|
|
local sysinfos="__APACHE_AUTOCONF_SUFFIX_${1}[@]"
|
|
check_sysinfos --vars sysname sysdist sysver bits "${!sysinfos}"
|
|
}
|
|
function __apache_autoconf_filter_suffix_files() {
|
|
grep -vF ..
|
|
}
|
|
function __apache_autoconf_setup() {
|
|
if ! check_sysinfos --vars sysname sysdist sysver bits -s linux64 linux32 linux -d debian; then
|
|
eerror "apache_autoconf n'est supporté que sur Debian linux"
|
|
return 1
|
|
fi
|
|
urequire install
|
|
compute_apache_prefixes
|
|
return 0
|
|
}
|
|
function __apache_autoconf_fillxxx() {
|
|
local var name value first=1
|
|
for var in "$@"; do
|
|
splitvar "$var" name value
|
|
array_addu FILLVARS "$name"
|
|
[ -n "$first" ] || FILLSCRIPT="$FILLSCRIPT"$'\n'
|
|
FILLSCRIPT="${FILLSCRIPT}s/@@${name}@@/$(qseds "${value}")/g"
|
|
first=
|
|
done
|
|
# Il faut un fichier temporaire pour les remplacement de fichiers
|
|
ac_set_tmpfile FILLTEMP
|
|
}
|
|
function __apache_autoconf_fillcopy() {
|
|
# copier le fichier $1 vers le fichier $2. Si le fichier $1 contient l'une
|
|
# des variables du tableau $FILLVARS, corriger d'abord le fichier avec le
|
|
# script sed $FILLSCRIPT. Le fichier temporaire $FILLTEMP est utilisé pour
|
|
# le remplacement des valeurs. $3 contient le cas échéant des commandes sed
|
|
# supplémentaires
|
|
# Si des fichiers suffixes existent, ne faire la copie que si un fichier
|
|
# approprié correspondant au système courant est trouvé
|
|
local src="$1" dest="$2" sedscript="$3" perms="${4:-go+rX}"
|
|
|
|
# vérifier les fichiers suffixe
|
|
local suffix have_suffix found_suffix
|
|
for suffix in "${__APACHE_AUTOCONF_SUFFIXES[@]}"; do
|
|
if [ -f "$src..$suffix" ]; then
|
|
have_suffix=1
|
|
if __apache_autoconf_check_suffix "$suffix"; then
|
|
found_suffix=1
|
|
src="$src..$suffix"
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
[ -n "$have_suffix" -a -z "$found_suffix" ] && return 1
|
|
|
|
# valeurs à remplacer dans le fichier
|
|
local var found_var
|
|
for var in "${FILLVARS[@]}"; do
|
|
if quietgrep "@@${var}@@" "$src"; then
|
|
found_var=1
|
|
break
|
|
fi
|
|
done
|
|
if [ "$found_var" ]; then
|
|
sed "$FILLSCRIPT
|
|
$sedscript" <"$src" >"$FILLTEMP"
|
|
src="$FILLTEMP"
|
|
fi
|
|
|
|
copy_update "$src" "$dest" "$perms"
|
|
}
|
|
|
|
__APACHE_AUTOCONF_HELP="\
|
|
--confdir CONFDIR
|
|
Spécifier l'emplacement des fichiers de configuration apache ainsi que des
|
|
fichiers 'confs.conf', 'modules.conf' et 'sites.conf'. Par défaut, prendre
|
|
le répertoire local DESTDIR.
|
|
--confsdir CONFSDIR
|
|
Spécifier l'emplacement des fichiers des configuration. Par défaut, utiliser
|
|
DESTDIR/confs si ce répertoire existe.
|
|
--modulesdir MODULESDIR
|
|
Spécifier l'emplacement des fichiers des modules. Par défaut, utiliser
|
|
DESTDIR/modules si ce répertoire existe.
|
|
--sitesdir SITESDIR
|
|
Spécifier l'emplacement des fichiers des sites. Par défaut, utiliser
|
|
DESTDIR/sites si ce répertoire existe.
|
|
--cgibindir CGIBINDIR
|
|
Spécifier l'emplacement des scripts cgi à installer. Par défaut, utiliser
|
|
DESTDIR/cgi-bin si ce répertoire existe.
|
|
--wwwdir WWWDIR
|
|
Spécifier l'emplacement des fichiers du serveur web. Par défaut, utiliser
|
|
DESTDIR/www si ce répertoire existe.
|
|
--certsconfdir CERTSCONFDIR
|
|
Spécifier l'emplacement des fichiers de configuration des certificats. Par
|
|
défaut, utiliser DESTDIR/certsconf si ce répertoire existe. Il faut alors
|
|
spécifier aussi CERTSDIR, l'emplacement des certificats à installer.
|
|
--rrdir RRDIR
|
|
Spécifier l'emplacement des fichiers de réécriture. Par défaut, utiliser
|
|
DESTDIR/RewriteRules si ce répertoire existe.
|
|
--no-restart
|
|
Ne pas redémarrer apache en cas de modification de la configuration"
|
|
function __display_apache_autoconf_help() { eecho "$__APACHE_AUTOCONF_HELP"; }
|
|
function apache_autoconf() {
|
|
eval "$(utools_local)"
|
|
local -a ignores
|
|
local autoconfdir certsdir confdir confsdir oneconf modulesdir onemodule
|
|
local sitesdir onesite cgibindir wwwdir certsconfdir rrdir onecms
|
|
local sysname sysdist sysver bits
|
|
local destconfsdir a2xconf
|
|
local restart=1
|
|
parse_opts "${PRETTYOPTS[@]}" \
|
|
--help '$exit_with __display_apache_autoconf_help' \
|
|
--ignore: ignores \
|
|
--confdir: confdir= \
|
|
--confsdir: confsdir= \
|
|
--one-conf: oneconf= \
|
|
--modulesdir: modulesdir= \
|
|
--one-module: onemodule= \
|
|
--sitesdir: sitesdir= \
|
|
--one-site: onesite= \
|
|
--cgibindir: cgibindir= \
|
|
--wwwdir: wwwdir= \
|
|
--certsconfdir: certsconfdir= \
|
|
--rrdir: rrdir= \
|
|
--no-restart restart= \
|
|
--sysname: sysname= \
|
|
--sysdist: sysdist= \
|
|
--sysver: sysver= \
|
|
-6,--squeeze sysver=squeeze \
|
|
-7,--wheezy sysver=wheezy \
|
|
-8,--jessie sysver=jessie \
|
|
--bits: bits= \
|
|
@ args -- "$@" && set -- "${args[@]}" || die "$args"
|
|
|
|
if [ -n "$sysname" -o -n "$sysdist" -o -n "$sysver" ]; then
|
|
ensure_sysinfos sysname sysdist sysver
|
|
else
|
|
sysname=("${MYSYSNAME[@]}")
|
|
sysdist=("${MYSYSDIST[@]}")
|
|
sysver=("${MYSYSVER[@]}")
|
|
bits="$MYBITS"
|
|
fi
|
|
__apache_autoconf_setup || return 1
|
|
if __apache_autoconf_check_suffix d8; then
|
|
confdefault=000-default.conf
|
|
confdefaultssl=default-ssl.conf
|
|
destconfsdir="$APACHECONFDIR/conf-available"
|
|
a2xconf=1
|
|
elif __apache_autoconf_check_suffix d; then
|
|
confdefault=default
|
|
confdefaultssl=default-ssl
|
|
destconfsdir="$APACHECONFDIR/conf.d"
|
|
fi
|
|
|
|
# Configuration
|
|
autoconfdir="$1"; shift
|
|
[ -n "$autoconfdir" ] || {
|
|
eerror "Vous devez spécifier le répertoire de base de la configuration apache"
|
|
return 1
|
|
}
|
|
certsdir="$1"; shift
|
|
if [ -z "$confdir" -o -z "$confsdir" -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 "$confsdir" ] || confsdir="$autoconfdir/confs"
|
|
[ -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"
|
|
[ -n "$oneconf" -o -n "$onemodule" -o -n "$onesite" ] && onecms=1
|
|
|
|
# Faire un script sed pour remplacer les variables spécifiées par leur
|
|
# valeur dans les fichiers
|
|
local -a FILLVARS; local FILLSCRIPT FILLTEMP
|
|
__apache_autoconf_fillxxx "$@"
|
|
|
|
# Copie des certificats
|
|
local modified rehash conf
|
|
if [ -d "$certsconfdir" ]; then
|
|
local -a certsconfs certspems
|
|
local certsconf certspem cert key ca
|
|
array_addu FILLVARS cert
|
|
array_addu FILLVARS key
|
|
array_addu FILLVARS ca
|
|
|
|
etitle "Installation des certificats"
|
|
array_lsfiles certsconfs "$certsconfdir" "*.conf"
|
|
for certsconf in "${certsconfs[@]}"; do
|
|
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
|
|
apache_resolvecert "$certsconf" "$certsdir" cert key ca || return 1
|
|
apache_addcert -y "$cert" "$key" "$ca"
|
|
modified=1
|
|
done
|
|
array_lsfiles certspems "$certsconfdir" "*.crt" "*.pem"
|
|
for certspem in "${certspems[@]}"; do
|
|
if copy_update "$certspem" "$APACHESSLCERTSDIR/$(basename -- "$certspem")"; then
|
|
modified=1
|
|
rehash=1
|
|
fi
|
|
done
|
|
eend
|
|
fi
|
|
|
|
# Gestion des configurations
|
|
if [ -d "$confsdir" -a \( -z "$onecms" -o -n "$oneconf" \) ]; then
|
|
local -a confs
|
|
local conf
|
|
etitle "Installation des configurations"
|
|
array_from_lines confs "$(list_files "$confsdir" "*.conf" | __apache_autoconf_filter_suffix_files)"
|
|
for conf in "${confs[@]}"; do
|
|
[ -z "$oneconf" -o "$conf" == "$oneconf" ] || continue
|
|
|
|
estep "$conf"
|
|
__apache_autoconf_fillcopy \
|
|
"$confsdir/$conf" \
|
|
"$destconfsdir/$conf" && modified=1
|
|
done
|
|
eend
|
|
fi
|
|
|
|
# Gestion des modules
|
|
if [ -d "$modulesdir" -a \( -z "$onecms" -o -n "$onemodule" \) ]; then
|
|
local -a confs
|
|
local conf
|
|
etitle "Installation des configurations des modules"
|
|
array_from_lines confs "$(list_files "$modulesdir" "*.conf" | __apache_autoconf_filter_suffix_files)"
|
|
for conf in "${confs[@]}"; do
|
|
[ -z "$onemodule" -o "$conf" == "$onemodule" ] || continue
|
|
|
|
estep "$conf"
|
|
__apache_autoconf_fillcopy \
|
|
"$modulesdir/$conf" \
|
|
"$APACHECONFDIR/mods-available/$conf" && modified=1
|
|
done
|
|
eend
|
|
fi
|
|
|
|
# Règles de réécriture
|
|
if [ -d "$rrdir" -a -z "$onecms" ]; 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"
|
|
__apache_autoconf_fillcopy \
|
|
"$rrdir/$conf" \
|
|
"$APACHECONFDIR/$conf" && modified=1
|
|
done
|
|
eend
|
|
fi
|
|
|
|
# Sites
|
|
local -a enablesites disablesites
|
|
if [ -d "$sitesdir" -a \( -z "$onecms" -o -n "$onesite" \) ]; then
|
|
local -a confs
|
|
local conf confname destconf certsconf
|
|
etitle "Installation des sites"
|
|
array_from_lines confs "$(list_files "$sitesdir" "*.conf" | __apache_autoconf_filter_suffix_files)"
|
|
for confname in "${confs[@]}"; do
|
|
conf="$sitesdir/$confname"
|
|
[ -z "$onesite" -o "$confname" == "$onesite" ] || continue
|
|
|
|
certsconf=
|
|
if [ "${confname%.ssl.conf}" != "$confname" ]; then
|
|
if quietgrep -E '^[^#]*@@(cert|key|ca)@@' "$conf"; then
|
|
if [ -d "$certsconfdir" ]; then
|
|
certsconf="${confname%.ssl.conf}-certs.conf"
|
|
else
|
|
ewarn "$conf: fichier ignoré parce que --certsconfdir n'a pas été spécifié"
|
|
fi
|
|
fi
|
|
fi
|
|
case "$confname" in
|
|
default.conf) destconf="$confdefault";;
|
|
default.ssl.conf) destconf="$confdefaultssl";;
|
|
*) destconf="$confname";;
|
|
esac
|
|
|
|
if [ -n "$certsconf" ]; then
|
|
certsconf="$certsconfdir/$certsconf"
|
|
if [ -f "$certsconf" ]; then
|
|
apache_resolvecert "$certsconf" "$certsdir" cert key ca || return 1
|
|
__apache_autoconf_fillcopy \
|
|
"$conf" \
|
|
"$APACHEAVSITESDIR/$destconf" "\
|
|
s#@@cert@@#$APACHESSLCERTSDIR/$(basename "$cert")#g
|
|
s#@@key@@#$APACHESSLKEYSDIR/$(basename "$key")#g
|
|
s#@@ca@@#$APACHESSLCERTSDIR/$(basename "$ca")#g
|
|
"
|
|
else
|
|
eerror "$(ppath "$certsconf"): fichier introuvable. Il a été ignoré"
|
|
fi
|
|
else
|
|
__apache_autoconf_fillcopy \
|
|
"$conf" \
|
|
"$APACHEAVSITESDIR/$destconf"
|
|
fi
|
|
enablesites=("${enablesites[@]}" "$destconf")
|
|
modified=1
|
|
done
|
|
eend
|
|
fi
|
|
|
|
# Fichiers de configuration
|
|
if [ -d "$confdir" -a -z "$onecms" ]; then
|
|
local -a confs
|
|
local conf
|
|
etitle "Configuration de base"
|
|
array_add ignores confs.conf modules.conf sites.conf
|
|
array_from_lines confs "$(list_files "$confdir" | __apache_autoconf_filter_suffix_files)"
|
|
for conf in "${confs[@]}"; do
|
|
array_contains ignores "$conf" && continue
|
|
estep "$conf"
|
|
__apache_autoconf_fillcopy \
|
|
"$confdir/$conf" \
|
|
"$APACHECONFDIR/$conf" && modified=1
|
|
done
|
|
if [ -f "$confdir/confs.conf" -a -n "$a2xconf" ]; then
|
|
local -a confs
|
|
local conf
|
|
array_from_lines confs "$(<"$confdir/confs.conf" filter_conf)"
|
|
for conf in "${confs[@]}"; do
|
|
if [ "${conf#-}" != "$conf" ]; then
|
|
conf="${conf#-}"
|
|
estep "Désactivation de la configuration $conf"
|
|
a2disconf "$conf" && modified=1
|
|
else
|
|
conf="${conf#+}"
|
|
estep "Activation de la configuration $conf"
|
|
a2enconf "$conf" && modified=1
|
|
fi
|
|
done
|
|
fi
|
|
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#-}"
|
|
estep "Désactivation du module $module"
|
|
a2dismod "$module" && modified=1
|
|
else
|
|
module="${module#+}"
|
|
estep "Activation du module $module"
|
|
a2enmod "$module" && modified=1
|
|
fi
|
|
done
|
|
fi
|
|
if [ -f "$confdir/sites.conf" ]; then
|
|
local -a sitesconfs; local sitesconf enable
|
|
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
|
|
enable=1
|
|
sitesconf="${sitesconf#+}"
|
|
elif [ "${sitesconf#-}" != "$sitesconf" ]; then
|
|
enable=
|
|
sitesconf="${sitesconf#-}"
|
|
else
|
|
enable=1
|
|
fi
|
|
|
|
case "$sitesconf" in
|
|
default.conf) sitesconf="$confdefault";;
|
|
default.ssl.conf) sitesconf="$confdefaultssl";;
|
|
esac
|
|
if [ -n "$enable" ]; then
|
|
array_del disablesites "$sitesconf"
|
|
array_add enablesites "$sitesconf"
|
|
else
|
|
array_del enablesites "$sitesconf"
|
|
array_add disablesites "$sitesconf"
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
eend
|
|
fi
|
|
|
|
# Scripts CGI
|
|
if [ -d "$cgibindir" -a -z "$onecms" ]; then
|
|
etitle "Installation des scripts CGI"
|
|
cpdirnovcs "$cgibindir" "$CGIBINDIR"
|
|
eend
|
|
fi
|
|
|
|
# Contenu web
|
|
if [ -d "$wwwdir" -a -z "$onecms" ]; then
|
|
etitle "Installation des fichiers du serveur web"
|
|
cpdirnovcs "$wwwdir" "$HTDOCSDIR"
|
|
eend
|
|
fi
|
|
|
|
# Nettoyer le fichier temporaire
|
|
ac_clean "$FILLTEMP"
|
|
|
|
if [ -n "${enablesites[*]}" -o -n "${disablesites[*]}" ]; then
|
|
etitle "(dés)Activation des sites"
|
|
local site
|
|
for site in "${enablesites[@]}"; do
|
|
estep "Activation du site $site"
|
|
a2ensite "$site"
|
|
done
|
|
for site in "${disablesites[@]}"; do
|
|
estep "Désactivation du site $site"
|
|
a2dissite "$site"
|
|
done
|
|
eend
|
|
fi
|
|
|
|
if [ -n "$modified" ]; then
|
|
[ -n "$rehash" ] && elinedots "Hashage des certificats" c_rehash
|
|
if [ -n "$restart" ]; then
|
|
estep "Redémarrage d'apache"
|
|
"$APACHECTL" restart
|
|
fi
|
|
fi
|
|
}
|
|
|
|
function apache_autoconf_localhosts() {
|
|
eval "$(utools_local)"
|
|
local autoconfdir sitesdir onesite
|
|
parse_opts "${PRETTYOPTS[@]}" \
|
|
--sitesdir: sitesdir= \
|
|
--one-site: onesite= \
|
|
@ args -- "$@" && set -- "${args[@]}" || die "$args"
|
|
|
|
__apache_autoconf_setup || return 1
|
|
|
|
# Configuration
|
|
autoconfdir="$1"; shift
|
|
[ -n "$autoconfdir" ] || {
|
|
eerror "Vous devez spécifier le répertoire de base de la configuration apache"
|
|
return 1
|
|
}
|
|
[ -n "$sitesdir" ] || sitesdir="$autoconfdir/sites"
|
|
|
|
# Faire un script sed pour remplacer les variables spécifiées par leur
|
|
# valeur dans les fichiers
|
|
local -a FILLVARS; local FILLSCRIPT FILLTEMP ULIB_INSTALL_VERBOSE
|
|
__apache_autoconf_fillxxx "$@"
|
|
|
|
local -a newhosts
|
|
if [ -d "$sitesdir" ]; then
|
|
local -a localips localhosts confs candidates newhosts
|
|
local conf tmpconf candidate
|
|
|
|
array_from_lines localips "$(</etc/hosts awk '$1 ~ /127\./ { print $1 }' | sort -u)"
|
|
array_from_lines localhosts "$(</etc/hosts awk '$1 ~ /127\./ { for (i = 2; i <= NF; i++) { if ($i ~ /\.local$/) print $i } }' | sort -u)"
|
|
|
|
ac_set_tmpfile tmpconf
|
|
array_lsfiles confs "$sitesdir" "*.conf"
|
|
for conf in "${confs[@]}"; do
|
|
confname="$(basename "$conf")"
|
|
[ -z "$onesite" -o "$confname" == "$onesite" ] || continue
|
|
|
|
__apache_autoconf_fillcopy "$conf" "$tmpconf"
|
|
array_from_lines candidates "$(<"$tmpconf" awk '
|
|
$1 == "ServerName" && $2 ~ /\.local$/ { print $2 }
|
|
$1 == "ServerAlias" { for (i = 2; i <= NF; i++) { if ($i ~ /\.local$/) print $i } }
|
|
')"
|
|
for candidate in "${candidates[@]}"; do
|
|
array_contains localhosts "$candidate" || array_addu newhosts "$candidate"
|
|
done
|
|
done
|
|
fi
|
|
|
|
local ip host i=0
|
|
for host in "${newhosts[@]}"; do
|
|
i=$(($i + 1)); ip="127.0.1.$i"
|
|
while array_contains localips "$ip"; do
|
|
i=$(($i + 1)); ip="127.0.1.$i"
|
|
done
|
|
estep "Ajout de $ip $host"
|
|
echo "$ip $host" >>/etc/hosts
|
|
done
|
|
}
|
|
|
|
function __template_defaultf_host() {
|
|
myhost
|
|
}
|
|
function __template_updatef_host() {
|
|
if [ "$host" == "@@dhost@@" ]; then
|
|
__template_set_var hostname @@dhostname@@
|
|
__template_set_var aliases @@daliases@@
|
|
else
|
|
local update_aliases
|
|
[ "$aliases" == "$hostname" ] && update_aliases=1
|
|
__template_set_var hostname "${host%%.*}"
|
|
[ -n "$update_aliases" ] && __template_set_var aliases "$hostname"
|
|
[ -n "$ips" ] || __template_set_var ips ""
|
|
fi
|
|
}
|
|
|
|
function __template_defaultf_ips() {
|
|
local -a ips
|
|
if [ "$host" != "@@dhost@@" ]; then
|
|
resolv_ips ips "$host"
|
|
else
|
|
resolv_ips ips "$dhost"
|
|
fi
|
|
echo "${ips[*]}"
|
|
}
|
|
function __template_updatef_ips() {
|
|
local -a ipports; local ipport ip port
|
|
local nvhs ls
|
|
nvhs=
|
|
ls=
|
|
array_split ipports "$ips" " "
|
|
for ipport in "${ipports[@]}"; do
|
|
splitpair "$ipport" ip port
|
|
[ -n "$port" ] || port=443
|
|
[ -n "$nvhs" ] || nvhs="#ips_namevirtualhosts"
|
|
nvhs="$nvhs
|
|
NameVirtualHost $ip:$port"
|
|
[ -n "$ls" ] || ls="#ips_listens"
|
|
ls="$ls
|
|
Listen $ip:$port"
|
|
done
|
|
[ -n "$nvhs" ] && __template_set_var ips_namevirtualhosts "$nvhs"
|
|
[ -n "$ls" ] && __template_set_var ips_listens "$ls"
|
|
}
|
|
|
|
function __template_defaultf_dhost() {
|
|
myhost
|
|
}
|
|
function __template_updatef_dhost() {
|
|
local update_daliases
|
|
[ "$daliases" == "$dhostname" ] && update_daliases=1
|
|
__template_set_var dhostname "${dhost%%.*}"
|
|
[ -n "$update_daliases" ] && __template_set_var daliases "$dhostname"
|
|
[ -n "$ips" ] || __template_set_var ips ""
|
|
}
|
|
|
|
# toujours placer une variable dépendante AVANT la variable maitre
|
|
APACHECONFIG_TEMPLATE_STATIC_VARS=(
|
|
hostname aliases host
|
|
certsdir caname
|
|
)
|
|
APACHECONFIG_TEMPLATE_DYNAMIC_VARS=(
|
|
ips_namevirtualhosts ips_listens ips
|
|
dhostname daliases dhost
|
|
admin configdir
|
|
)
|
|
APACHECONFIG_TEMPLATE_NOWRITE_VARS=(hostname aliases dhostname daliases configdir)
|
|
|
|
function apacheconfig_initvars() {
|
|
DEFAULT_ADMIN=supervision-gdrsi@listes.univ-reunion.fr
|
|
DEFAULT_CERTSDIR=1507-renater
|
|
DEFAULT_CANAME=1507-DigiCertCA.crt
|
|
set_defaults apacheconfig
|
|
|
|
TEMPLATE_STATIC_VARS=("${APACHECONFIG_TEMPLATE_STATIC_VARS[@]}")
|
|
TEMPLATE_DYNAMIC_VARS=("${APACHECONFIG_TEMPLATE_DYNAMIC_VARS[@]}")
|
|
TEMPLATE_NOWRITE_VARS=("${APACHECONFIG_TEMPLATE_NOWRITE_VARS[@]}")
|
|
__TEMPLATE_DEFAULTF_host=__template_defaultf_host
|
|
__TEMPLATE_UPDATEF_host=__template_updatef_host
|
|
__TEMPLATE_DEFAULTF_ips=__template_defaultf_ips
|
|
__TEMPLATE_UPDATEF_ips=__template_updatef_ips
|
|
__TEMPLATE_DEFAULTF_dhost=__template_defaultf_dhost
|
|
__TEMPLATE_UPDATEF_dhost=__template_updatef_dhost
|
|
|
|
TEMPLATECTL_NAME=apacheconfig
|
|
TEMPLATECTL_SRCDIRS=(apacheconfig)
|
|
TEMPLATECTL_CONFIG="$TEMPLATECTL_NAME"
|
|
TEMPLATECTL_DEFAULTS=(
|
|
admin="$DEFAULT_ADMIN"
|
|
certsdir="$DEFAULT_CERTSDIR"
|
|
caname="$DEFAULT_CANAME"
|
|
)
|
|
TEMPLATECTL_VARS=()
|
|
}
|
|
|
|
function apacheconfig_loadconf() {
|
|
local config modified
|
|
local destdir="$1" autocreate
|
|
|
|
__template_set_destdir destdir autocreate "$TEMPLATECTL_NAME" || return 1
|
|
setx config=templatectl_config "$destdir"
|
|
modified=
|
|
templatectl_loadvars "$config" && modified=1
|
|
|
|
upvars config "$config" modified "$modified" \
|
|
destdir "$destdir" autocreate "$autocreate"
|
|
}
|
|
|
|
function apacheconfig_sysinfos() {
|
|
local sysname="$1" sysdist="$2" sysver="$3" bits="$4" custom_sysinfos
|
|
|
|
if [ -n "$sysname" -o -n "$sysdist" -o -n "$sysver" ]; then
|
|
ensure_sysinfos sysname sysdist sysver
|
|
custom_sysinfos=1
|
|
else
|
|
sysname="$MYSYSNAME"
|
|
sysdist="$MYSYSDIST"
|
|
sysver="$MYSYSVER"
|
|
bits="$MYBITS"
|
|
custom_sysinfos=
|
|
fi
|
|
__template_set_var sysname "$sysname"
|
|
__template_set_var sysdist "$sysdist"
|
|
__template_set_var sysver "$sysver"
|
|
#check_sysinfos --vars sysname sysdist sysver bits "${templatectl_suffix[@]}
|
|
|
|
upvars sysname "$sysname" sysdist "$sysdist" sysver "$sysver" bits "$bits" \
|
|
custom_sysinfos "$custom_sysinfos"
|
|
}
|
|
|
|
function apacheconfig_deploy() {
|
|
local destdir="$1" certsdir="$2"; shift; shift
|
|
local config="$1" oneconf="$2" onemodule="$3"; onesite="$4"; shift; shift; shift; shift
|
|
local custom_sysinfos="$1" sysname="$2" sysdist="$3" sysver="$4" bits="$5"; shift; shift; shift; shift; shift
|
|
|
|
local -a args
|
|
args=(--ignore "$(basename -- "$config")")
|
|
[ -n "$oneconf" ] && array_add args --one-conf "$(basename -- "$oneconf")"
|
|
[ -n "$onemodule" ] && array_add args --one-module "$(basename -- "$onemodule")"
|
|
[ -n "$onesite" ] && array_add args --one-site "$(basename -- "$onesite")"
|
|
[ -n "$custom_sysinfos" ] && array_add args --sysname "$sysname" --sysdist "$sysdist" --sysver "$sysver" --bits "$bits"
|
|
array_add args "$destdir" "$certsdir"
|
|
for __name in "${TEMPLATE_DYNAMIC_VARS[@]}"; do
|
|
array_add args "$__name=${!__name}"
|
|
done
|
|
apache_autoconf "${args[@]}" "$@"
|
|
}
|
|
|
|
function apacheconfig_localhosts() {
|
|
local destdir="$1" certsdir="$2"; shift; shift
|
|
local onesite="$1"; shift
|
|
|
|
local -a args
|
|
[ -n "$onesite" ] && array_add args --one-site "$(basename -- "$onesite")"
|
|
array_add args "$destdir" "$certsdir"
|
|
for __name in "${TEMPLATE_DYNAMIC_VARS[@]}"; do
|
|
array_add args "$__name=${!__name}"
|
|
done
|
|
apache_autoconf_localhosts "${args[@]}" "$@"
|
|
}
|