##@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 fixip
    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 \
        --fix-ip fixip=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 "$@"
    if [ -n "$fixip" ]; then
        FILLSCRIPT="$FILLSCRIPT
"'s/<VirtualHost \*:\([0-9][0-9]*\)>#\*ip:\(.*\)$/<VirtualHost \2:\1>/'
    fi

    # 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 post-update.sh
        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 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 ""
}

# 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
    PUBDOMAINS=(univ-reunion.fr)
    PRIDOMAINS=(univ.run)
    VSPREFIX=vs-
    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" fixip="$2" no_post_update="$3"; shift; shift; shift
    local configdir="$(basename -- "$config")"

    local -a args
    args=(--ignore "$configdir")
    [ -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
    [ -n "$fixip" ] && array_add args --fix-ip
    array_add args "$destdir" "$certsdir"
    for __name in "${TEMPLATE_DYNAMIC_VARS[@]}"; do
        array_add args "$__name=${!__name}"
    done
    apache_autoconf "${args[@]}" "$@" || return 1
    if [ -x "$configdir/post-update.sh" ]; then
        "$configdir/post-update.sh" \
            "$destdir" "$certsdir" \
            "$config" "$oneconf" "$onemodule" "$onesite" \
            "$custom_sysinfos" "$sysname" "$sysdist" "$sysver" "$bits" \
            "$netconf" "$fixip" || return 2
    fi
    return 0
}

function apacheconfig_qs() {
    # fonction pour simplifier l'utilisation de apacheconfig_deploy pour un
    # répertoire spécifique
    # $1=destdir $2=certsdir $3=netconf $4=fixip
    local config modified destdir autocreate
    apacheconfig_initvars
    apacheconfig_loadconf "$1"
    apacheconfig_deploy \
        "$destdir" "$2" \
        "$config" "" "" "" \
        "" "" "" "" "" \
        "$3" "$4" ""
}

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 '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!-- -*- coding: utf-8 mode: html -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>'"$thishost</title>
</head>
<body>
<h2>$thishost</h2>
<ul>" >"$htmlfile"
    fi

    ac_set_tmpfile tmpoutfile
    array_from_lines rules "$(<"$infile" filter_comment)"
    prefix=
    for rule in "${rules[@]}"; do
        if beginswith "$rule" ^; then
            # Collecter les préfixe pour la règle suivante
            prefix="${prefix:+$prefix
}${rule#^}"
            continue
        elif beginswith "$rule" =; then
            # ligne litérale
            echo "${rule#=}" >>"$tmpoutfile"
            continue
        fi

        local IFS=:; set -- $rule; unset IFS
        index=1
        done=
        while [ -z "$done" ]; do
            current="$1"; shift
            while [ "${current%\\}" != "$current" ]; do
                current="${current%\\}:$1"; shift
            done
            case $index in
            1) src="$current";;
            2) dest="$current";;
            3) host="$current";;
            4) suffix="$current";;
            5) options="$current";;
            6) prot="${current:-http}";;
            7) proxy_acls="$current";;
            *) done=1;;
            esac
            index=$(($index + 1))
        done

        # mettre en forme prefix s'il est défini
        [ -n "$prefix" ] && prefix="$prefix
