[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