Возвращаясь к напечатанному.
Счастливым владельцам роутеров DLINK посвящается.
Впрочем, будет работать и на других роутерах с *NIX-based прошивкой.
На этот раз решалась задача "проверить наличие интернета и при отсутствии такового перезагрузить роутер".
Для решения задачи использован единственный несистемный компонент - freeware библиотечка
w3sockets для организации telnet-сесcии в скрипте. Идея почерпнута
отсюда.
Скрипт проверяет соединение с SMTP-сервером gmail на порт 25, при удачном соединении в лог пишется "Passed at <дата и время>", при неудачном роутеру отправляется команда на перезагрузку и в лог пишется "Epic fail at <дата и время>. Router rebooted".
Checker2.cmd
Код:
@set @script=0 /*
@echo off
set @script=
set "WORKFOLDER=c:\checker2"
set "LOGFILE=%WORKFOLDER%\checker.log"
reg query "HKCR\Socket.TCP" && set "W3SOCKET=INSTALLED" || set "W3SOCKET=NOT_INSTALLED"
if "%W3SOCKET%"=="NOT_INSTALLED" regsvr32 /s Socket.dll || exit /b
if "%PROCESSOR_ARCHITECTURE%"=="AMD64" %windir%\syswow64\cscript //nologo //e:jscript "%~dpnx0"|find /i "220" && call :PASSED || call :FAILED
if "%PROCESSOR_ARCHITECTURE%"=="x86" %windir%\system32\cscript //nologo //e:jscript "%~dpnx0"|find /i "220" && call :PASSED || call :FAILED
if "%W3SOCKET%"=="NOT_INSTALLED" regsvr32 /u /s Socket.dll
set "W3SOCKET="
set "WORKFOLDER="
set "LOGFILE="
exit /b
:PASSED
REM successfully connected
1>>"%LOGFILE%" echo Passed at %DATE% %TIME%
goto :EOF
:FAILED
REM no connection
1>>"%LOGFILE%" echo Epic fail at %DATE% %TIME%. Router rebooted
goto :EOF
*/
var RemoteHost = "smtp.gmail.com:25";
var RouterAddress = "192.168.0.1:23";
var RouterLogin = "admin";
var RouterPassword = "admin";
var RouterCommandPrompt = "#";
var RouterRebootCommand = "reboot";
try {
var TelnetSession = WScript.CreateObject("Socket.TCP");
TelnetSession.DoTelnetEmulation = 1;
TelnetSession.TelnetEmulation = "TTY";
TelnetSession.host = RemoteHost;
TelnetSession.Open();
TelnetSession.WaitFor("220");
TelnetSession.SendLine("quit");
TelnetSession.Close();
WScript.echo(TelnetSession.Buffer);
}
catch(e){
var RouterSession = WScript.CreateObject("Socket.TCP");
RouterSession.DoTelnetEmulation = 1;
RouterSession.TelnetEmulation = "TTY";
RouterSession.host = RouterAddress;
RouterSession.Open();
RouterSession.WaitFor("login:");
RouterSession.SendLine(RouterLogin);
RouterSession.WaitFor("password:");
RouterSession.SendLine(RouterPassword);
RouterSession.WaitFor(RouterCommandPrompt);
RouterSession.SendLine(RouterRebootCommand);
RouterSession.Close();
WScript.echo(RouterSession.Buffer);
}
Предполагается, что скрипт и библиотечка (файл Socket.dll) лежат в папке c:\Checker2 (переменная WORKFOLDER). Туда же пишется лог-файл. Кладёте в другую папку - поправьте в скрипте и в команде добавления в расписание.
В скрипте использованы умолчальные IP, login и password, характерные для роутеров dlink с оригинальной прошивкой. Соответственно - исправьте на свои, если у вас другие.
RouterCommandPrompt зависит от прошивки и модели роутера. Для Dlink DIR-320 с родной прошивкой это "#", для Asus RT-N16 с "олеговской" это "$". Что у вашего роутера - то и ставьте
RouterRebootCommand - команда перезагрузки роутера. Для доступных мне роутеров это "reboot", если у вашего что-то другое - впишите своё.
В назначенные задания добавляется командой
Код:
schtasks /create /RU SYSTEM /SC MINUTE /MO 15 /ST 00:00:01 /TR "c:\checker2\checker2.cmd" /TN "IMHO.ws Connect Checker 2.0"
Работает на Windows XP и более новых Windows.
Не будет работать, если ваш провайдер заблокировал доступ к внешним серверам по 25 порту!!!