PDA

Просмотр полной версии : Connect Checker


MarkXIII
07.11.2011, 22:43
Собственно, нужно следущие, пинать извне мой ройтер, скажем раз в 15 минут, на предмет наличия тыранета.

Имеем Asus WL-500gP v2 - Tomato Firmware v1.28.8754 ND USB Ext
Провайдер с статическим IP, *IMSYS он еще на кой то хрен отключил наружу ping, trace..
Ужас.

Хых, Как это сделать грамотно?
Не обязательно даже такую схему реализовывать, суть мне нужно проверить именно стабильность доступа.

Borland
08.11.2011, 00:51
MarkXIII, чтобы "пинать извне" - нужно иметь какой-то порт открытым наружу (и проброшенным на роутере вовнутрь).
Дальше на этот порт вешается (к примеру) веб-сервис с каким-нить небольшим файликом (пары байт в принципе достаточно).
Дальше с внешнего (по отношению ко всей конструкции) компа обычным GNU Wget (http://www.gnu.org/s/wget/) по шедулеру тягаешь тот самый файлик, отписываешь в лог-файл время и результат (удачно/неудачно), удаляешь файлик чтоб не мешал, при необходимости выполняешь какие-то ещё действия.
Как вариант - "какой-то сервис" может висеть и на роутере.
Как ещё один вариант - логи может вести и веб-сервер.
Как ещё один вариант - wget может работать изнутри (в т.ч. и на роутере), а файлик качать с внешнего сервиса (www.microsoft.com:80/index.html весит 415 байт192кбайт).
Если изнутри на машине стоит XP (на других Win не сработает) - можно вместо wget использовать встроенный netsh (netsh diag connect iphost www.microsoft.com 80). В отличие от wget - для netsh не нужен никакой файлик, проверяется возможность соединения и только.

<Добавлено утром>
Собственно, вариант "комп с Win за роутером, сервер снаружи"
checker.cmdset REMOTEURL=ftp://ftp.mozilla.org/index.html
set WORKFOLDER=c:\checker
set LOGFILE=%WORKFOLDER%\checker.log
set WGETPROG=%WORKFOLDER%\wget.exe


%WGETPROG% --output-document=%WORKFOLDER%\foo.html %REMOTEURL% && call :PASSED ||call :FAILED
goto :EOF

:PASSED
REM есть коннект
1>>%LOGFILE% echo Passed at %DATE% %TIME%
del /q %WORKFOLDER%\foo.html
goto :EOF

:FAILED
REM нет коннекта
REM сюда можно добавить команду переинициализации соединения
1>>%LOGFILE% echo Epic fail at %DATE% %TIME%
goto :EOF

В "Назначенные задания" добавлять командой (предполагая, что всё хозяйство лежит в папке c:\Checker)schtasks /create /RU SYSTEM /SC MINUTE /MO 15 /ST 00:00:01 /TR "c:\checker\checker.cmd" /TN "IMHO.ws Connect Checker" Проверено, работает.:biggrin:

Borland
19.02.2012, 19:35
Возвращаясь к напечатанному. :gigi:
Счастливым владельцам роутеров DLINK посвящается.
Впрочем, будет работать и на других роутерах с *NIX-based прошивкой. :)

На этот раз решалась задача "проверить наличие интернета и при отсутствии такового перезагрузить роутер".

Для решения задачи использован единственный несистемный компонент - freeware библиотечка w3sockets (http://www.scripts20.com/script/549/25997/w3Sockets.html) для организации telnet-сесcии в скрипте. Идея почерпнута отсюда (http://www.visualbasicscript.com/Script-Telnet-m38306.aspx).

Скрипт проверяет соединение с 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
20.02.2012, 00:43
Тут мне на руборде (http://forum.ru-board.com/topic.cgi?forum=62&topic=23213&start=1740#19) wolf0425 высказал претензию по-поводу обилия JScript в IMHO.ws Connect Cheker 2.0:вместо одной длинной строчки с ping и wget - пара килобайт яваскрипта и .dll в папке. круто
А мне что, мне не жалко. Есть у меня вариант и без JScript вообще. :gigi:
Правда, там кроме wget (http://gnuwin32.sourceforge.net/packages/wget.htm) с кучей библиотечек требуется ещё одна доп. программа TSE (http://kazus.ru/programs/viewdownloaddetails/kz_0/lid_5723.html) (Telnet script executor). И файлов несколько поболее...

Checker.cmd:set REMOTEURL=ftp://ftp.mozilla.org/index.html
set WORKFOLDER=c:\checker
set LOGFILE=%WORKFOLDER%\checker.log
set WGETPROG=%WORKFOLDER%\wget.exe


%WGETPROG% --tries=3 --output-document=%WORKFOLDER%\foo.html %REMOTEURL% && call :PASSED ||call :FAILED
goto :EOF

:PASSED
REM есть коннект
1>>%LOGFILE% echo Passed at %DATE% %TIME%
del /q %WORKFOLDER%\foo.html
goto :EOF

:FAILED
REM нет коннекта
1>>%LOGFILE% echo Epic fail at %DATE% %TIME%. Rebooting router.
(
echo open 192.168.0.1
echo waitfor "login:"
echo transmit "admin^^M"
echo waitfor "sword:"
echo transmit "admin^^M"
echo waitfor "#"
echo transmit "reboot^^M"
)|tse >>%LOGFILE%
goto :EOF


Как нетрудно заметить - это Checker 1.0 с прикрученной функцией перезагрузки роутера...
Работает... Точнее - уже работало, версию 2.0 я для того и делал, чтобы от лишних файлов избавиться... ;)

Единственный (на мой взгляд) существенный плюс по сравнению с версией 2.0 - wget в принципе всё равно какой файлик, откель и с какого порта тянуть. Можно по http с сайта мокрософта, можно по ftp с сайта мозилы. Нет привязки к smtp...

Borland
29.02.2012, 20:45
Вопрос из другого топика, и довольно старыйкак написать скрипт, проверяющий соединение с vpn сервером? И создающим его, если коннекта нет.
Берётся Connect Checker 1.0, и сразу после (или даже вместо :gigi:) строчки "REM сюда можно добавить команду переинициализации соединения" добавляется пара командrasdial <Имя соединения> /DISCONNECT
rasdial <Имя соединения> <Имя пользователя> <Пароль>Естественно, вместо "<Имя соединения> <Имя пользователя> <Пароль>" нужно подставить соответственно имя своего соединения, логин и пароль. :biggrin:

Или даже без использования сторонних утилит вообще:>nul ping -n 10 www.ru |find /i "TTL" ||(
rasdial <Имя соединения> /DISCONNECT
rasdial <Имя соединения> <Имя пользователя> <Пароль>
) проверяется наличие отклика www.ru на пинги, при отсутствии такового соединение принудительно разрывается и создаётся заново. Но: если пинги наружу закрыты у провайдера, то этот вариант не сработает.