Я звик носити з собою власний ноутбук, постійно переключаючись між двома різними точками доступу до мережі інтернет: вдома та на роботі. З тиждень я мирився з тим, що необхідно щоразу перенастроювати параметри бездротового підключення. Використання сторонніх засобів для збереження та перенастроювання Wi-Fi підключення мене особливо не радувало, до того ж, моєю метою було ще й максимально зручне управління мережевими підключеннями як в графіці, так і в терміналі. Пам’ять нагадала мені, що подібна ситуація вже передбачена в файлі мережевих налаштувань /etc/network/interfaces. Документація вказувала на можливість передати право вибору налаштувань зовнішній програмі за допомогою директиви mapping. Таким чином, лишилось тільки написати скрипт, що вибере за мене доступну на даний момент бездротову мережу. При цьому сам файл interfaces набуде наступного вигляду:
auto wlan0
mapping wlan0
script /usr/local/sbin/wlan-detect.sh
map OfficeAP wlan0-office
map HomeAP wlan0-home
iface wlan0-home inet dhcp
wpa-ssid HomeAP
wpa-bssid 01:23:45:67:89:AB
wpa-psk HomePassphrase
wpa-key-mgmt WPA-PSK
wpa-pairwise TKIP CCMP
wpa-group TKIP CCMP
wpa-proto WPA RSN
iface wlan0-office inet dhcp
wpa-ssid OfficeAP
wpa-bssid CD:EF:01:23:45:67
wpa-psk OfficePassphrase
wpa-key-mgmt WPA-PSK
wpa-pairwise TKIP CCMP
wpa-group TKIP CCMP
wpa-proto WPA RSN
Як видно з файлу, для налаштування реального інтерфейсу wlan0 буде використаний один з “віртуальних” інтерфейсів wlan0-office чи wlan0-home. Директива mapping визначає зовнішню програму, яка повинна вирішити задачу про вибір мережевих налаштувань. Для цього їй буде передана назва інтерфейсу що буде використаний, а також пари “параметр-інтерфейс” (а їх може бути як завгодно багато) з директив map в порядку появи їх у файлі interfaces. В результаті програма має видати ім’я віртуального інтерфейсу, за яким і буде налаштовано реальний. Сам вибір логічно прив’язати до SSID точки доступу, що й було реалізовано. А ось і сам скрипт, який виконує цей вибір:
#!/bin/sh
IFACE="$1"
CTRL_SOCKET="/var/run/wpa_supplicant"
# We cannot perform AP scanning until interface is down. Bring up wlan interface
# with wpa_supplicant and wait a little.
wpa_supplicant -i $IFACE -C $CTRL_SOCKET &
PID=$!
sleep 5
SCAN_RESULT=`mktemp`
iwlist $IFACE scan > $SCAN_RESULT
# Simple check of scanning results. Script stops searching when first AP is
# found.
while read SSID IFACE_ALIAS ; do
if ( grep "ESSID:\"$SSID\"" $SCAN_RESULT > /dev/null ) ; then
echo $IFACE_ALIAS
break
fi
done
# Some cleanup before exit.
kill $PID
rm $SCAN_RESULT
exit 0
Цю ж статтю російською мовою в дещо скороченому вигляді можна прочитати на дружньому Wiki-проекті linuxoid.hostopia.com