Скрипты перезагрузки модема

Не так давно я задался целью немного облегчить свою работу. Все дело в том, что я администратор одной из минских домашних сетей. Работа интересная, творческая, но рутины хватает. Есть сервера, поэтому хочется автоматизма.

Когда модемы долго работают, они начинают тормозить или терять связь. У кого дома стоит ADSL — модем или кто когда-нибудь звонил на техническую поддержку интернет провайдера помнит, что первый вариант решения проблемы: перезагрузите модем. Да, бывает это не так часто, но всеже. А если ты не дома, то что делать? Да и почему бы в качестве перестраховки не сделать так, чтобы можемы перезагружались автоматически? Сказано сделано. Порывшись в интернете я не нашел ничего путного под линукс. Были попытки написать какие-то скрипты под Винду. Но мне это не подходило.

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

http://ru.wikipedia.org/wiki/Expect

Покопав в этом направлении, я понял, что именно этот скриптовой язык и поможет мне решить проблему. Прочем решить ее универсально, написать скрипты для каждой модели модема с минимальными измененями. Как я понял скриптовой язык Expect позволяет парсить выводимую информацию и после определенных фраз вводить те или иные значения. Это стало очень важным, потому что в модемах Zyxel работает специальная оболочка и до командной строки еще добраться надо, это вам не D-Link где все просто: ввел команду и получи сразу результат.

!!!Важно!!!

Перед тем как запускать приведенные скрипты необходимо установить соответствующий пакет, для того чтобы Linux понимал данный скриптовой язык.  Поскольку я являюсь фанатом Linux Debian, то команда установки выглядит следующим образом:

atp-get install expect


Разработка алгоритма для перезагрузки модема
D-Link DSL-2540U

Что мы делаем для того, чтобы перезагрузить модем через telnet? Мы вводим соответствующие команды в терминале и модем их выполняет. Для перезагрузки модема D-Link мы используем следующие команды:

  1. Подключаемся к модему командой telnet ip-модема
  2. Имя пользователя (модем может запрашивать, а может и не запрашивать.
  3. Вводим пароль.
  4. Вводим команду reboot и ждем пока перезагрузится модем
  5. Выходим из консоли, часто просто закрыв ее, потому что она подвисает после разрыва соединения связанного с перезагрузкой.

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

Скрипт перезагрузки модема D-Link DSL-2540U

#!/usr/bin/expect -f

#
#byfly modem reboot program
#model D-link DSL-2540U
#

#Connect to modem

spawn telnet 192.168.1.1

#Request USERMAME string

expect «Login:»

#Send username

send «adminr»

#Request password

expect «Password:»

#Send PASSWORD

send «my_passwordr»

#Inside in modem

expect «>»

#send comand to modem «reboot»

send «rebootr»

#Exit

send «exitr»
expect eof

Теперь разберемся в командах. (для непосвященных)

#!/usr/bin/expect -f —директива компилятору чтобы он знал какой скриптовой язык мы используем.

Следующим шагом можно инициализировать переменные. Но я не думаю, что это стоит делать, ведь мы пишем совсем маленький скрипт и само собой перегружать его еще и бесполезными переменными (переменные в данном случае бесполезны поскольку мы не проводим с ними никаких логических операций, а значения присвоенные переменным в процессе работы скрипта используются всего 1 раз, так что смысла в этом нет). Как говорится, краткость сестра таланта.

Теперь перейдем к командам выполняемым скриптом. Вся простота и перелесть заключается в том,  что мы не придумаваем ничего нового, просто используем знакомые нам команды.

Для простоты восприятия хочу отметить, что

spawn telnet 192.168.1.1Команда подключения к модему. Вместо 192.168.1.1 введите IP-адрес Вашего модема.

expect — Команда, которая парсит текст, выводимый в терминал устройством и ищел соответствующее слово или форазу указанное после него в кавычках » «. Правильно введенная фраза — гарантия того, что скрипт отработает правильно и не свалится в ошибку.

expect «Login:»данная команда означает, что после слова Login: скрипт становит курсор и будет готов ввести следующую команду. Не забываем, что Linux различает верхний и нижний регистр написания, поэтому все тексты, которые должен искать скрипт должны быть написаны именно так, как они отображаются в терминале. Со всеми знаками и символами.

send — команда отправки. Вставляет в строку значения, необходимые нам, грубо говоря вводит команды вместо нас, которые указаны в » «. Не забываем, что, если после введенной команды нам нужно нажать клавишу ENTER для выплолнения, то в кавычках нужно ввести следующее сочетание символов без пробела после нужной команды или, к примеру логина, \r

send «admin\r» передаем модему имя пользователя.  Вам нужно заметить имя пользователя на то, которое запрограммировано в Вашем модее. Узнать это не сложно из руководства по эксплуатации модема. Оно такое же как и для входа через WEB-интерфейс.

expect «Password:» дожидаемся пока модем запросит пароль.

send «my_password\r» отправляем модему пароль которым он защищен. Не стоит забывать пароль. Замените фразу my_password на ваш пароль. Не забываем, что сразу после пароля должно быть написано  вот это \r» Между параметром и командой использование пробела недопустимо!

Мы успешно авторизовались и вошли в модем.

Теперь транслируем модему нужные команды и наслаждаемся результатом.

expect «>»ищем строку ввода команды. обращаю Ваше внимание, в разных модемов она выглядит по разному. А кавычках рекомендую вписать текст строки, который стоит в начале строки ввода команды.

send «reboot\r»передаем модему команду для перезагрузки.

send «exit\r»передаем модему команду завершения соедниения. Завершаем telnet-сессию.

expect eof данная команда используется для завершения работы скрипта.

Вот собственно, и Весь скрипт. Теперь его можно смело заливать на сервер и выполнять. Как именно его запускать, решать Вам. Я его запускаю по крону ежедневно ночью. Чтобы разрыв связи не мешал. Я в это время уже сплю :)

[dm]4[/dm]

[dm]5[/dm]

[dm]6[/dm]

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

 
Поделись с друзьями!
Открыть с мобильного телефона
qr code
Считайте QR-код при помощи камеры мобильного телефона или планшета и откройте страницу на своем устройстве
Мои проекты на GITHUB


Мои проекты на GitHub

iOnline в социальных сетях
Мы в Twitter