Скрипты перезагрузки модема
Не так давно я задался целью немного облегчить свою работу. Все дело в том, что я администратор одной из минских домашних сетей. Работа интересная, творческая, но рутины хватает. Есть сервера, поэтому хочется автоматизма.
Когда модемы долго работают, они начинают тормозить или терять связь. У кого дома стоит 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 мы используем следующие команды:
- Подключаемся к модему командой telnet ip-модема
- Имя пользователя (модем может запрашивать, а может и не запрашивать.
- Вводим пароль.
- Вводим команду reboot и ждем пока перезагрузится модем
- Выходим из консоли, часто просто закрыв ее, потому что она подвисает после разрыва соединения связанного с перезагрузкой.
Для написания скрипта используются все те же команды, с применением некоторых служебных слов, чтобы указать компьютеру как и что ему делать. Я не буду подробно расписывать все возможности языка, а непосредственно перейду к решению поставленной задачи. Того что я опишу будет достаточно, чтобы реализовать много задач. Я лишь поясню и прокомментирую те команды, которые были использованы.
Скрипт перезагрузки модема 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 — данная команда используется для завершения работы скрипта.
Вот собственно, и Весь скрипт. Теперь его можно смело заливать на сервер и выполнять. Как именно его запускать, решать Вам. Я его запускаю по крону ежедневно ночью. Чтобы разрыв связи не мешал. Я в это время уже сплю :)
[dm]4[/dm]
[dm]5[/dm]
[dm]6[/dm]