" Решал задачу доступа извне к домашнему компьютеру и через две недели наслаждения результатами труда на меня напала новая напасть - роутер теряет внешнюю сеть. "Лечится" только перезагрузкой роутера. Роутер сам по себе вполне приличный - Zyxel Keenetic Giga с самой последней прошивкой. И подключен к электрической сети через стабилизатор напряжения. Грешу все-таки на своего интернет-провайдера - "Киевстар" - , но "система" должна ведь работать! Логи роутера не читал - можно долго и нудно бодаться с провайдером, но независимо от этого надо проверять работоспособность исходящего канала и, в случае проблем, перезагружать роутер.
Самый простой вариант - в самом роутере поставить в crontab задачу для пинга какого-то внешнего сервера и в случае отсутствия ответа отправлять его в перезагрузку. Но в данном роутере по умолчанию нет SSH, хоть он и работает на Linux. Shell можно добавить "внешним приложением" с постоянно включенной в него флешки, но такой вариант предусмотрен только в V.1 прошивки, а у меня V.2... Значит надо эту проверку проводить с другого устройства внутри моей домашней сети и потом давать команду роутеру на перезагрузку. Выбор был из двух устройств - HTPC под Windows 7, из-за которого это все затевалось, и простаивающий без дела после неудачных экспериментов с построением станции видеонаблюдения Raspberry Pi под управлением клона Debian. Выбор пал на Raspberry - в таком формате он может спокойно годами работать без перезагрузки и стоит прямо рядом с роутером, запитанный через тот же самый стабилизатор напряжения. Вот что было сделано:
(основанный на этом образце):
#!/usr/bin/expect -f#отключаем вывод протокола диалога send-expect на экран
log_user 0
#выполняем telnet к устройству
spawn telnet 192.168.1.1
#ждем приглашение "Login:" и просим expect набрать admin и нажать ввод - \r
expect "Login:" {send "admin\r"}
#тоже только вводим пароль
expect "Password:" {send "my_password\r"}
#уже авторизовались, поэтому ждем приглашения (config) и вводим команду reboot-a
expect "(config)" {send "system reboot\r"}
#включаем вывод протокола диалога send-expect на экран, чтобы посмотреть чем закончился скрипт
log_user 1
#выходим из устройства
send "quit\r"
#завершаем работы expect
expect eof
Скрипт этот лучше всего положить в папку /bin с правами доступа 750 или 700, что бы спрятать его от "посторонних глаз". Для проверки его можно "подергать" вручную, набрав команду с правами суперпользователя:
# zyxel_keenetic_reboot.sh
@! /bin/bashif ping -c 1 8.8.8.8 >> /dev/null
then
echo "ping is Ok"
else
zyxel_keenetic_reboot.sh
fi
Долго думал какой внешний сервер проверять - остановился на DNS-сервере компании Google (8.8.8.8 ). Вы можете подставить любой свой сервер.
$ sudo crontab -e
*/5 * * * * zyxel_keenetic_ping_test.sh
PS
А вот какой скрипт на VBS мне предложили в российской службе поддержки Zyxel, который можно запускать из диспетчера задач Windows:
set WshShell = WScript.CreateObject("WScript.Shell")WshShell.run "telnet.exe"
WScript.Sleep 5000
WshShell.SendKeys"o 192.168.1.1" & chr(13)WScript.Sleep 5000
WshShell.SendKeys"admin" & chr(13) -> Ваш логинWScript.Sleep 5000
WshShell.SendKeys"1234" & chr(13) ->ваш парольWScript.Sleep 5000
WshShell.SendKeys"system reboot" & chr(13)WScript.Sleep 3500
ProcessClose("cmd.exe")
ProcessClose("telnet.exe")
Function ProcessClose(sProcName)
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & sProcName & "'")
For Each objProcess in colProcessList
objProcess.Terminate()
Next
End Function
Re: А теперь ищем эту самую внешнюю сеть :)
К сожалению достаточно часто этот сервер дает слишком большую задержку ответа :( От одного сисадмина поступило предложение использовать для проверки сервер 8.4.4.4 - он, вроде как, работает намного стабильней.
Отправить новый комментарий