Простая система мониторинга хоста на основе ping Печать
Добавил(а) microsin   

Иногда для разборок с провайдерами нужно предоставить лог, где будет зафиксировано время пропадания работоспособности сетевого канала. Как известно, работоспособность канала проверяется командой ping - пингуется один хост (или несколько), расположенный по другую сторону канала. Но, к сожалению, простой запуск ping не регистрирует время запуска такого теста. Далее описана простая процедура настройки пинга с возможностью записи в лог времени тестов.

[Пример 1]
Идея мониторинга простая - в командном файле по циклу запускается ping, и время запуска регистируется с помощью утилиты now.exe, входящей в Resource Kit. Получается лог примерно такого вида:
...
********************************************************************************
********************************************************************************
     Pinging only one PBX IP from Moskow
--------------------------------------------------------------------------------
"PBX main address"
Tue Apr 29 17:08:42 2008
Pinging a.b.16.3 with 32 bytes of data:
Reply from a.b.16.3: bytes=32 time=9ms TTL=59
Reply from a.b.16.3: bytes=32 time=10ms TTL=59
Reply from a.b.16.3: bytes=32 time=10ms TTL=59
Reply from a.b.16.3: bytes=32 time=9ms TTL=59

Ping statistics for a.b.16.3:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),

Approximate round trip times in milli-seconds:
    Minimum = 9ms, Maximum = 10ms, Average = 9ms
...

Вся система состоит из 3 файлов - pinglogger.bat, iplist.txt и pingone.bat. Файл iplist.txt содержит список пингуемых IP-адресов - в каждой строке один IP и комментарий к нему (здесь в списке только один IP, но их может быть несколько):
[Содержимое файла iplist.txt]
a.b.16.3     PBX main address

Файл pingone.bat пингует один IP из списка (вызывается изнутри файла pinglogger.bat):
[Содержимое файла pingone.bat]
@rem usage: pingone.bat IP_address "description" logfile
@echo -------------------------------------------------------------------------------- >> %3
@echo %2 >> %3
@now >> %3
@ping %1 >> %3

Файл pinglogger.bat запускает на бесконечный цикл процесс пингования. Его можно стартовать как вручную, так и с помощью планировщика - я обычно настраиваю задание на момент загрузки компьютера (чтобы обеспечить автоматическое возобновление работы теста в случае перезагрузки):
[Содержимое файла pinglogger.bat]
:cycle
@set log=pinglog.txt
@echo ******************************************************************************** >> %log%
@echo ******************************************************************************** >> %log%
@echo      Pinging only one PBX IP from Moskow >> %log%
@for /F "tokens=1,*" %%l in (iplist.txt) do call pingone.bat %%l "%%m" %log%
goto cycle

Немного пояснений. Вывод комментария перед циклом for предназначен для документирования начала цикла пинга всего списка IP. Цикл for разбирает список IP iplist.txt, и выделяет из каждой строки IP-адрес и комментарий. IP присваивается переменной %%l, а комментарий - переменной %%m, и с этими параметрами вызывается pingone.bat. Параметр %%m заключен в кавычки не случайно - этим разрешается использование в комментариях IP-адресов файла iplist.txt пробелов (в нашем примере комментарий - "PBX main address"). Имя файла лога pinglog.txt задается строчкой @set log=pinglog.txt. Метод обработки такого лога с помощью grep см. здесь.


В результате получается примерно такой лог:
..
********************************************************************************
********************************************************************************
     Pinging only one PBX IP from Tver
--------------------------------------------------------------------------------
"Tver, PBX"

Tue Apr 29 17:04:32 2008
Pinging a.b.16.3 with 32 bytes of data:

Reply from a.b.16.3: bytes=32 time<1ms TTL=62
Reply from a.b.16.3: bytes=32 time<1ms TTL=62
Reply from a.b.16.3: bytes=32 time<1ms TTL=62
Reply from a.b.16.3: bytes=32 time<1ms TTL=62

Ping statistics for a.b.16.3:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

