##@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 template apache function __apache_rc_destdir() { [ -z "$3" ] && setv "${1:-certsdir}" "$(get_APACHESSLCERTSDIR_prefix)" [ -z "$4" ] && setv "${2:-keysdir}" "$(get_APACHESSLKEYSDIR_prefix)" } function __apache_rc_loadconf() { [ -n "$__rc_dir" ] || __rc_dir="$(dirname "$__rc_conf")" eval "$( source "$__rc_conf" echo_setv __rc_cert "$cert" echo_setv __rc_key "$key" echo_setv __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_rc_resolveprefix() { local __prefix __cert __key local __certsdir="$1" __keysdir="$2" __apache_rc_destdir __certsdir __keysdir "$__certsdir" "$__keysdir" if [ -z "$__rc_cert" ]; then # si pas de certificat, alors générer un préfixe pour chercher les # fichiers setx __prefix=basename "$__rc_conf" __prefix="${__prefix%certs.conf}" elif [ ! -f "$__rc_cert" ]; then # si le fichier source n'existe pas, vérifier s'il existe dans la # destination setx __cert=basename "$__rc_cert" setx __key=basename "$__rc_key" if [ -f "$__certsdir/$__cert" -a -f "$__keysdir/$__key" ]; then # parfait, les fichiers existent déjà à l'endroit prévu : else # construire un préfixe avec le nom du fichier __prefix="$__cert" if [ "${__prefix%.pem}" != "$__prefix" ]; then __prefix="${__prefix%.pem}" elif [ "${__prefix%.crt}" != "$__prefix" ]; then __prefix="${__prefix%.crt}" fi if [ -n "${__prefix//[0-9]/}" ]; then # enlever le suffixe numérique, uniquement si le nom ne contient # pas que des chiffres while [ -n "$__prefix" -a "${__prefix%[0-9]}" != "$__prefix" ]; do __prefix="${__prefix%[0-9]}" done fi fi fi if [ -n "$__prefix" ]; then local -a __certs array_from_lines __certs "$(list_files "$__certsdir" "$__prefix*" | LANG=C sort -r)" if [ ${#__certs[*]} -gt 0 ]; then __cert="${__certs[0]}" __key="${__cert%.*}.key" __rc_cert="$__rc_dir/$__cert" __rc_key="$__rc_dir/$__key" fi fi } function __apache_rc_checkfiles() { local destdir="$1"; shift local file for file in "$@"; do [ -n "$file" ] || continue [ -f "$file" ] && continue if [ -n "$destdir" -a -f "$destdir/$(basename "$file")" ]; then [ -z "$__apache_rc_quiet" ] && ewarn "$file: fichier introuvable Le fichier existant $destdir/$(basename "$file") sera utilisé" continue fi eerror "$file: fichier introuvable" return 1 done return 0 } function __apache_rc_checkvars() { local __certsdir="$1" __keysdir="$2" __apache_rc_destdir __certsdir __keysdir "$__certsdir" "$__keysdir" 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" [ -z "$__apache_rc_quiet" ] && 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 [ -z "$__apache_rc_quiet" ] && eattention "Seul le certificat autorité a été spécifié." elif [ -z "$__rc_ca" ]; then [ -z "$__apache_rc_quiet" ] && ewarn "Aucun certificat autorité n'a pas été spécifié. Cela ne peut marcher que si le certificat est autosigné" fi __apache_rc_checkfiles "$__certsdir" "$__rc_ca" "$__rc_cert" || return 1 __apache_rc_checkfiles "$__keysdir" "$__rc_key" || return 1 return 0 } 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) # Si ces valeurs sont déjà calculées, on peut fournir $6=certsdir et # $7=keysdir local __rc_conf="$1" __rc_dir="$2" local __rc_cert __rc_key __rc_ca local __certsdir="$6" __keysdir="$7" __apache_rc_destdir __certsdir __keysdir "$__certsdir" "$__keysdir" __apache_rc_loadconf __apache_rc_resolveprefix "$__certsdir" "$__keysdir" __apache_rc_checkvars "$__certsdir" "$__keysdir" || return 1 setv "${3:-cert}" "$__rc_cert" setv "${4:-key}" "$__rc_key" setv "${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 certssrcdir 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: certssrcdir= \ --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 certsdir keysdir __apache_rc_destdir certsdir keysdir local __rc_conf __rc_dir local __rc_cert __rc_key __rc_ca if [ -n "$certsconf" ]; then __rc_conf="$certsconf" __rc_dir="$certssrcdir" __apache_rc_loadconf __apache_rc_resolveprefix "$certsdir" "$keysdir" __apache_rc_checkvars "$certsdir" "$keysdir" || return 1 else __rc_cert="$1" __rc_key="$2" __rc_ca="$3" __apache_rc_checkvars "$certsdir" "$keysdir" || 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 etitled "Copie des fichiers" 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" -a -f "$cert" ]; then if copy_update "$cert" "$certsdir"; then chmod 644 "$certsdir/$(basename "$cert")" || return 1 fi if copy_update "$key" "$keysdir"; then chmod 640 "$keysdir/$(basename "$key")" || return 1 fi fi if [ -n "$ca" -a -f "$ca" ]; then if copy_update "$ca" "$certsdir"; then chmod 644 "$certsdir/$(basename "$ca")" || return 1 fi fi eend return 0 } function __apache_autoconf_setup() { if ! check_sysinfos --vars sysname sysdist sysver bits -s linux64 linux32 linux -d debian; then eerror "$(get_sysinfos_desc): système non supporté. debian linux est requis" return 1 fi urequire debian install if [ -z "$__apache_autoconf_no_require_apache" ]; then pkg_check apache2 || { eerror "apache2 non installé. impossible de continuer" return 1 } fi 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 local src="$1" dest="$2" sedscript="$3" perms="${4:-go+rX}" # 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" && return estepn "$(basename -- "$dest")" return 1 } __APACHE_AUTOCONF_HELP="\ --confdir CONFDIR Spécifier l'emplacement des fichiers de configuration apache ainsi que des fichiers 'syspkgs.conf', '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 netconf 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= \ --network-config netconf=1 \ @ 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_no_require_apache= __apache_autoconf_setup || return 1 if check_sysinfos --vars sysname sysdist sysver bits -d debian -v jessie+; then confdefault=000-default.conf confdefaultssl=default-ssl.conf destconfsdir="$APACHECONFDIR/conf-available" a2xconf=1 elif check_sysinfos --vars sysname sysdist sysver bits -d debian; 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 "$@" # Installation des packages système if [ -f "$confdir/syspkgs.conf" ]; then local -a syspkgs local syspkg array_from_lines syspkgs "$(<"$confdir/syspkgs.conf" filter_conf)" if ! pkg_check "${syspkgs[@]}"; then etitle "Installation de paquets système" estep "${syspkgs[@]}" pkg_install "${syspkgs[@]}" || return 1 eend fi fi # 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" [ -n "$certsdir" -a ! -d "$certsdir" ] && ewarn "$certsdir: répertoire invalide" array_lsfiles certsconfs "$certsconfdir" "*.conf" for certsconf in "${certsconfs[@]}"; do apache_addcert -y -C "$certsconf" -d "$certsdir" "$cert" "$key" "$ca" || return 1 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")" for conf in "${confs[@]}"; do [ -z "$oneconf" -o "$conf" == "$oneconf" ] || continue __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")" for conf in "${confs[@]}"; do [ -z "$onemodule" -o "$conf" == "$onemodule" ] || continue __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 # legacy... remplacé par des fichiers de règles directement dans le répertoire de configuration 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 __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 sedscript copied etitle "Installation des sites" array_from_lines confs "$(list_files "$sitesdir" "*.conf")" 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 copied= if [ -n "$certsconf" ]; then certsconf="$certsconfdir/$certsconf" if [ -f "$certsconf" ]; then __apache_rc_quiet=1 apache_resolvecert "$certsconf" "$certsdir" cert key ca || return 1 if [ -n "$cert" -a -n "$key" ]; then sedscript="\ s#@@cert@@#$APACHESSLCERTSDIR/$(basename "$cert")#g s#@@key@@#$APACHESSLKEYSDIR/$(basename "$key")#g" if [ -n "$ca" ]; then sedscript="$sedscript s#@@ca@@#$APACHESSLCERTSDIR/$(basename "$ca")#g" else sedscript="$sedscript /@@ca@@/s/^/#/g" fi __apache_autoconf_fillcopy \ "$conf" \ "$APACHEAVSITESDIR/$destconf" "$sedscript" copied=1 else eerror "$(ppath "$certsconf"): définition des certificats introuvable Le fichier de configuration $confname a été ignoré" fi else eerror "$(ppath "$certsconf"): fichier introuvable Le fichier de configuration $confname a été ignoré" fi else __apache_autoconf_fillcopy \ "$conf" \ "$APACHEAVSITESDIR/$destconf" copied=1 fi if [ -n "$copied" ]; then enablesites=("${enablesites[@]}" "$destconf") modified=1 fi 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 syspkgs.conf confs.conf modules.conf sites.conf network.conf array_from_lines confs "$(list_files "$confdir")" for conf in "${confs[@]}"; do array_contains ignores "$conf" && continue __apache_autoconf_fillcopy \ "$confdir/$conf" \ "$APACHECONFDIR/$conf" && modified=1 done array_from_lines confs "$(list_files "$confdir" "*rewrite*.rules")" if [ ${#confs[*]} -gt 0 ]; then etitle "Règles de réécriture" for conf in "${confs[@]}"; do [ -f "$APACHECONFDIR/$conf" ] || continue estep "$conf" legacy_mkRewriteRules "$APACHECONFDIR/$conf" && modified=1 done eend fi 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 [ -z "$onecms" ]; then etitled "Installation des fichiers du serveur web" if is_defined HTDMAPPINGS; then local htdmapping src dest for htdmapping in "${HTDMAPPINGS[@]}"; do splitpair "$htdmapping" dest src [ -n "$dest" ] || dest=html case "$dest" in html) [ -n "$src" ] || src=www;; *) [ -n "$src" ] || src="$dest";; esac withpath "$src" || src="$confdir/$src" withpath "$dest" || dest="$HTDOCSBASE/$dest" estep "$src --> $dest" cpdirnovcs "$src" "$dest" # par défaut, le propriétaire est root. est-ce nécessaire? #chown -R www-data: "$dest" done elif [ -d "$wwwdir" ]; then estep "$wwwdir --> $HTDOCSDIR" cpdirnovcs "$wwwdir" "$HTDOCSDIR" # par défaut, le propriétaire est root. est-ce nécessaire? #chown -R www-data: "$HTDOCSDIR" fi 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 # Mettre à jour la configuration réseau if [ -z "$onecms" -a -n "$netconf" -a -f "$confdir/network.conf" ]; then local -a ips brs; local host etc_networks eval "$( source "$confdir/network.conf" set_array_cmd ips set_array_cmd brs echo_setv host "$host" echo_setv etc_networks "$etc_networks" )" etitled "Vérification de la configuration du réseau" if [ -n "$FULLCONF" ]; then if [ ${#ips[*]} -gt 0 -o ${#brs[*]} -gt 0 -o -n "$hosts" ]; then network_config "$host" ips brs && modified=1 fi [ -n "$etc_networks" ] && network_update_etc_networks "$etc_networks" else if [ ${#ips[*]} -gt 0 ]; then network_config_partial ips && modified=1 fi fi 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_no_require_apache=1 __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 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 "" } # syntaxe: var[:depvars,...][=desc] APACHECONFIG_TEMPLATE_STATIC_VARS=( host:hostname,aliases="hôte pour lequel ce template a été créé. # les variables hostname et aliases sont automatiquement générées. # utiliser @@dhost@@ pour déployer dynamiquement avec le nom d'hôte courant." certsdir="répertoire par défaut contenant les certificats à déployer" caname="nom de l'autorité par défaut" ) APACHECONFIG_TEMPLATE_DYNAMIC_VARS=( ips:ips_namevirtualhosts,ips_listens="liste d'adresses de la forme ip[:port], séparées par un espace. # ces adresses sont celles sur lesquelles apache doit écouter. ce paramètre n'a # de sens que sur squeeze. en effet, la configuration par défaut sur jessie rend # ce paramétrage inutile." dhost:dhostname,daliases="hôte pour lequel les fichiers doivent être déployés. # les variables dhostname et daliases sont automatiquement générées. # cette variable n'a besoin d'être modifiée que si host=@@dhost@@ ci-dessous" admin="mail de l'administrateur du serveur" configdir="répertoire dans lequel le template a été généré" ) APACHECONFIG_TEMPLATE_NOWRITE_VARS=(configdir) APACHECONFIG_TEMPLATE_USER_VARS=( FULLCONF="Est-on en mode configuration complète?" HTDMAPPINGS="Mapping des répertoires destination dans /var/www vers le répertoire local, e.g. html:www" ) function __apacheconfig_initsrcdirs() { if check_sysinfos "$@" -d debian -v jessie+; then TEMPLATECTL_SRCDIRS=(apacheconfig.d8) else TEMPLATECTL_SRCDIRS=(apacheconfig) fi } function apacheconfig_initvars() { DEFAULT_ADMIN=supervision-gdrsi@listes.univ-reunion.fr DEFAULT_CERTSDIR=1507-renater DEFAULT_CANAME=1507-DigiCertCA.crt set_defaults apacheconfig TEMPLATE_NOWRITE_VARS=("${APACHECONFIG_TEMPLATE_NOWRITE_VARS[@]}") template_build_vars TEMPLATE_STATIC_VARS TEMPLATE_NOWRITE_VARS "${APACHECONFIG_TEMPLATE_STATIC_VARS[@]}" template_build_vars TEMPLATE_DYNAMIC_VARS TEMPLATE_NOWRITE_VARS "${APACHECONFIG_TEMPLATE_DYNAMIC_VARS[@]}" template_build_vars TEMPLATE_USER_VARS "" "${APACHECONFIG_TEMPLATE_USER_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 __apacheconfig_initsrcdirs TEMPLATECTL_CONFIG="$TEMPLATECTL_NAME" TEMPLATECTL_DEFAULTS=( admin="$DEFAULT_ADMIN" certsdir="$DEFAULT_CERTSDIR" caname="$DEFAULT_CANAME" ) TEMPLATECTL_VARS=() } function apacheconfig_loadconf() { local config modified autocreate local destdir="$1" nohideconfig="$2" # valeurs par défaut is_defined HTDMAPPINGS || HTDMAPPINGS=(html:www) __template_set_destdir destdir autocreate "$TEMPLATECTL_NAME" || return 1 setx config=templatectl_config "$destdir" ${nohideconfig:+nohideconfig} 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" # mettre à jour la source en fonction du système cible __apacheconfig_initsrcdirs --vars sysname sysdist sysver bits 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 netconf="$1"; 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" [ -n "$netconf" ] && array_add args --network-config array_add args "$destdir" "$certsdir" for __name in "${TEMPLATE_DYNAMIC_VARS[@]}"; do array_add args "$__name=${!__name}" done apache_autoconf "${args[@]}" "$@" } function apacheconfig_qs() { # fonction pour simplifier l'utilisation de apacheconfig_deploy pour un # répertoire spécifique # $1=destdir $2=certsdir $3=netconf local destdir="$1" certsdir="$2" netconf="$3" local config modified destdir autocreate apacheconfig_initvars apacheconfig_loadconf "$1" apacheconfig_deploy \ "$destdir" "$2" \ "$config" "" "" "" \ "" "" "" "" "" \ "$3" } 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[@]}" "$@" } function __mrr_joinurl() { # joindre chaque élément de $1..@ par /, en évitant les slashes en double local i url for i in "$@"; do [ -n "$i" ] || continue if [ -n "$url" ]; then url="${url%/}/${i#/}" else url="$i" fi done [ -n "$url" ] && echo "$url" } function __mrr_has_proxy() { # vérifier que les options $1 contiennent 'P' local -a options array_split options "$1" "," array_contains options P } function legacy_mkRewriteRules() { # $1=infile, $2=thishost, $3=outfile, $4=htmlfile, $5=proxy_enabled? local infile="$1" thishost="$2" outfile="$3" htmlfile="$4" proxy_enabled="$5" local -a rules; local rule prefix index done current local tmpinfile tmpoutfile local src dest host suffix options prot proxy_acls usrc trail noslash proxy_url proxy_use if [ -z "$infile" -o "$infile" == - ]; then infile=/dev/stdin elif [ -z "$outfile" ]; then local outdir="$(dirname -- "$infile")" outfile="$(basename -- "$infile")" if [[ "$outfile" == *rewrite*.rules ]]; then outfile="${outfile/rewrite/RewriteRules}" outfile="${outfile/.rules/.conf}" else outfile="$outfile-RewriteRules.conf" fi outfile="$outdir/$outfile" fi [ -n "$outfile" -a "$outfile" != - ] || outfile=/dev/stdout if [ -z "$thishost" -o -z "$proxy_enabled" ]; then # le cas échéant, lire les paramètres manquant depuis le fichier if [ "$infile" == /dev/stdin ]; then ac_set_tmpfile tmpinfile cat >"$tmpinfile" infile="$tmpinfile" fi eval "$(awkrun -f <"$infile" ' /^[^#]/ { exit 0 } /^#+ *host *=/ { sub(/^#+ *host *= */, ""); sub(/ *$/, ""); print "thishost=" qval($0); next } /^#+ *enable_proxy *=/ { sub(/^#+ *enable_proxy *= */, ""); sub(/ *$/, ""); print "proxy_enabled=" qval($0); next } ')" fi [ -n "$thishost" ] || thishost="$(myhost)" normyesval proxy_enabled if [ -n "$htmlfile" ]; then echo ' '"$thishost

$thishost

' >>"$htmlfile" fi [ -n "$tmpinfile" ] && ac_clean "$tmpinfile" ac_clean "$tmpoutfile" [ -n "$modified" ] }