RE: squid : script de configuration auto detect proxy

Top Page

Reply to this message
Author: Olivier_Allard-Jacquin
Date:  
To: guilde
Subject: RE: squid : script de configuration auto detect proxy

     Hello,


     je confirme et je précise ce qui a été dit à ce sujet, car j'ai
travaillé dessus il y a
quelques temps:


- La technique du "proxy autoconfig" décrite sur le site de Netscape
(http://home.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html) permet de:
+ changer les paramètres d'utilisation du proxy sans changer la configuration des
machines clientes: par exemple, changer le nom du proxy, ou definir de nouveaux
domaines de réseau locaux
+ faire de la répartition de charge (load balancing) comme indiqué par Marc, ou
avec des trucs encore plus sioux (http://naragw.sharp.co.jp/sps/)


- Le fichier de configuration ("config.pac"), peut être placé sur
n'importe quel serveur
HTTP. Un bon endroit est par exemple le serveur Intranet de l'entreprise.
Au lieu d'être
statique, ce fichier peut eventuellement être dynamique, mais franchement,
ca n'a pas
d'interêt (ou si peut ...).


- La seul contrainte pour que cela marche est de configurer le serveur web
afin qu'il
renvoit le bon type "MIME" en fonction de l'extension du fichier. Il existe
en effet 2
type de fichier "proxy autoconfig":
   + le "pac": Proxy AutoConfig  (issus de Netscape)
   + le "jsc": JavaScript Config  (plus utilisé sur les serveurs Microsoft
il me semble)
=> Les deux type d'extention sont destinés à contenir les mêmes données,
seul
l'extension est différentes.
Il suffit donc de rajouter les lignes suivantes au fichier qui associe les
extensions
au type MIME, dans la configuration du serveur web (config/mime.types pour
Apache):
application/x-javascript-config                   jsc
application/x-ns-proxy-autoconfig             pac



- Le fichier de configuration (appelons-le "config.pac") doit contenir au moins une
fonction (function FindProxyForURL(url, host)), qui doit retourner soit:
+ la chaîne "DIRECT" (return "DIRECT";) si le site recherché est à
l'interieur de l'Intranet
+ la chaîne "PROXY mon-beau-proxy:le-numero-du port"
(return "PROXY the-proxy:8080") si le site recherché est à l'exterieur l'Intranet



- La fonction en question reçoit automatiquement de la part du navigateur
+ le nom du site site qui doit être accédé ("host")
+ l'url demandé ("url")



- Pour détermer si le site en question est Intranet ou Internet , tu peux
utiliser les fonctions suivant qui sont très pratiques (voir la doc Netscape):
"isPlainHostName", "dnsDomainIs", "isInNet"



- Cependant, si dans ton réseau il y a des personnes qui utilisent IE, il va y avoir un
problème: les dites fonctions ne sont pas implémenté dans le Javascript de IE
(au moins pour les versions < 5.5) .... No comment ...
Pour résoudre le problème je les ai reimplémenté en "pur" Javascript:, avec
en rajoutant "My" au noms des fonctions ...

/*
Check if "InHost" contain "." or not
- Return "True" if the host is a plain host (no ".", like "home")
- Return "False" if the host is a not a plain host (there is one or more
".", like "home.my.enterprise.com")
*/
function MyIsPlainHostName(InHost) {

Expression = /[^.]*/;
Match = InHost.match(Expression);
return (Match[0] == InHost);
}


/*
Check if "InHost" is a computer of "MyDomain" domain
- Return "True" if the host is a computer of domain (like
"home.my.enterprise.com" is a computer of ".my.enterprise.com")
- Return "False" if the host is a not a computer of domain (like
"home.my.enterprise.com" is no a computer of ".google.com")
*/
function MyDnsDomainIs(InHost, MyDomain) {

Pos = InHost.indexOf(MyDomain);
return ( (Pos != -1) && ( (Pos + MyDomain.length) == InHost.length) );
}


/*
Check if "InHost" IP adresse is a computer of InPattern / InMask network
- Return "True" if the host is a computer of the network (like
"192.168.0.100" is a computer of "192.168.0.1" / "255.255.255.0")
- Return "False" if the host is a not a computer of the network (like
"192.168.0.100" is NOT a computer of "125.137.10." / "255.255.255.0")
*/
function MyIsInNet(InHost, InPattern, InMask) {

Expression = /(\d+)\.(\d+)\.(\d+)\.(\d+)/;

   RegExpResult = Expression.exec(InHost);
   Host = new Array(4);
   for (I = 0 ; I < 4 ; I ++) {
     Host[I] = RegExpResult[I + 1];
   }


   RegExpResult = Expression.exec(InPattern);
   Pattern = new Array(4);
   for (I = 0 ; I < 4 ; I ++) {
     Pattern[I] = RegExpResult[I + 1];
   }


   RegExpResult = Expression.exec(InMask);
   Mask = new Array(4);
   for (I = 0 ; I < 4 ; I ++) {
     Mask[I] = RegExpResult[I + 1];
   }


   Result = true;
   I = -1;
   while (Result && (I < 4)) {
     I ++;
     Result = ((Host[I] & Mask[I]) == (Pattern[I] & Mask[I]));
   }
   return Result;
 }




Oui, je me suis un peu laché sur les expressions régulières .... :=)

Bonne utilisation de tout ceci !


                                               Olivier


Oups, encore un mail un peu trop long ...