********************************************************************************
********************************************************************************
     Pinging only one PBX IP from Tver
--------------------------------------------------------------------------------
"Tver, PBX"

Tue Apr 29 17:04:35 2008
Pinging a.b.16.3 with 32 bytes of data:

Reply from a.b.16.3: bytes=32 time<1ms TTL=62
..

Читать его, конечно, довольно неудобно. Его можно свернуть к намного более удобной форме:
..
Wed Apr 30 10:02:40 2008 25% loss
Wed Apr 30 10:04:55 2008 25% loss
Wed Apr 30 10:07:14 2008 25% loss
Wed Apr 30 10:11:48 2008 50% loss
Wed Apr 30 10:15:25 2008 25% loss
Wed Apr 30 10:15:47 2008 75% loss
Wed Apr 30 10:22:45 2008 100% loss
Wed Apr 30 10:23:06 2008 100% loss
Wed Apr 30 10:23:48 2008 100% loss
Wed Apr 30 10:24:09 2008 100% loss
Wed Apr 30 10:29:41 2008 75% loss
Wed Apr 30 10:31:51 2008 25% loss
Wed Apr 30 10:35:15 2008 25% loss
Wed Apr 30 10:36:42 2008 100% loss
Wed Apr 30 10:37:03 2008 75% loss
Wed Apr 30 10:38:00 2008 75% loss
Wed Apr 30 10:38:16 2008 100% loss
Wed Apr 30 10:38:58 2008 100% loss
Wed Apr 30 10:39:19 2008 100% loss
Wed Apr 30 10:39:40 2008 100% loss
Wed Apr 30 10:40:01 2008 75% loss
Wed Apr 30 10:47:39 2008 25% loss
Wed Apr 30 10:54:58 2008 25% loss
Wed Apr 30 10:55:39 2008 25% loss
..

Это можно сделать с помощью скрипта на sh (Linux):
[..]# ./pingfilter.sh /root/tver_piter.txt all
Tue Apr 29 17:09:02 2008 25% loss
Tue Apr 29 17:26:08 2008 25% loss
..

На входе скрипта первым параметром указывается путь к сырому логу, а вторым параметром указывается фильтр. Варианты фильтра - all, 25%, 50%, 75%, 100%. Все скрипты можно скачать здесь. Назначение файлов:
windows\080424pingPBX.bat
   основной файл, запуск которого включает накопление лога. Можно запустить как вручную, так и настроить задание планировщика (этот вариант предпочтительнее), настроить выполнять задание при запуске компьютера, убрать ограничение на время работы. В этом файле в цикле for указывается текстовый список IP-адресов для пингования.
windows\pingone.bat
   список команд для пинга, который вызывается из основного файла 080424pingPBX.bat
windows\now.exe
   утилита из Resource Kit, нужна для фиксации времени в логе.
windows\pbxIP.txt
windows\phonesIP.txt
windows\weigtlyIP.txt
   примеры списков IP (каждому IP в строке можно добавить комментарий)
windows\pingPBXlog.txt
   пример лога - результата работы 080424pingPBX.bat
Linux\pingfilter.sh
   Фильтр для сырого лога. Usage: sh ./pingfilter.sh <logfilename> <all|25%|50%|75%|100%>
Linux\patt2.txt
   список фильтров для grep, используется в pingfilter.sh
Linux\glue-ping-strings.pl
   Скрипт на perl, который используется внутри pingfilter.sh для служебных целей обработки строк.


[Пример 2]

Этот пример попроще, состоит из скрипта timepinger.vbs, который делает одиночный ping и пишет результат в лог вместе со временем, и bat-файла ping-infinite.bat, который запускает этот скрипт с интервалом в 1 секунду.

[ping-infinite.bat]
:loop
timepinger.vbs a.b.48.254 logfile.txt
sleep 1
goto loop

[timepinger.vbs]
Dim Args
Set Args = WScript.Arguments

if (Args.Count < 2) then
    MsgBox "Usage:" + vbCrLf + "timepinger.vbs <IP> <logfile>"
