296 lines
9.8 KiB
Bash
Executable File
296 lines
9.8 KiB
Bash
Executable File
#!/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
|