[gull] wireless [continue]

Daniel Cordey dc at mjt.ch
Tue Dec 20 17:21:59 CET 2005


Suite au dernier cours du GULL (merci Sébastien), deux ou trois personnes ont 
émis le désire que je leur communique un petit script destiné à facilité la 
vie des utilisateurs de wifi dans des lieux differents. Ce n'est qu'un petit 
bout de code desstiné à être utile autant que didactique. De plus, pour des 
raisons de debugging (engendré par des situations particulières) j'ai 
"éclaté" un peu le code. Ce n'est donc pas un code optimisé ! Il est écrit en 
shell dans le but de fonctionner même si vous n'avez pas installé Python ou 
Perl. Toute amélioration est la bienvenue :-)

L'objectif est le suivant : 

Je me déplace avec mon portable entre la maison et mon bureau. J'utilise deux 
connexions wifi avec une clé WEP dans les deux cas. Aussi, les balises wifi 
ne diffusent pas leur ESSID, je suis donc obligé de le spécifier car je ne 
peux pas le choisir parmis une liste de possibilités. C'est donc à l'aide de 
la MAC adresse de mes balises que je peux déterminer à quoi je dois me 
connecter. Il se peut aussi que je désire rajouter d'autres possibilités de 
connexions, mais il se paut aussi que les critères de sélection de ces 
nouveaux réseaux soient différents. J'ai donc choisi d'écrire un script 
chargé de "balayer" toutes les cellules disponibles du coin et d'effectuer le 
choix sur la base de critères définis dans le fichier /etc/network/interface, 
et passés à ce script.

Le principe consiste donc à associer un ou des critères de sélection à un nom 
correspondant à un interface (mapping). Dans les deux cas qui me concerne, je 
vais utiliser les MAC adresses des balises (Access Port - AP) pour déterminer 
le réseau auquel je peux me connecter. 

J'ai choisi une syntaxe arbitraire pour med définitions dans mon fichier 
'interface'. La voici :

mapping eth0
        script /usr/local/sbin/map_scheme
        map iface work
        map Address 00:01:E3:5A:80:BB
        map iface home
        map Address 00:01:E3:5A:80:00

Par là, je défini que je vais établir une correspondance avec eth0 et un nom 
d'interface utilisé dans la suite du fichier.

	mapping eth0

Ensuite, je dis que le script /usr/local/sbin/map_scheme doit être exécuté. 
Celui-ci aura comme argument 'eth0', et le lignes débutant par 'map' lui 
seront passées en 'stdin' (sans le mot 'map' !). En fait j'associe :

	iface work

Comme nom de l'interface (alias) a retourner si les criteres précédents le 
'iface' suivant sont rempli. En l'occurence, un seul critère est associé a 
chaque 'iface'. Il s'agit de l'adresse MAC de l'AP :

	Address ...

Il est tout a fait possible d'avoir d'autres critères comme le protocole, le 
ESSID (le plus courant), le mode (ad-hoc, etc.)... Le script accepte déjà ces 
citères ainsi que quelques autres. J'ai aussi prévu de pouvoir effectuer un 
choix parmi plusieurs AP dont appartenant à un même réseau, mais différenciés 
par la simple qualite du signal (Quality ou Signal-Leve). La structure est 
prête mais je ne traîte pas cette situation pour l'instant.

Dans l'exemple ci-dessus, j'ai donc une MAC adresse pour mon réseau à la 
maison, et une autre pour celui du bureau. Le script va donc rechercher 
parmis les cellules des environs et retournera le nom 'alias' qui correspond. 
Ensuite, la suite du fichier 'interface' défini les critères de connexion 
spécifiques à chaque réseau.

	iface work inet dhcp
	    ...

La recherche des cellules est effectuée dans le script et utilise :

	iwlist scanning

Les attributs de chaque cellule sont stockés dans des fichiers pour pouvoir 
être comparés avec les critères de sélection se trouvant sur les lignes 'map' 
du fichier 'interface' et passées au script. Je le répète, il y a es choses 
inutiles dans ce script car j'ai changé mon fusil d'épaule deux ou trois 
fois, et je ne mes suis pas donné la peine de changer le code à chaque fois.

En espérant que cela soit utile a certains. Comme je l'ai dit, j'ai écrit ceci 
de manière à expliquer comment le fichier 'interface' est utillisé, et aussi 
pour montrer comment écrire un shell script. Les commentaires sont les 
bienvenus. Ceux qui veulent récrire les regexp, le script, faire autrement, 
le faire en Perl... sont les bienvenus. Il est évident que le shell (bash) 
n'est pas très adapté pour traîter ce genre de manipulation. Idéalement, Il 
faudrait pouvoir indexer des tableaux à l'aide de chaînes de caractères; 
comme cela est possible en Python, Perl et Tcl. Mais le shell est le shell et 
j'ai fait avec en essayant de rester très 'basic'.

Que ceci ne vous empêche pas de lire la documentation de interface(5), 
ifup(8), iwconfig(8), iwlist(8), bash, regexp... :-)

Ah, je précise que cette configuration est avant tout adaptée a des distribs 
debian-like. Les fichiers sont a des endroits différents et les procédure 
presque pareils avec SuSE (si jamais contactez-moi).

dc

PS : Depuis l'ecriture du texte ci-dessus, il s'est ecoule 15 jours. J'avais 
besoin de tester de maniere plus intensive ce que j'avais fait. Cela m'a 
permit de mettre a jour le probleme evoque dans la liste au sujet de 'iwlist' 
qui ne prend pas tous les AP a chaque execution. Le script a donc ete modifie 
dans le but d'effectuer un 'scan' par seconde pendant 5 secondes afin 
d'assurer une meilleure detection des AP actifs. Ce qui fait que la structure 
de ce script peut paraitre encor eplus bizarre qu'avant :-) Mais, bref, cela 
fonctionne tres bien entre deux locations...
-------------- next part --------------
A non-text attachment was scrubbed...
Name: map_scheme
Type: application/x-shellscript
Size: 2873 bytes
Desc: not available
URL: <http://forum.linux-gull.ch/pipermail/gull/attachments/20051220/bdc761a8/attachment.bin>


More information about the gull mailing list