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

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

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

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

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

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

!!!Важно!!!

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

1
atp-get install expect


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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/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 данная команда используется для завершения работы скрипта.

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

http://www.ionline.by/wp-content/plugins/downloads-manager/img/icons/bat-cmd.gif Скачать: billion-modem-reboot ()
Файл добавлен: 22/01/2013
Количество скачиваний: 911
Описание: Скрипт автоматической удаленной перезагрузки модемов Billion. Написан на expect под Linux. Скрипт передает команды в модем по telnet.

http://www.ionline.by/wp-content/plugins/downloads-manager/img/icons/bat-cmd.gif Скачать: dlink-modem-reboot ()
Файл добавлен: 22/01/2013
Количество скачиваний: 1095
Описание: Скрипт автоматической удаленной перезагрузки модемов D-Link. Написан на expect под Linux. Скрипт передает команды в модем по telnet.

http://www.ionline.by/wp-content/plugins/downloads-manager/img/icons/bat-cmd.gif Скачать: zyxel-modem-reboot ()
Файл добавлен: 22/01/2013
Количество скачиваний: 791
Описание: Скрипт автоматической удаленной перезагрузки модемов Zyxel. Скрипт тестировался на моделях 660 и 645. Написан на expect под Linux. Скрипт передает команды в модем по telnet.

     

iOnLine - сайт о мире IT  | Мобильная версия


Полная версия сайта