9112 (9112) wrote in ru_shell,
9112
9112
ru_shell

обработчик кнопки вкл/выкл wifi

столкнулся с задачей подвязать на имеющемся asus eeepc s101h кнопку включения выключения wifi. в первую очередь была цель эргономики - приходя домой с работы и из дома на работу, каждый раз не рестартить wlan0 дабы изменить точку доступа. найденные примеры в интернете мне не особо понравились а некоторые попросту отказывались рабоать, и поэтому вчера вечером решил все-таки сам написать простенький скрипт. он вызывается acpid при появлении события на указанного в default.sh. скрипт полностью логирует все действия. для своей работы использует дополнительный файл, местом хранения которого было выбрано /var/run/
скрипт полностью комментирован, по сему под себя переделать будет элементарно. так же желающие смог легко выкинуть ненужные логи.

#!/bin/sh
#скрипт выполняет действия по нажатию кнопки вкл/выкл wifi адаптера, а так же ведет логи в /var/log/wifi.log.
#скрипт использует файл /var/run/wifi.pid
/etc/acpi/default.sh нужно указать, что по событию выполняем /etc/init.d/wifi toggle. тоесть данный скрипт, который в /etc/init.d/ и положите, назвав его wifi.
wifi_on() {
/etc/init.d/net.wlan0 start
}
wifi_off() {
/etc/init.d/net.wlan0 stop
}
case $1 in
start)
wifi_on
;;
stop)
wifi_off
;;
toggle)
sleep 2;
echo `date +%d/%m/%Y" "%H:%M:%S`" status pid: "`cat /var/run/wifi.pid`";">> /var/log/wifi.log;
STAT=`cat /var/run/wifi.pid`
#проверяем статус wifi
if [ "$STAT" = "1" ];
#если wifi включен. выключаем его. все сопровождаем логами.
then
{
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi switching_off (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
wifi_off;
echo "0" > /var/run/wifi.pid
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi is off (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
}
#если выключен. проверяем состояние адаптера. если он выключен(состояние не равно 1), говорим что делать так не хорошо. изменений не производим.
else
{
sleep 3;
if [ `cat /sys/class/rfkill/rfkill0/state` != "1" ];
then
{
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi hardware is down - wifi is not swinching_on (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi is off (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
}
коли адаптер включен, включаем wifi в системе.
else
{
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi switching_on (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
wifi_on;
echo "1" > /var/run/wifi.pid
sleep 3;
#проверяем, если при включении wifi в системе, произошел сбой - ругаемся об этом в лог, и пишем в pid что все-таки wifi is off =) если без сбоев - говорим, что все хорошо.
if [ `cat /sys/class/rfkill/rfkill0/state` != "1" ];
then
{
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi switching_on ERROR! please look other logs! (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
echo "0" > /var/run/wifi.pid;
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi is off (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
}
else
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi is on (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
fi
}
fi
}
fi
;;
esac
#сразу оговорюсь - в скрипте допущена возможность такой ситуации, что вы включили адаптер, wifi, но точку он не нашел, и через некоторое время статус адаптера вывалится в "0", или если адаптер включен, а wifi оказался выключен, и скрипт при последующем запуске будет думать что у нас все плохо, адаптер выключен, а мы нагло пытаемся включить wifi(ибо статус у адаптера будет значится "0"). все не так :) поскольку сей скрипт завязан на кнопку вкл/выкл адаптера, статусы вместе с этим будут меняться на нужные нам, и вышеописанной ситуации у вас не возникнет :) ну или по крайней мере не должно возникнуть :D


с радостью приму интересные мысли для поправки/доработки сего мелкого но полезного изделия =)
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

  • 5 comments
На открытии крышки переподключаться к точке.
а вообще идеально вам было бы закоммитить этот скрипт в eeepc-acpi-scripts
какой смысл в крышке? то есть вы предлагаете сначала запустить компьютер(допустим у меня он обычно находится в suspend), после закрыть/открыть крышку для подключения к точке? как-то не логично :) плюс если у человека на закрытие крышки стоит shutdown/hibernate/suspend?
У меня Hibernate
Закрываю крышку, открываю инет через wi-fi перестаёт работать. Приходится ifdown ifup делать. Вот такой и смысл.
понятно. я использую suspend. поэтому такой проблемы не возникает. а у вас просыпается компьютер от какого события?
по открытию крышки