NodeJS -> Мониторинг IP адреса и порта

Пример скрипта для Мониторинга доступности IP адреса, порта или WEB сайта в сети интернет. Скрипт будет проверять доступность нужных нам хостов с интервалом в 15 секунд и передавать на сервер VizIoT значение затраченного времени между отправкой запроса и получением ответа «PING». Если заданный узел будет недоступен, то значением «PING» будет -500.

Что нам потребуется:

  • Компьютер: Любой компьютер с операционной системой Linux или Windows
  • Программы:
    • cURL — программа командной строки, для работы с HTTP
    • cron — демон для периодического выполнения заданий
    • NodeJS — серверная платформа для работы с JavaScript через движок V8
    • tcp-ping — пакет NodeJS для проверки доступности IP адреса
    • viziot-mqtt-client-nodejs — пакет NodeJS для взаимодействия с сервером VizIoT по протоколу MQTT

Добавление и настройка устройства:

  1. Добавим новое устройство в VizIoT с именем «VizIoTPinger»
  2. В «Основных настройках» устройства скопируем Ключ и Пароль доступа

Установка NodeJS:

Смотрите в «документации NodeJS». Для ОС Windows потребуется скачать и установить пакет с Nodejs.org. Для ОС Ubuntu или Debian:

# Using Ubuntu
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs
# Using Debian, as root
curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
apt-get install -y nodejs

Создание программы на NodeJS в операционной системе Debian:

Создадим директорию:

mkdir /var/viziot/
mkdir /var/viziot/VizIoTPinger

Перейдем в директорию:

cd /var/viziot/VizIoTPinger

Создадим NodeJS проект:

npm init

Установим пакеты для работы:

  • tcp-ping - пакет NodeJS для проверки доступности ip адреса;
    npm install tcp-ping --save
  • viziot-mqtt-client-nodejs - пакет NodeJS позволяет отправлять данные на сервер VizIoT по протоколу MQTT:
    npm install viziot-mqtt-client-nodejs --save

Создадим файл скрипта:

nano ./index.js

Содержание скрипта:

'use strict';

//#ключ и пароль доступа VizIoT
let keyDevice = '__________________';
let passDevice = '______________________';

//Массив WEB ресурсов, которые будут пинговаться
//Состоят из:
//	key - название параметра, который будет передаваться на сервер 
//	address - адрес WEB ресурса, IP адрес устройства
//	port - порт по которому доступно устройство
let pingList = [
	{
		key: "microsoft_ping",
		address: 'microsoft.com',
		port: 80
	}, {
		key: "google_ping",
		address: 'google.com'
	}, {
		key: "ipCamera_ping",
		address: '192.168.0.158',
		port: 554
	}
];

let tcpp = require('tcp-ping');
function pingIpAndPortAddress (item, callback) {
	let pingItem = {
		address: item.address,
		port: item.port || 80,
		attempts: 3,
		timeout: 5000
	};
	tcpp.ping(pingItem, function (err, data) {
		if (data.avg >= 0) {
			callback(item, +data.avg.toFixed(2))
		} else {
			callback(item, -500);
		}
	});
};

function getPacketAndSendToServer() {
	let countResults = 0;
	let packet = {
		'date': parseInt(new Date().getTime()/1000)
	};
	for (let ii = 0; ii < pingList.length; ii++) {
		pingIpAndPortAddress(pingList[ii], function (item, timeout) {
			packet[item.key] = timeout;
			console.log(item, timeout);
			countResults++;
			if (countResults == pingList.length) {
				viziotMQTTClient.sendDataToVizIoT(packet, function (err) {
					if (err) {
						console.log("publish", err);
					}
				});
			}
		});
	}
}

let viziotMQTT = require('viziot-mqtt-client-nodejs');
let viziotMQTTClient = new viziotMQTT(keyDevice, passDevice);
viziotMQTTClient.connect(function () {
	getPacketAndSendToServer();
});

let intervalTime = 60000;//интервал проверки доступности WEB сервиса
setInterval(function () {
	getPacketAndSendToServer();
}, intervalTime);

Данный скрипт будем запускать при старте системы. Для этого потребуется добавить запись в cron. Запустим редактор cron:

crontab -e

В самый конец добавим строку, которая будет запускать скрипт «/var/viziot/VizIoTPinger/index.js»:

@reboot node /var/viziot/VizIoTPinger/index.js > /var/viziot/VizIoTPinger/output.txt &

Добавление виджета:

  1. Создадим новую панель с именем «Доступность интернет сервисов»
  2. Добавим виджет «Время Пинга»
    1. тип: «График с областями суммирующий»;
    2. устройство: «VizIoTPinger»;
    3. параметры: microsoft_ping, google_ping, ipCamera_ping;
  3. Теперь можно наблюдать за доступностью WEB сервисов
  4. При желании настройте отправку уведомлений в Telegram или на E-Mail на случай недоступности одного или нескольких WEB сервисов / Хостов:
    1. перейдите в «Уведомления»
    2. нажмите «Добавить уведомление»
    3. выберите в списке устройств «VizIoTPinger»
    4. выберите способ получения уведомлений
    5. выберите ключ параметра, например, «google»
    6. выберите тип срабатывания «генерация при условии»
    7. выберите значение параметра «меньше (<)» и задайте значение «0»
    8. установите галочку в пункте «Уведомлять при возвращении в диапазон значений?»
    9. нажмите кнопку «Создать уведомление».
    10. Готово! Теперь, если параметру google будет присвоено значение -500, то к вам придёт уведомление. Когда WEB сервис (хост) снова будет доступен, VizIoT отправит уведомление о восстановлении нормального состояние параметра.