#!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 source "$(dirname "$0")/lib/ulib/ulib" || exit 1 urequire DEFAULTS function display_help() { uecho "$scriptname: Créer un fichier de redirections pour Apache à partir d'un certain nombre de règles USAGE $scriptname -f rewrite.rules [-o RewriteRules.conf] [-w RewriteRules.html] host OPTIONS -p Générer les directives <Proxy...> et tenir compte de proxy_acls Par défaut, le champ proxy_acls est ignoré FORMAT des règles de mapping"' ============================ Les commentaires commencent par le signe "#" Les règles sont de la forme: src:dest:host:suffix:OPTS:prot:proxy_acls ^prefix =literal prot vaut par défaut http. Il peut valoir aussi https Si dest ou suffix se terminent par $, on est en mode NO_SLASH En mode NO_SLASH, si src se termine par $, on est en mode NO_TRAIL * Si dest est de la forme Application.woa En mode NO_SLASH, on génère RewriteRule ^/src(.*) [prot://host]/cgi-bin/WebObjects/dest[/suffix]$1 [L,OPTS] En mode NO_SLASH+NO_TRAIL, on génère RewriteRule ^/src [prot://host]/cgi-bin/WebObjects/dest[/suffix] [L,OPTS] En mode normal, on génère RewriteRule ^/src$ /src/ RewriteRule ^/src/(.*) [prot://host]/cgi-bin/WebObjects/dest[/suffix]/$1 [L,OPTS] * Si dest n'\''est pas de la forme Application.woa En mode NO_SLASH, on génère RewriteRule ^/src(.*) [prot://host]/dest[/suffix]$1 [L,OPTS] En mode NO_SLASH+NO_TRAIL, on génère RewriteRule ^/src [prot://host]/dest[/suffix] [L,OPTS] En mode normal, on génère RewriteRule ^/src$ /src/ RewriteRule ^/src/(.*) /dest[/suffix]/$1 [L,OPTS] Si une règle est précédée d'\''une ou plusieurs lignes de la forme "^prefix", ces lignes sont copiées avant chacune des commandes RewriteRule générées pour une règle. Ceci permet d'\''ajouter des conditions avec RewriteCond pour une règle. e.g. ^RewriteCond %{REMOTE_ADDR} 10\..* src:dest.woa qui génère: RewriteCond %{REMOTE_ADDR} 10\..* RewriteRule ^/src$ /src/ RewriteCond %{REMOTE_ADDR} 10\..* RewriteRule ^/src/(.*) /cgi-bin/WebObjects/dest.woa/$1 [L] Une ligne de la forme "=literal" est recopiée sans modifications (sans le "=") dans le fichier de sortie. proxy_acls est utilisé si l'\''option -p est spécifiée et OPTS contient P (comme proxy), ou si le mode de réécriture requière l'\''utilisation d'\''un proxy. * Avec la valeur "None", aucune directive <Proxy> n'\''est générée * Si aucune valeur n'\''est spécifiée, la directive suivante est générée: <Proxy $URL> AddDefaultCharset off Order Deny,Allow Allow from all </Proxy> * Si une valeur est spécifiée, la directive suivante est générée: <Proxy $URL> AddDefaultCharset off Order Allow,Deny Allow from $proxy_acls </Proxy> Dans les exemples donnés ci-dessus, $URL est l'\''url générée par la réécriture, et $proxy_acls la valeur du champ proxy_acls spécifiée ci-dessus.' } function 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" } proxy_enabled= infile= outfile="RewriteRules.conf" htmlfile= host= parse_opts "${PRETTYOPTS[@]}" \ --help '$exit_with display_help' \ -p proxy_enabled \ -f: infile= \ -o: outfile= \ -w: htmlfile= \ @ args -- "$@" && set -- "${args[@]}" || die "$args" [ -n "$infile" ] || die "Il faut spécifier le fichier de règles" [ -f "$infile" ] || die "Fichier de règles non trouvé: $(ppath "$infile")" thishost="$1" [ -n "$thishost" ] || die "Il faut spécifier l'hôte pour lequel créer le fichier de configuration" function has_proxy() { # vérifier que les options $1 contiennent 'P' local options array_split options "$1" "," array_contains options P } 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 >"$outfile" 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#=}" >>"$outfile" continue fi IFS=:; set -- $rule; unset IFS index=1 done= while [ -z "$done" ]; do current="$1"; shift while endswith "$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 " if [ "$thishost" == "$host" ]; then host= fi 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:+(.*)} $(joinurl "$prot://$host/cgi-bin/WebObjects" "$dest" "$suffix")${trail:+\$1} [L${options:+,$options}]" >>"$outfile" setx url joinurl "http://$thishost" "$usrc" setx proxy_url joinurl "$prot://$host/cgi-bin/WebObjects" "$dest" "$suffix" else echo "${prefix}RewriteRule ^/$src\$ /$src/" >>"$outfile" echo "${prefix}RewriteRule ^/$src/(.*) $(joinurl "$prot://$host/cgi-bin/WebObjects" "$dest" "$suffix" "\$1") [L${options:+,$options}]" >>"$outfile" setx url joinurl "http://$thishost" "$usrc/" setx proxy_url 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:+(.*)} $(joinurl /cgi-bin/WebObjects "$dest" "$suffix")${trail:+\$1} [L,P${options:+,$options}]" >>"$outfile" setx url joinurl "http://$thishost" "$usrc" setx proxy_url joinurl "$prot://$thishost/cgi-bin/WebObjects" "$dest" "$suffix" proxy_use=1 else echo "${prefix}RewriteRule ^/$src\$ /$src/" >>"$outfile" echo "${prefix}RewriteRule ^/$src/(.*) $(joinurl /cgi-bin/WebObjects "$dest" "$suffix" "\$1") [L,P${options:+,$options}]" >>"$outfile" setx url joinurl "http://$thishost" "$usrc/" setx proxy_url 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:+(.*)} $(joinurl "$prot://$host" "$dest" "$suffix")${trail:+\$1} [L${options:+,$options}]" >>"$outfile" setx url joinurl "http://$thishost" "$usrc" setx proxy_url joinurl "$prot://$host" "$dest" "$suffix" else echo "${prefix}RewriteRule ^/$src\$ /$src/" >>"$outfile" echo "${prefix}RewriteRule ^/$src/(.*) $(joinurl "$prot://$host" "$dest" "$suffix" "\$1") [L${options:+,$options}]" >>"$outfile" setx url joinurl "http://$thishost" "$usrc/" setx proxy_url joinurl "$prot://$host" "$dest" "$suffix/" fi else # sur le même hôte if [ -n "$noslash" ]; then echo "${prefix}RewriteRule ^/$src${trail:+(.*)} $(joinurl / "$dest" "$suffix")${trail:+\$1}${options:+ [$options]}" >>"$outfile" setx url joinurl "http://$thishost" "$usrc" setx proxy_url joinurl "http://$thishost" "$dest" "$suffix" else echo "${prefix}RewriteRule ^/$src\$ /$src/" >>"$outfile" echo "${prefix}RewriteRule ^/$src/(.*) $(joinurl / "$dest" "$suffix" "\$1")${options:+ [$options]}" >>"$outfile" setx url joinurl "http://$thishost" "$usrc/" setx proxy_url joinurl "http://$thishost" "$dest" "$suffix/" fi fi fi 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>" >>"$outfile" else echo "\ <Proxy $proxy_url*> AddDefaultCharset off Order Allow,Deny Allow from $proxy_acls </Proxy>" >>"$outfile" fi fi echo "" >>"$outfile" 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 if [ -n "$htmlfile" ]; then echo '</ul> </body> </html>' >>"$htmlfile" fi