Вы просматриваете: Главная > С просторов паутины > Контроль зависания и автоматическая перезагрузка ADSL модема при дисконнекте

Контроль зависания и автоматическая перезагрузка ADSL модема при дисконнекте

D-Link-2640T Modem+Router (RM149)Статья посвящается владельцам глючных ADSL модемов DLink, в частности модели 2500U, которая зависает с периодичностью около одного раза в сутки, перекрывая жертве и ее близким родственникам жизненно важный доступ к Интернету.

        Причиной зависания может быть включённый UPnP, старая прошивка, переполнение таблиц маршрутизации или таблиц NAT, перегрев и т.д. Отключение UPnP, настройка автоматического завершения и возобновления сессии PPPoE соединения и прошивка модема последней версией firmware, конечно, снижают частоту зависаний, но не снимают проблему полностью.

         Этот пост предлагает стройное решение не только для «мягких» зависаний, когда модем просто теряет коннект к интернету, но и для «жестких» случаев, при которых модем даже не отвечает по web-интерфейсу.

      Решение задачи состоит в том, чтобы при помощи управляемой розетки перезагружать модем по питанию в зависимости от результатов периодически выполняемого скрипта проверки интернет-соединения.

Программная перезагрузка модема и ее недостатки

Ради справедливости отмечу, что опытный системный администратор ОС Linux вполне может обойтись написанием скрипта или простой программы для подсоединения к модему при потере соединения с Интернетом по протоколу telnet и перезагрузки командой reboot примерно так (возможно, некоторые ожидаемые командой expect строки придется поправить руками — модем может отвечать на telnet запросы несколько иначе):

#!/bin/sh

WATCHED_IP="www.ru"
MODEM_IP="192.168.1.1"
USERNAME="admin"
PASSWORD=""

# watch for remote host
ping -q -c 1 "$WATCHED_IP" > /dev/null    && exit
# exit if modem is down
ping -q -c 1 "$MODEM_IP" > /dev/null      || exit

expect - << EOF
set send_slow {1 .1}
spawn /usr/bin/telnet "$MODEM_IP"
expect -exact "ADSL Router"
expect -exact "Login: "
send -s -- "$USERNAME\r"
expect -exact "Password:"
send -s -- "$PASSWORD\r"
expect -exact "> "
send -s "reboot\r"
expect -exact "The system shell is being reset. Please wait..."
exit
EOF

Не забудьте заменить IP адрес модема, имя пользователя и пароль в скрипте на параметры, соответствующие реальности.  Этот скрипт сохраняется в файл и ставится при помощи cron на исполнение каждые 3 минуты.

Вариант для Windows — поставленный с помощью планировщика заданий на выполнение каждые 3 минуты командный *.bat файл с таким содержанием:

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

ping www.ru
If !ErrorLevel! == 0 (
Echo Internet Online
) Else (
Echo Internet Offline
Echo rebooting modem..
rundll32 url.dll,FileProtocolHandler http://192.168.1.1/rebootinfo.cgi
)

Но этот способ оставляет проблему нерешенной, если модем завис так, что даже не отвечает по web-интерфейсу. А также такой вариант привязывает нас к конкретному типу устройства, заставляя изучать мануалы и тестировать скрипт перезагрузки модема с помощью специфичных для него команд. В этих двух скриптах мы использовали страничку модема rebootinfo.cgi , которая позволяет перезагрузить модем без прохождения процедуры авторизации, а также использовали знание специфичных для этой модели сообщений, которыми модем отвечает при управлении через telnet. При необходимости надежного решения задачи контроля интернет-соединения независимо от типа модема остается только перезагрузка по питанию с помощью управляемой розетки. Подключив розетку к питанию 220В и порту LPT, приступаем к главной части, которая включает создание командных скриптов и расписания для их автоматического выполнения.

Аппаратная перезагрузка модема в ОС Windows

Скрипт для операционной системы Windows использует консольную программу для переключения состояния розеток LPTConsoleControl.

Напишем командный *.bat файл со следующим содержанием:

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

ping www.ru
If !ErrorLevel! == 0 (
Echo Internet Online
) Else (
Echo Internet Offline
Echo Switching modem on LPT pin#0 power line off..
start LPTConsoleControl /pin=0 /status=0
Echo pinging localhost for pause
ping 127.0.0.1
Echo Switching modem on LPT pin#0 power line on..
start LPTConsoleControl /pin=0 /status=1
)

Cкрипт для Windows можно скачать в виде командного *.bat файла. Этот скрипт включен в дистрибутив программы LPTConsoleControl, которая используется для переключения состояния управляемой розетки. Обратите внимание на параметр pin в скрипте — он должен соответствовать реальному номеру LPT канала, к которому подключена управляемая розетка. Для управляемых розеток в исполнении LPT-watchdog номер LPT канала всегда равен 0.  Далее с помощью планировщика заданий (Пуск — Стандартные — Служебные — Планировщик задач) создаем задачу на выполнение созданного командного файла или файла modem-watchdog-script.bat из дистрибутива LPTConsoleControl с требуемой периодичностью от имени SYSTEM. Трех минут обычно бывает достаточно для периодичности выполнения скрипта, меньше ставить нежелательно, так как модем должен успевать включиться и выйти в интернет до следующей проверки, в ином случае будет бесконечный цикл перезагрузок.

Аппаратная перезагрузка модема в ОС Linux

Скрипт для Linux использует штатные средства ОС для работы с LPT портом (модуль pyparallel). Создаем скрипт как в варианте с перезагрузкой через интерфейс, но заменяем инструкции telnet на команды управления LPT:

#!/bin/sh

WATCHED_IP="www.ru"
# watch for remote host
ping -q -c 1 "$WATCHED_IP" > /dev/null    && exit
rmmod lp
modprobe ppdev
python
import parallel, time
p = parallel.Parallel()     # open LPT1
p.setData(0x00)
time.sleep(3)
p.setData(0x01)
quit()
EOF

Для работы этого скрипта нужен Python и pyparallel. В Ubuntu можно поставить их через apt-get install или через Synaptic.

Источник

Метки: , ,


Оставить отзыв