Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Toshiba Satellite - Wi-Fi kill switch, или как переключать сетевые профили.  (Прочитано 4425 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн MadKox

  • Автор темы
  • Активист
  • *
  • Сообщений: 441
  • =)
    • Просмотр профиля
    • Моя страница на Launchpad
В общем, я являюсь счастливым обладателем ноута Toshiba Satellite M100 - 233, в котором включение/выключение Wi-Fi адаптера осуществляется "железной" кнопкой - переключателем. В то же время ноут я использую как на работе, так и дома. На работе ноут  цепляется к проводной сети, со статическим IP и шлюзом 192.168.0.3. Дома же, у меня стоит Wi-Fi роутер, который раздает инет по DHCP и имеет адрес 192.168.0.1. При этом, когда я приношу ноут домой, Nework Manager далеко не с первой попытки цепляет Wi-Fi. Таким образом, возникла у меня идея во-первых отрубить Network Manager, а во-вторых осуществить переключение сетевых профилей дом/работа по состоянию переключателя Wi-Fi. Т.е. когда Wi-Fi включен - компьютер должен игнорировать проводной интерфейс и соединяться с беспроводным, а когда Wi-Fi выключен - наоборот.

Проверка состояния переключателя осуществляется так:
cat /sys/bus/pci/drivers/ipw3945/*/rf_kill
Где ipw3945 - Intel Pro Wireles 3945 - модель моего wi-fi адаптера.
Приведенная команда может выдать 4 результата:
0 = RF kill not enabled (radio on)  - т.е. выключатель адаптера не включен, т.е. wi-fi включен.
1 = SW based RF kill active (radio off)   - т.е. адаптер выключен програмно, wi-fi выключен.
2 = HW based RF kill active (radio off)   - т.е. адаптер выключен на уровне железа, wi-fi выключен. (как раз мой случай).
3 = Both HW and SW RF kill active (radio off)   - т.е. адаптер выключен и програмно и железно, wi-fi выключен.
Инфу о переключателе нашел тут.
Соответственно, можно создать скрипт, который проверял-бы при загрузке состояние переключателя и в зависимости от его положения грузил-бы тот или иной конфиг.
Что я собственно и сделал:
1. Выключил NM. (tnx 2 Malamut  :) )
2. Написал скритик netinit:
#! /bin/sh
#

# Если включен Wi-Fi...
wifi_enable()
{
 # Путь до файла interfaces
 IFACES="/etc/network/interfaces"
 # Путь до файла resolv.conf
 RESOLV="/etc/resolv.conf"
 # Путь до файла conky.rc
 CONKY="/home/madkox/.conkyrc"
 CONKYS_GOOD="/home/madkox/.conkys/wifi_good"
 CONKYS_BAD="/home/madkox/.conkys/wifi_bad"
 # Роутер
 ROUTA="192.168.0.1"
 # Интерфейс
 INT="eth1"
 # Имя точки доступа
 SSID="MYSSID"
 # Пароль
 PASS="superstrongwifissidwpa2passwordyoucouldneverguess"

 # Настраиваем интерфейс.
 echo "auto lo" > $IFACES
 echo "iface lo inet loopback" >> $IFACES
 echo  >> $IFACES
 echo  >> $IFACES
 echo "iface "$INT" inet dhcp" >> $IFACES
 echo "gateway "$ROUTA >> $IFACES
 echo "wpa-ap-scan 1" >> $IFACES
 echo "wpa-pairwise CCMP" >> $IFACES
 echo "wpa-group CCMP" >> $IFACES
 echo "wpa-psk "$PASS >> $IFACES
 echo "wpa-driver wext" >> $IFACES
 echo "wpa-key-mgmt WPA-PSK" >> $IFACES
 echo "wpa-proto WPA2" >> $IFACES
 echo "wpa-ssid "$SSID >> $IFACES
 echo "auto "$INT >> $IFACES
 # Настраиваем DNS.
 echo "nameserver "$ROUTA > $RESOLV
 # Поднимаем сеть.
 /etc/init.d/networking stop
 sleep 10
 /etc/init.d/networking start
 # Убиваем Ethernet
 ifconfig eth0 down
 # Настраиваем маршруты
 route del default
 route add default gw $ROUTA
 # Проверяем, запустилась ли.
 ping $ROUTA -c 1
  if [ $? = 0 ]
   then
    PINGOK="0"
   else
    PINGOK="1"
  fi
 # Настраиваем conky.
 if [ $PINGOK = 0 ]
  then
   cp $CONKYS_GOOD $CONKY
  else
   cp $CONKYS_BAD $CONKY
 fi
}

# Если выключен Wi-Fi...
ethernet_enable()
{
 # Путь до файла interfaces
 IFACES="/etc/network/interfaces"
 # Путь до файла resolv.conf
 RESOLV="/etc/resolv.conf"
 # Путь до файла conkyrc
 CONKY="/home/madkox/.conkyrc"
 CONKYS_GOOD="/home/madkox/.conkys/eth_good"
 CONKYS_BAD="/home/madkox/.conkys/eth_bad"
 # Роутер
 ROUTA="192.168.0.3"
 # Интерфейс
 INT="eth0"
 # IP адрес.
 IP="192.168.0.5"
 # Маска подсети.
 SM="255.255.255.0"

 # Настраиваем интерфейс.
 echo "auto lo" > $IFACES
 echo "iface lo inet loopback" >> $IFACES
 echo  >> $IFACES
 echo  >> $IFACES
 echo "iface "$INT" inet static" >> $IFACES
 echo "address "$IP >> $IFACES
 echo "netmask "$SM >> $IFACES
 echo "gateway "$ROUTA >> $IFACES
 echo "auto "$INT >> $IFACES
 # Настраиваем DNS.
 echo "nameserver "$ROUTA > $RESOLV
 # Поднимаем сеть.
 /etc/init.d/networking stop
  sleep 10
 /etc/init.d/networking start
 # Убиваем Wi-Fi
 ifconfig eth1 down
 # Настраиваем маршруты
 route del default
 route add default gw $ROUTA
 # Проверяем, запустилась ли.
 ping $ROUTA -c 1
  if [ $? = 0 ]
   then
    PINGOK="0"
   else
    PINGOK="1"
  fi
 # Настраиваем conky.
 if [ $PINGOK = 0 ]
  then
   cp $CONKYS_GOOD $CONKY
  else
   cp $CONKYS_BAD $CONKY
 fi
}

# Проверка Wi-Fi переключателя.
SWITCH=`cat /sys/bus/pci/drivers/ipw3945/*/rf_kill`

if [ $SWITCH = 0 ]
 then
  wifi_enable
 else
  ethernet_enable
 fi
exit 0
(Wi-Fi настраивал по этому мануалу.)
3. Переписал скрипт в /etc/init.d
sudo cp /home/madkox/netinit /etc/init.d/netinit
4. Сделал его исполняемым
sudo chmod +x /etc/init.d/netinit
5. "Повесил" его запускаться последним
sudo update-rc.d netinit defaults 99
6. Создал 4 разных конфига для conky и сложил в ~/.conkys/
Конфиги сделал так:
Один конфиг загружается, если wifi нормально поднялась, показывает статусы сети, погоду.
Второй конфиг загружается, если wifi переключателем включена, но не работает. Он показывает что включен режим wifi, но подключения в SSID нет.
Третий конфиг грузится, если wifi выключен, а проводная сеть нормально поднялась - он также  показывает статусы сети и погоду.
Четвертый конфиг грузится, если wifi выключен, проводная сеть не поднялась. Он, как и во втором случае говорит, что wifi выключен, а сети нет.
7. Потестил настройки поочередно перезагружаясь в разных режимах.

Собственно все  :)

Осталось только добавить, что подобные переключатели есть у многих ноутов различных производителей. Легко проверить отражает ли rf_kill работу переключателя или нет так:
1. Перейти в консоль - CTRL+ALT+F1
2. Набрать свои логин/пароль.
3. Подергать переключатель туда-сюда, должно появиться что-то типа
ipw3945 Radio Frequency Kill Switch is On:

ЗЫ система Ubuntu 7.10, но по идее (см. ссылки) должно работать и в 8.04.


UPD: Вот, как это выглядит - режим работы с проводной сетью (типа на работе).
« Последнее редактирование: 15 Августа 2008, 18:37:33 от MadKox »
Homo homini admini est...

 

Страница сгенерирована за 0.031 секунд. Запросов: 25.