Автоматическая перезагрузка модема DLink DSL-2540U

Заметил такую проблему у своего ADSL модема DLink DSL-2540U: периодически теряется подключение к интернет, хотя сам модем остается работать. Подключение восстанавливается только после перезагрузки. Обновление прошивки и различные настройки не помогли. С кастомными прошивками решил не экспериментировать, а решить эту проблем дургим способом.
Так как у меня уже имелась Raspberry Pi, работающая в режиме 24/7, я решил использовать ее для решения проблемы. Идея заключалась в том, чтоб Raspberry с определеным интервалом времени пыталась подключиться к сети интернет, и, если у нее это не выходило, перезагружала бы модем. На модеме в заводской прошивке работает telnet сервер с ограниченным набором команд, среди которых есть и reboot.
Итак, скрипт, который пингует DNS Гугла, и, в случае отсутствия ответа, запускает скрипт перезапуска модема, написан на Bash: 
#!/bin/bash
ping -W 5 -c 1 8.8.8.8
if [[ $? -eq 0 ]]; then
    echo "Online";
else
    echo "Offline";
    /usr/bin/expect /абсолютный_путь_к_скрипту/скрипт_перезагрузки.exp;
fi
Тут все просто: запускается команда ping c таймаутом 5 секунд, и одним пакетом. В случае, если выполнение команды завершилось ошибкой (exit status не равен 0), вызывается скрипт скрипт_перезагрузки.exp.
Для скрипта подключения к модему и перезагрузки был выбран Expect:
#!/usr/bin/expect -f
spawn telnet 192.168.1.1
expect   "Login:"
send "login\r"
expect "Password:"
send "password";
send "\r";
send "\r";
expect ">"
send "reboot\r";
send "\r";
expect "kill"
expect "Total:"
sleep 20;
send "\r";
expect eof
exit
Запускаем telnet с адресом 192.168.1.1, там в моем домашней сети расположился модем. Затем последовательно ожидаем запрос логина, отправляем логин, ождиаем запрос пароля, отправляем пароль. После логина и пароля необходимо отправить символ перевода строки - нажатие пользователем кнопки Enter. Как только дожидаемся командной строки (символа ">"), отправляем команду reboot. Сразу отключаться от модема нельзя, потмоу что в этом лсучае перезагрузка не будет завершена. Поэтому в конце скрипта я оставил ожидание пары контрольных точек в логе перезагрузки, 20-ти секундное ожидание, и ожидание того, что telnet сервер нас отключит - чтоб наверняка.
Осталось только запланировать выполнение скриптов, что в Линуксе легче всего сделать с помощью cron.
Запускаем:
crontab -e
и дописываем в конец файла:
# m h  dom mon dow   command
*/8 * * * * абсолютный_путь_к_скрипту/скрипт_проверки_подключения.sh
В данном случае я запланировал старт скрипта каждые 8 минут.

Комментариев нет :

Отправить комментарий