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
 |