msgbartop
Главное задаться целью
msgbarbottom




12 Фев 09 Скрипты перезагрузки модема

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

Когда модемы долго работают, они начинают тормозить или терять связь. У кого дома стоит 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

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 «adminr» передаем модему имя пользователя.  Вам нужно заметить имя пользователя на то, которое запрограммировано в Вашем модее. Узнать это не сложно из руководства по эксплуатации модема. Оно такое же как и для входа через WEB-интерфейс.

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

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

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

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

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

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

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

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

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

Пример работы скрипта

Чтобы не быть голословным, я записал видеоролик, который показывает как отрабатывают скрипты для перезагрузки модемов Zyxel и Billion.





Отправить другу


Tags: , , , , , , , , , , , , , , , ,



Reader's Comments

  1. |

    Здравствуйте, подскажите как теперь мне сделать так что б этот скрипт выполнялся автоматом например ночь когда я сплю или вообще с каким то интервалом… у меня Ubuntu.Спасибо.

  2. |

    Очень просто. Для таких целей применяйте планировщик CRON



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

*






Каталог TUT.BY Rating All.BY Rambler's Top100 Каталог на TIGA.BY, а также  новости, работа, объявления, фото и многое другое NP.BY - Новый портал. Почта, чат, погода, авто, объявления, рефераты. Каталог на interby.net Первый Каталог - Предложения продавцов, каталог цен
Раскрутка сайтов