Comme je bouge souvent avec mon laptop, je dois me connecter à bcp de réseaux wifi. J'ai jamais réussi à me connecter avec les inits scripts, et je voulais apprendre bash, alors j'ai fait un petit script de connexion wifi qui connait plusieurs points d'accès etc. Comme tous les pts d'accès dont j'ai besoins (et comme la majorité d'entre eux) c'est une configuration DHCP. Si qqn à besoin d'une connexion à IP fixe, on peut toujours rajouter une fonction et une variable..
Ce script à besoins des programmes suivants :
- wirelesstools
- dhcpcd (parce que j'ai jamais pu sentir dhclient, mais c'est facilement modifiable)
Voilà le script :
#!/sbin/runscript
#
# /etc/init.d/net.wifi
#*************************************************************************
# This program is free software; you can redistribute it and/or *
# modify it under the terms of the GNU General Public License *
# as published by the Free Software Foundation; either version 2 *
# of the License, or (at your option) any later version. *
# *
# This program is distributed in the hope that it will be useful, *
# but WITHOUT ANY WARRANTY; without even the implied warranty of *
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
# GNU General Public License for more details. *
# *
# You should have received a copy of the GNU General Public License *
# along with this program; if not, write to the Free Software *
# Foundation, Inc., 51 Franklin Street, Fifth Floor, *
# Boston, MA 02110-1301, USA. *
#*************************************************************************
wifi_scan() {
ebegin "begining the scan"
# recherche d'un ssid connu :
echo -n " "
for conf_files in /etc/conf.d/wifi.* ; do
echo -n "." && sleep 0.1
source $conf_files
scan_die="` iwlist $interface scan | grep ${ESSID} | tail -n1 | cut -d'"' -f 2`"
if [ "${scan_die}" = "${ESSID}" ]; then
break
else
unset ESSID KEY
fi
done
echo
if [ -z "${ESSID}" ]; then
einfo "No ESSID found or no config file!"
eend 0
else
einfo "found the followed essid : ${ESSID}"
eend 0
fi
}
dhcp_request() {
ebegin "DHCP request"
if [ -f "/var/run/dhcpcd-$interface.pid" ]; then
rm -f /var/run/dhcpcd-$interface.pid
fi
dhcpcd $interface -h "$computer_name" -t $time_limit
ip_dhcp=$(ifconfig $interface | grep "inet addr:" | cut -d ":" -f 2 | cut -d " " -f 1)
if [ "$ip_dhcp" != "" ]; then
echo " IP adress: $ip_dhcp"
fi
eend 0
}
wifi_configure(){
einfo "iwconfig"
# definition d'un essid quelconque, certaines carte "marchent" mieux comme ca ...
iwconfig $interface essid "foobar" && sleep 0.1
if [ -z ${KEY} ]; then
iwconfig $interface essid ${ESSID}
else
iwconfig $interface essid ${ESSID} key ${KEY}
fi
# on attend 3 secondes, le temps que la carte s'associe.
echo -n " "
for i in 1 2 3 4 5 6 ; do
echo -n "." && sleep 0.5
done
echo
eend 0
}
fill_unset_var() {
interface="wlan0"
computer_name=$(hostname)
time_limit=60
}
stop() {
ebegin "stop wifi"
fill_unset_var
[ -f /etc/conf.d/net.wifi.conf ] && source /etc/conf.d/net.wifi.conf
ifconfig $interface down &>/dev/null
if [ -f "/var/run/dhcpcd-$interface.pid" ]
then
rm -f /var/run/dhcpcd-$interface.pid
fi
[ -z "$modules_rmmod" ] || modprobe -r $modules_rmmod
einfo "done !"
eend 0
sleep 1
}
start() {
ebegin "starting wifi"
fill_unset_var
[ -f /etc/conf.d/net.wifi.conf ] && source /etc/conf.d/net.wifi.conf
[ -z "$modules_modprobe" ] || modprobe $modules_modprobe && sleep 2
wifi_scan
if [ -z "${ESSID}" ]; then
einfo "exiting"
svc_stop
else
wifi_configure
dhcp_request
if [ "$ip_dhcp" = "" ]; then
einfo "No IP adress ! :("
else
einfo "you're connected, Enjoy!"
fi
fi
eend 0
sleep 1
}
restart() {
svc_stop
svc_start
}
Il faut ensuite un fichier de configuration, qui est
/etc/conf.d/net.wifi.conf (je vous donne le mien comme exemple :
# interface : l'interface wifi, par défaut (si pas configuré dans ce fichier) : wlan0
interface="eth1"
# le nom du PC envoyé lors de la requête DHCP. par défaut : le nom de votre machine
computer_name="ka_at_gentoo"
# le temps limite pour la requête DHCP. par défaut : 60 sec
time_limit="20"
# les modules sont facultatifs. Si les variables ne sont pas déclarée alors le script ne se chargera pas de charger/décharger des modules.
modules_modprobe="ipw2200"
modules_rmmod="ipw2200 ieee80211_crypt_wep"
Et finalement un fichier par ESSID qu'il faut appeler
/etc/conf.d/wifi.CE_QUE_VOUS_VOULEZ. Le nom définira l'ordre de préférence. par exemple
/etc/conf.d/wifi.__1__maison sera préféré par le script (si les 2 sont disponibles) à
wifi.__2__ecole car il sera le premier étudié. voilà par exemple chez moi :
# le nom du SSID
ESSID="ka_linksys"
# la clé WEP si c'est une phrase clé
#KEY="s:MA_PHRASE"
# la clé WEP en 64b
KEY="18fa4b6a83"
# si pas de clé wep, ne pas définir $KEY ou le laisser vide :
#KEY=""
Comme on dit :
Hope this can help !
n'hésitez pas pour les question / corrections 😉