8 октября 2007 г.

Скрипт для инициализации Wi-Fi

Не понравилось мне как реализована система инициализации Wi-Fi в Slackware. Поэтому написал свой собственный скрипт. Он расчитан только на один тип Wi-Fi контроллера. Если вы используете другой контроллер, перепишите функции загрузки и выгрузки модуля.

Основной скрипт wireless.sh:
#! /bin/bash

#(c) 2007 Artur Kryukov
# License GNU GPL v2.

# Директория в которой должны находится файлы *.net
# с описанием Wi-Fi сетей.
CONF_DIR=/usr/local/etc/wireless.sh
PATH=/bin:/sbin:/usr/sbin

# !!!!!! ВНИМАНИЕ !!!!!
# Эта функция поддерживает загрузку ТОЛЬКО модуля ipw3945
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
load_module()
{
remove_module
modprobe ipw3945
sleep 1
/sbin/ipw3945d --quiet
}

remove_module()
{
echo remove
if [ -f /var/run/ipw3945d.pid ] ; then
/sbin/ipw3945d --kill
fi
if lsmod | grep ipw3945 > /dev/null 2>&1; then
modprobe -r ipw3945
fi
}

usage()
{
echo "Usage: wireless.sh start - start Wi-Fi network"
echo " wireless.sh stop - stop Wi-Fi network"
echo " wireless.sh --help - this screen"
echo "----"
echo "Current config directory:"
echo "$CONF_DIR"
echo "Current config files:"
echo "$(ls ${CONF_DIR}*.net)"
}

start()
{
load_module
sleep 4
for I in $CONF_DIR/*.net
do
. $I
# Проверка на наличие такой сети
if iwlist scan 2> /dev/null | grep $SSID > /dev/null 2>&1
then
# Если сеть есть, настраиваем ее
# Проверяем метод аутентификации
case $MET in
share)
set_share $IF $SSID $KEY $KEYN $DHCP
;;
WPA)
set_wpa $IF $SSID $CONF_WPA_FILE $DHCP
;;
esac
fi
done
}

stop()
{
remove_module
}

# Настройка сети с прешареными ключами
# $1 - сетевой интерфейс
# $2 - SSID
# $3 - KEY
# $4 - номер ключа
# $5 - DHCP
set_share()
{
iwconfig $1 essid $2 key $3 [$4] key open key [$4]
if [ $5 = "yes" ]; then
# Пытаемся получить IP по DHCP
if route -n | grep ^0.0.0.0 ; then
route del default
fi
sleep 2
dhcpcd $1
fi
}

# Настройка сети с поддержкой WPA
# $1 - сетевой интерфейс
# $2 - SSID
# $3 - CONF_WPA_FILE
# $4 - DHCP
set_wpa()
{
# Проверим наличие конфигурационного файла
if [ ! -f $3 ]; then
echo "Cant't finde config file this WPA attributes!!!"
echo "File $3 not found"
exit 21
fi
iwconfig $1 essid $2
wpa_supplicant -i$1 -c$3 -Dwext -B
if [ $4 = "yes" ]; then
if route -n | grep ^0.0.0.0 ; then
route del default
fi
# Пытаемся получить IP по DHCP
sleep 10
dhcpcd $1
fi
}

case $1 in
start) start ;;
stop) stop ;;
--help) usage ;;
*) usage ;;
esac
Для работы скрипта требуется определить директорию, в которой будут находиться конфигурационные файлы, описывающие Wi-Fi сети. Для определения такой директории используется параметр
CONF_DIR=/usr/local/etc/wireless.sh
В нашем случае необходимо создать директорию /usr/local/etc/wireless.sh, в которой будут размещаться конфигурационные файлы с расширением *.net и *.wpa

Пример конфигурации open Wi-Fi.

Создаём файл /usr/local/etc/wireless.sh/My.net, следующего содержания:
SSID=Ngrade
MET=share
KEY=1a2d-4cd7-8901-a2aa-5abc-aa1a-23
KEYN=3
IF=eth1
DHCP=yes # or no
При помощи переменных указываем параметры:
  • MET - share или wpa
  • KEY - ключ шифрования (о формате записи ключей смотрите man iwconfig)
  • KEYN - номер используемого ключа
  • IF - имя интерфейса
  • DHCP - yes - получить атрибуты интерфейса по DHCP, no - не получать по DHCP. В последнем случае придётся в командной строке самостоятельно задавать параметры интерфейса.
Пример конфигурации WPA соединения.

В этом случае необходимо создать два файла: *.net и *.wpa
Net файл (Ngrade_wpa.net):
SSID=Ngrade_WPA
MET=WPA
IF=eth1
CONF_WPA_FILE=/root/bin/Ngrade_wpa.wpa
DHCP=yes # or no
Параметр CONF_WPA_FILE определяет путь к файлу, описывающему параметры WPA соединения. Я не стал выдумывать свой формат для этого файла, я взял стандартный формат файла программы wpa_supplicant.

Файл Ngrade_wpa.wpa:
ctrl_interface=/var/run/wpa_supplicant
# By default, only root (group 0) may use wpa_cli
ctrl_interface_group=0
eapol_version=1
ap_scan=1
fast_reauth=1

# WPA protected network, supply your own ESSID and WPAPSK here:
network={
scan_ssid=0
ssid="Ngrade_WPA"
proto=WPA
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP TKIP WEP104 WEP40
psk="TheSecretPassword"
}
Работать со скриптом просто:
  • wireless.sh start - запускает сеть, Причём скрипт самостоятельно ищет одну из описанных сетей, и подключает её.
  • wireless.sh stop - выгружает модуль.
По поводу stop, тут я еще не до конца разобрался что к чему, поэтому просто выгружаю модуль. Хотя, наверное надо сначала гасить интерфейс. Вообщем я еще поколдую над этим вопросом.

2 комментария: