Тема: Connect Checker
Показать сообщение отдельно
Старый 19.02.2012, 20:35     # 3
Borland
СуперМод
IMHO Консультант 2005-2009
 
Аватар для Borland
 
Регистрация: 14.08.2002
Адрес: Московская ПЛ, ракетный отс
Пол: Male
Сообщения: 14 377

Borland - Гад и сволочь
IMHO.ws Connect Checker 2.0

Возвращаясь к напечатанному.
Счастливым владельцам роутеров 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 порту!!!
__________________
Не засоряйте форум "спасибами"! Для выражения благодарности существуют ПС и репутация! Соблюдайте Правила!
Распространенье наше по планете
Особенно заметно вдалеке:
В общественном парижском туалете
Есть надписи на русском языке

В. Высоцкий

Borland вне форума