else
    line = vbNullString
    'получаем аргументы
    IP = Args(0)
    logfile = Args(1)
    'получаем дату/время
    vYear   = CStr(Year   (Date))
    vMonth  = CStr(Month  (Date))
    if Len(vMonth) < 2 then
        vMonth = "0"+vMonth
    end if
    vDay    = CStr(Day    (Date))
    if Len(vDay) < 2 then
        vDay = "0"+vDay
    end if
    vHour   = CStr(Hour   (Time))
    if Len(vHour) < 2 then
        vHour = "0"+vHour
    end if
    vMinute = CStr(Minute (Time))
    if Len(vMinute) < 2 then
        vMinute = "0"+vMinute
    end if
    vSecond = CStr(Second (Time))
    if Len(vSecond) < 2 then
        vSecond = "0"+vSecond
    end if
    timestamp = "["+vDay+"."+vMonth+"."+vYear+" "+vHour+":"+vMinute+":"+vSecond+"]"
    'подготавливаем выходной лог
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set FileOutStream = FSO.OpenTextFile(logfile, 8, true, 0)
    'запускаем ping
    Set WshShell = CreateObject("WScript.Shell")
    Set WshExec = WshShell.Exec("ping " + IP + " -n 1")
    'обрабатываем вывод ping
    Set ConsoleStream = WshExec.StdOut
    While Not ConsoleStream.AtEndOfStream
        line = Trim(ConsoleStream.ReadLine())
        if (0 < InStr (line, "Reply from")) or (0 < InStr (line, "Request timed out")) then
            poscrlf = InStr (line, CStr(Chr(13)))
            line = Mid (line, 1, poscrlf-1)
            FileOutStream.Write timestamp + " " + line & vbCrLf
        end if
    Wend
end if

Вот пример лога logfile.txt, который получается на выходе (его удобно отфильтровать утилитой grep с ключами -A и -B, см. grep: примеры использования):
[07.11.2008 14:07:21] Reply from a.b.48.254: bytes=32 time=82ms TTL=253
[07.11.2008 14:07:23] Reply from a.b.48.254: bytes=32 time=130ms TTL=253
[07.11.2008 14:07:24] Reply from a.b.48.254: bytes=32 time=143ms TTL=253
[07.11.2008 14:07:26] Reply from a.b.48.254: bytes=32 time=121ms TTL=253
[07.11.2008 14:07:27] Reply from a.b.48.254: bytes=32 time=90ms TTL=253
[07.11.2008 14:07:29] Request timed out.
[07.11.2008 14:07:34] Reply from a.b.48.254: bytes=32 time=11ms TTL=253
[07.11.2008 14:07:36] Reply from a.b.48.254: bytes=32 time=193ms TTL=253
[07.11.2008 14:07:37] Reply from a.b.48.254: bytes=32 time=214ms TTL=253
[07.11.2008 14:07:39] Reply from a.b.48.254: bytes=32 time=171ms TTL=253
[07.11.2008 14:07:40] Reply from a.b.48.254: bytes=32 time=161ms TTL=253
[07.11.2008 14:07:42] Reply from a.b.48.254: bytes=32 time=53ms TTL=253
[07.11.2008 14:07:43] Reply from a.b.48.254: bytes=32 time=132ms TTL=253
[07.11.2008 14:07:45] Reply from a.b.48.254: bytes=32 time=167ms TTL=253
[07.11.2008 14:07:46] Reply from a.b.48.254: bytes=32 time=94ms TTL=253
[07.11.2008 14:07:48] Request timed out.
[07.11.2008 14:07:53] Reply from a.b.48.254: bytes=32 time=103ms TTL=253
[07.11.2008 14:07:55] Reply from a.b.48.254: bytes=32 time=209ms TTL=253
[07.11.2008 14:07:56] Reply from a.b.48.254: bytes=32 time=194ms TTL=253
[07.11.2008 14:07:58] Reply from a.b.48.254: bytes=32 time=138ms TTL=253