"

        [ "$thishost" == "$host" ] && host=

        usrc="$src"

        trail=1
        if endswith "$src" '$'; then
            trail=
            usrc="${src%$}"
        fi

        noslash=
        if endswith "$suffix" '$'; then
            noslash=1
            suffix="${suffix%$}"
        fi
        if endswith "$dest" '$'; then
            noslash=1
            dest="${dest%$}"
        fi

        proxy_url=
        proxy_use=

        if endswith "$dest" .woa; then
            # lien vers une application
            if [ -n "$host" ]; then
                # sur un autre hôte
                if [ -n "$noslash" ]; then
                    echo "${prefix}RewriteRule ^/$src${trail:+(.*)} $(__mrr_joinurl "$prot://$host/cgi-bin/WebObjects" "$dest" "$suffix")${trail:+\$1} [L${options:+,$options}]" >>"$tmpoutfile"
                    setx url __mrr_joinurl "http://$thishost" "$usrc"
                    setx proxy_url __mrr_joinurl "$prot://$host/cgi-bin/WebObjects" "$dest" "$suffix"
                else
                    echo "${prefix}RewriteRule ^/$src\$ /$src/" >>"$tmpoutfile"
                    echo "${prefix}RewriteRule ^/$src/(.*) $(__mrr_joinurl "$prot://$host/cgi-bin/WebObjects" "$dest" "$suffix" "\$1") [L${options:+,$options}]" >>"$tmpoutfile"
                    setx url __mrr_joinurl "http://$thishost" "$usrc/"
                    setx proxy_url __mrr_joinurl "$prot://$host/cgi-bin/WebObjects" "$dest" "$suffix/"
                fi
            else
                # sur le même hôte
                if [ -n "$noslash" ]; then
                    echo "${prefix}RewriteRule ^/$src${trail:+(.*)} $(__mrr_joinurl /cgi-bin/WebObjects "$dest" "$suffix")${trail:+\$1} [L,P${options:+,$options}]" >>"$tmpoutfile"
                    setx url __mrr_joinurl "http://$thishost" "$usrc"
                    setx proxy_url __mrr_joinurl "$prot://$thishost/cgi-bin/WebObjects" "$dest" "$suffix"
                    proxy_use=1
                else
                    echo "${prefix}RewriteRule ^/$src\$ /$src/" >>"$tmpoutfile"
                    echo "${prefix}RewriteRule ^/$src/(.*) $(__mrr_joinurl /cgi-bin/WebObjects "$dest" "$suffix" "\$1") [L,P${options:+,$options}]" >>"$tmpoutfile"
                    setx url __mrr_joinurl "http://$thishost" "$usrc/"
                    setx proxy_url __mrr_joinurl "$prot://$thishost/cgi-bin/WebObjects" "$dest" "$suffix/"
                    proxy_use=1
                fi
            fi
        else
            # lien vers une url
            if [ -n "$host" ]; then
                # sur un autre hôte
                if [ -n "$noslash" ]; then
                    echo "${prefix}RewriteRule ^/$src${trail:+(.*)} $(__mrr_joinurl "$prot://$host" "$dest" "$suffix")${trail:+\$1} [L${options:+,$options}]" >>"$tmpoutfile"
                    setx url __mrr_joinurl "http://$thishost" "$usrc"
                    setx proxy_url __mrr_joinurl "$prot://$host" "$dest" "$suffix"
                else
                    echo "${prefix}RewriteRule ^/$src\$ /$src/" >>"$tmpoutfile"
                    echo "${prefix}RewriteRule ^/$src/(.*) $(__mrr_joinurl "$prot://$host" "$dest" "$suffix" "\$1") [L${options:+,$options}]" >>"$tmpoutfile"
                    setx url __mrr_joinurl "http://$thishost" "$usrc/"
                    setx proxy_url __mrr_joinurl "$prot://$host" "$dest" "$suffix/"
                fi
            else
                # sur le même hôte
                if [ -n "$noslash" ]; then
                    echo "${prefix}RewriteRule ^/$src${trail:+(.*)} $(__mrr_joinurl / "$dest" "$suffix")${trail:+\$1}${options:+ [$options]}" >>"$tmpoutfile"
                    setx url __mrr_joinurl "http://$thishost" "$usrc"
                    setx proxy_url __mrr_joinurl "http://$thishost" "$dest" "$suffix"
                else
                    echo "${prefix}RewriteRule ^/$src\$ /$src/" >>"$tmpoutfile"
                    echo "${prefix}RewriteRule ^/$src/(.*) $(__mrr_joinurl / "$dest" "$suffix" "\$1")${options:+ [$options]}" >>"$tmpoutfile"
                    setx url __mrr_joinurl "http://$thishost" "$usrc/"
                    setx proxy_url __mrr_joinurl "http://$thishost" "$dest" "$suffix/"
                fi
            fi
        fi
        __mrr_has_proxy "$options" && proxy_use=1
        if [ -n "$proxy_enabled" -a -n "$proxy_use" ]; then
            if [ "$proxy_acls" == "None" ]; then
                :
            elif [ -z "$proxy_acls" ]; then
                echo "\
<Proxy $proxy_url*>
    AddDefaultCharset off
    Order Deny,Allow
    Allow from all
</Proxy>" >>"$tmpoutfile"
            else
                echo "\
<Proxy $proxy_url*>
    AddDefaultCharset off
    Order Allow,Deny
    Allow from $proxy_acls
</Proxy>" >>"$tmpoutfile"
            fi
        fi

        echo "" >>"$tmpoutfile"
        if [ -n "$htmlfile" ]; then
            echo "<li><a href=\"$url\">$url</a></li>" >>"$htmlfile"
        fi

        # Réinitialiser les préfixes pour chaque règle
        prefix=
    done

    local modified
    if testupdated "$tmpoutfile" "$outfile"; then
        cat "$tmpoutfile" >"$outfile"
        modified=1
    fi

    if [ -n "$htmlfile" ]; then
        echo '</ul>
</body>
</html>' >>"$htmlfile"
    fi

    [ -n "$tmpinfile" ] && ac_clean "$tmpinfile"
    ac_clean "$tmpoutfile"
    [ -n "$modified" ]
}
