Заметил такую проблему у своего ADSL модема DLink DSL-2540U: периодически теряется подключение к интернет, хотя сам модем остается работать. Подключение восстанавливается только после перезагрузки. Обновление прошивки и различные настройки не помогли. С кастомными прошивками решил не экспериментировать, а решить эту проблем дургим способом.
Так как у меня уже имелась Raspberry Pi, работающая в режиме 24/7, я решил использовать ее для решения проблемы. Идея заключалась в том, чтоб Raspberry с определеным интервалом времени пыталась подключиться к сети интернет, и, если у нее это не выходило, перезагружала бы модем. На модеме в заводской прошивке работает telnet сервер с ограниченным набором команд, среди которых есть и reboot.
Итак, скрипт, который пингует DNS Гугла, и, в случае отсутствия ответа, запускает скрипт перезапуска модема, написан на Bash:
Тут все просто: запускается команда ping c таймаутом 5 секунд, и одним пакетом. В случае, если выполнение команды завершилось ошибкой (exit status не равен 0), вызывается скрипт скрипт_перезагрузки.exp.
Для скрипта подключения к модему и перезагрузки был выбран Expect:
Запускаем telnet с адресом 192.168.1.1, там в моем домашней сети расположился модем. Затем последовательно ожидаем запрос логина, отправляем логин, ождиаем запрос пароля, отправляем пароль. После логина и пароля необходимо отправить символ перевода строки - нажатие пользователем кнопки Enter. Как только дожидаемся командной строки (символа ">"), отправляем команду reboot. Сразу отключаться от модема нельзя, потмоу что в этом лсучае перезагрузка не будет завершена. Поэтому в конце скрипта я оставил ожидание пары контрольных точек в логе перезагрузки, 20-ти секундное ожидание, и ожидание того, что telnet сервер нас отключит - чтоб наверняка.
Осталось только запланировать выполнение скриптов, что в Линуксе легче всего сделать с помощью cron.
Запускаем:
и дописываем в конец файла:
В данном случае я запланировал старт скрипта каждые 8 минут.
Так как у меня уже имелась Raspberry Pi, работающая в режиме 24/7, я решил использовать ее для решения проблемы. Идея заключалась в том, чтоб Raspberry с определеным интервалом времени пыталась подключиться к сети интернет, и, если у нее это не выходило, перезагружала бы модем. На модеме в заводской прошивке работает telnet сервер с ограниченным набором команд, среди которых есть и reboot.
Итак, скрипт, который пингует DNS Гугла, и, в случае отсутствия ответа, запускает скрипт перезапуска модема, написан на Bash:
1 2 3 4 5 6 7 8 | #!/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 |
Для скрипта подключения к модему и перезагрузки был выбран Expect:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #!/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 |
Осталось только запланировать выполнение скриптов, что в Линуксе легче всего сделать с помощью cron.
Запускаем:
1 | crontab -e |
1 2 | # m h dom mon dow command * /8 * * * * абсолютный_путь_к_скрипту/скрипт_проверки_подключения.sh |
Комментариев нет :
Отправить комментарий