Скрипт для мониторинга сети: порты, URL, системное время и пинг со звуковым оповещением

Как-то возникла потребность отслеживать доступность в сети нескольких важных устройств и отвлекать оператора от кроссвордов негромким, но навязчивым писком. Желательно без установки стороннего софта.

Закрыть этот вопрос помог почти забытый встроенный в Windows скриптовый язык hta. Получилось весьма изящно: полноценный инструмент без установки, без зависимостей, без Zabbix. В одном файле уместился и код, и нехитрый пользовательский интерфейс, и кастомный звуковой сигнал. Скрипт умеет проверять:

  • доступность хостов по ICMP,
  • состояние TCP-портов (доступность баз данных, веб-серверов, почты),
  • HTTP-статус сайтов и сервисов (веб-интерфейсы камер, API-эндпоинты),
  • расхождение системного времени.

Когда что-то идёт не так - пищит через колонки. Бип!

Запуск

Скрипт запускается как обычное приложение, двойным кликом.

Существует две версии скрипта: в первой звук уведомления идёт отдельным wav-файлом, а вторая - самодостаточная, являющаяся одновременно и скриптом, и валидным .wav в одном лице по принципу rarjpeg.

post

Настройка

Чтобы задать свой список адресов, откройте файл в Notepad++ или в другом текстовом редакторе (кодировка UTF-8). В начале есть блок <script> — он единственный, где нужно что-то менять.

prefs

Каждая строка в списке hosts - это один объект для проверки. Может включать следующие поля:

  • name - отображаемое имя, необязательный параметр..

  • ping - включает проверку доступности по ICMP. Можно вписать IP адрес или доменное имя.

  • port - скрипт будет пытаться подключиться к указанному TCP-порту. Сервис считается недоступным, если соединение сброшено или время вышло. Задаётся в формате адрес:порт. Несколько портов в одной строке указать нельзя, вместо этого продублируйте хост нужное число раз.

  • url - делает HTTP-запрос и проверяет код ответа, он должен быть в диапазоне 2xx. Задаётся в формате http(s)://адрес(:порт).

  • time - получает время сервера из HTTP-заголовка Date и сравнивает с локальными часами. Если разница превышает установленный порог - тревога. Задаётся в формате http(s)://адрес(:порт). Помимо серверов, можно также получать время с рабочих станций Windows через открытый по умолчанию порт 5357.

Как видно в последнем примере, один и тот же хост можно проверять сразу несколькими способами.

Расписание проверки и таймаут - общие для всех хостов, задаются в миллисекундах через checkInterval и checkTimeout. Допустимое расхождение времени - timeThreshold. Флаг urlFollowRedirects разрешает или запрещает следование редиректам - полезно, если вы следите за конкретным эндпоинтом и не хотите, чтобы он молча куда-то переехал.

Системные требования

Скрипт работает одинаково хорошо на всей линейке Windows от XP до 11-й, ничего дополнительно устанавливать не нужно. HTA крутится на движке IE, который Microsoft сохранили даже в эпоху Edge.

ping

В системе должно быть разрешено исполнение ActiveX для локальных страниц (по умолчанию разрешено). Это галочки в окне настроек internet Explorer, в разделе, связанном с безопасностью и политиками.

Проект на GitHub: https://github.com/u07/pinger