понедельник, 26 августа 2013 г.

Софтверная перезагрузка роутера Yota (Gemtek)

В одном из офисов мы используем для доступа в интернет радиоканал, предоставляемый известной компанией Yota. И всё было бы с этим доступом хорошо, если бы не странное поведение чудо-устройства, предоставляемого Йотой для доступа. Называется китайская штука "Интернет-центр Gemtek" и работает, в целом, хорошо и стабильно, но есть у неё такой каприз:
если все сотрудники достаточно далеко от офиса, этот нехороший модем иногда виснет наглухо. До хард-ресета. И хоть ты тресни, как говорится.

Виснет Gemtek, и всё. Экспериментами зависания добиться не удалось, логи машинки до последнего момента были мне недоступны, а привычка устройства была неизменной 
 если никто не может попасть в офис, модем крепко задумывается о чём-то своём.

Конечно, такое поведение важного узла сети меня не устраивало, тем более что на этом же канале висит наш mail-сервер. Техподдержка Yota, как я понял твёрдо, не способна на действия сложнее отсылки на сайт к ФАКу или пересылки счетов, так что решал проблему сам.


Начал с того, что написал скрипт: при отсутствии пинга поднимать резервный канал через USB-3g свисток, подключенный к моей рабочей станции. Через этот свисток скриптом же осуществляется подключение к OpenVPN, поднятом на моем домашнем роутере (через DynDNS, к сожалению, к 3g каналу не подключиться). Про OpenVPN поподробнее напишу в следующий раз, а что касается скрипта, то думаю, тебе не составит никакого труда написать его самому, если читал предыдущие статьи :) Коннект поднимается совершенно банально виндовым rasdial, после проверки %ERRORLEVEL% от команды ping. Чтобы не дёргался каждый пропущенный пинг, создал счётчик-переменную. Если пинга нет, то скрипт просто не заканчивает работу, возвращаясь по goto –
 до накопления определённого количества неответов или до успешного пинга.

Запустив своё творение, я хитро уехал из города на выходные, и модем тут же завис ) Ну, отлично, чего и хотели. Подключаюсь через "свисток" и VPN и смотрю, как чувствует себя модем. Модем, как оказалось, не зависал совсем уж наглухо, а просто считал, что он вполне себе подключен, получает и раздаёт интернет, хотя на деле ничего подобного не происходило.

Интерфейс у Йотавской прошивки самый примитивный, логи не посмотреть. Но после софт-резета интернет вернулся, как ни в чём не бывало.

Теперь задача ясна? Конечно ) Надо написать скрипт, который будет ресетить модем за нас, да и всё, спать спокойно. Вот только как? Никакого SSH- или подобного командного интерфейса у устройства нет и не предвидится, поиск в интернете никакой информации не дал. Не "записывать" же движения курсора по веб-интерфейсу, в самом деле.


Что ж, полезем в кишки HTML.


Поиск в "кишках" оказался удивительно недолгим. Не вдаваясь в подробности, сразу выдам решение:


http://IP/cgi-bin/sysconf.cgi?page=ajax.asp&action=reboot&reason=number&time=dd.mm.yyyy


вот такая строка делает модему софтверный резет. Без авторизации. Вообще.

reason – это причина перезагрузки, для записи в лог, может быть любым, как я понял, так что number может быть любым. На дату (dd.mm.yyyy) устройству тоже наплевать, главное, чтобы была.

Это, конечно, косяк. Но, пока не закрыли, буду использовать, потому как модем виснет, а Йоте наплевать, судя по всему: написал, рассказал, даже не ответили.


Так что пользуйтесь на здоровье, пока новая прошивка не вышла ;)


Скрипт целиком:


@echo off

set /A COUNTER = 0
:start
ping -n 2 ya.ru
if %ERRORLEVEL% == 1 (
    if %COUNTER% GTR 2 (
        wget "http://192.168.1.1/cgi-bin/sysconf.cgi?page=ajax.asp&action=reboot&reason=1&time=1.1.1987" --spider
        timeout 120
        modem_resetted.cmd
        if %COUNTER% GTR 5 (
            exit /b
       
        ) else (
            goto start
        )
    )
    SET /A COUNTER = %COUNTER% + 1
    timeout 75
    goto start
)
exit /b

Обрати внимание:

1. timeout – прога из комплекта Windows Server 2003. В XP, например, её нет. Но можно скачать и закинуть в System32, и будет хорошо ) ;
2. wget – это такой закачиватель для html из командной строки. Поскольку мы пишем скрипты, командная строка не должна тебя пугать ) Скачать wget можно тут. Параметр --spider нужен, чтобы wget ничего не качал, а только "пнул" сервер командой - чего нам и надо )


А если дыру прикроют, куплю вот такую штуку - для уже аппаратной перезагрузки. А что - автоматизация!


3 комментария:

  1. приветствую.
    как быстро происходит перезагрузка роутера до полной работы?
    я правильно понимаю что если вручную в браузере отправить данную команду
    http://IP/cgi-bin/sysconf.cgi?page=ajax.asp&action=reboot&reason=number&time=dd.mm.yyyy
    то роутер перезагрузится?

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

    ОтветитьУдалить
    Ответы
    1. >как быстро происходит перезагрузка роутера до полной работы?
      Около минуты

      >я правильно понимаю что если вручную в браузере отправить данную команду то роутер перезагрузится?
      Да, верно.

      >знаете ли вы какое нибудь решение что бы через командную строку перезагружать, а лучше переподключаться, не роутер, а модем yota или любой другой?
      Имеется в виду USB-модем? Думаю, проще всего будет отключать и вновь подключать устройство. Например, способо, описанным в статье про bluetooth: http://automatize-it.blogspot.ru/2013/08/bluetooth.html

      Удалить
  2. @echo off
    set /A maxtest = 7
    set /A i = 0

    :step

    ping -n 1 ya.ru | find /i "TTL=">nul
    if %errorlevel%==0 (
    echo. vse ok %date% %time% >> "C:\batniki\yotareset.log"
    echo VSE ok
    goto end
    ) else (
    echo upssss %i% iz %maxtest%
    set /A i="i + 1"
    if %i% == %maxtest% goto fuck
    goto step
    )

    :fuck

    c:\Curl\Curl.exe -X GET "http://192.168.1.2/cgi-bin/sysconf.cgi?page=ajax.asp&action=reboot&reason=1&time=1.1.1987"
    echo. reset-yota %date% %time% >> "C:\batniki\yotareset.log"

    :end

    ОтветитьУдалить