Заметил такую проблему у своего 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:
#!/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:
#!/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.
Запускаем:
crontab -e
# m h dom mon dow command */8 * * * * абсолютный_путь_к_скрипту/скрипт_проверки_подключения.sh
Комментариев нет :
Отправить комментарий