Примеры применения
30.11.2018

SMS шлюз для Cacti

SMS шлюз для Cacti

Cacti – open-source web-приложение, система позволяет строить графики при помощи RRDtool. Cacti собирает статистические данные за определённые временные интервалы и позволяет отобразить их в графическом виде. Преимущественно используются стандартные шаблоны для отображения статистики по загрузке процессора, выделению оперативной памяти, количеству запущенных процессов, использованию входящего/исходящего трафика. По сути Cacti является только оболочкой для визуализации накопленных данных мониторинга – рисования графиков. В этой статье мы рассмотрим вариант расширения функционала Cacti для отправки SMS-сообщений о событиях мониторинга (SMS шлюз для Cacti). Для отправки SMS можно использовать следующие устройства компании NetPing:

Это позволит значительно сэкономить на услугах сторонних сервисов SMS-рассылки, потому что в таком случае стоимость SMS будет соответствовать тарифу вашего сотового оператора без дополнительных комиссий.

Требования к оборудованию

  • Устройство NetPing перечисленное выше с установленной SIM картой – 1 шт;
  • ПК/сервер с OC Ubuntu и установленной на нём системой мониторинга Cacti – 1 шт;
  • Локальная сеть – 1 шт.

В нашем примере мы используем Cacti 0.8.8f, установленный на Ubuntu Server 16.04.3 LTS. Для получения информации по настройке системы мониторинга Cacti можно обратиться к официальной документации. В нашем блоге также есть статьи по настройке интеграции устройств NetPing с системой мониторинга Cacti:

Настройка устройств NetPing

Для отправки SMS-уведомлений в нашем случае необходимо выполнить всего лишь часть базовой настройки (настроить сетевые параметры для доступа по сети) устройств NetPing SMS, UniPing server solution v4/SMSUniPing server solution v3/SMS, NetPing 8/PWR-220 v3/SMS и установить рабочую SIM карту с положительным балансом в разъём встроенного GSM модема. Прочитать про базовую и дополнительную настройку устройств можно в следующей документации:

Реализация отправки e-mail уведомлений от системы мониторинга Cacti

Для того, чтобы получить возможность отправлять оповещения от системы мониторинга Cacti необходимо установить дополнительные плагины. Нам понадобятся два плагина:

  • Settings – модуль настроек для плагинов, без него плагины не будут работать.
  • Thold - плагин для оповещения при достижении критических значений параметров устройства.

Чтобы установить плагин, нужно скачать архив с плагином с официального сайта Cacti и распаковать в директорию /usr/share/cacti/site/plugins/. После распаковки плагинов переходим в web-интерфейс системы мониторинга Cacti. В левом меню страницы выбираем пункт «Plugin Management» (1) и устанавливаем плагины. В основной части web-страницы последовательно нажимаем кнопки «Install Plugin» и «Enable Plugin» в столбце «Action» (2). Кнопка «Enable plugin» становится доступна после установки плагина.

Cacti установка плагинов

После установки плагинов переходим в раздел «Settings» (1) с помощью меню в левой части страницы. В этом разделе должны появится две новые вкладки «Thresholds» и «Mail/DNS»

Cacti настройка SMTP

На вкладке Mail/DNS (2) нужно заполнить следующие поля:

Test Email – указываем любой e-mail адрес для тестирования отправки e-mail уведомлений;
Mail Services – указываем «PHP mail() function»;
From E-mail Address – указываем адрес отправителя e-mail уведомления. В нашем примере cacti@netping.ru;
From Name – указываем имя отправителя e-mail уведомления. В нашем примере Cacti;
Word Wrap – количество символов в строке письма, можно оставить по умолчанию.
Sendmailзначение заполняется по умолчанию, В нашем примере мы используем для отправки локальный Sendmail сервер. Подробнее о развёртывании и настройке Sendmail можно прочитать здесь;
SMTP Optionsзаполняется при использовании стороннего SMTP сервера;
DNS Options – указываем IP адреса первичного и вторичного DNS серверов. DNS Timeout можно оставить по умолчанию.

После заполнения всех полей нажимаем кнопку «Save» (3) внизу страницы. Затем тестируем настройки нажатием ссылки «Send a Test Email» (4). Если все настройки правильные, получаем сообщение об успешной отправке тестового e-mail во всплывающем окне:

Cacti сообщение об успешной тестовой отправке письма

Теперь переходим на вкладку «Thresholds». Все настройки на странице можно оставить по умолчанию, для дальнейшей настройки отправки SMS нам нужно активировать чек бокс «Send Alerts as Text»:

 Cacti настройка Thresholds

Сохраняем настройки нажатием кнопки «Save».

Следующим шагом создадим контакт-лист для отправки уведомлений: Переходим в раздел «Notification Lists» (1) с помощью меню в левой части страницы. На открывшейся странице нажимаем ссылку «Add» (2) вверху справа:

Cacti создание контакт-листа

И заполняем поля в открывшейся форме:

Cacti заполнение формы контакт-листа

где:
Name – название контакт-листа. В нашем примере «List_1»;
Description – описание контакт-листа;
Email Addresses – список e-mail адресов. Здесь также укажем номер телефона для отправки SMS-уведомлений.

Нажимаем кнопку «Create» для создания контакт-листа.

Теперь настроим уведомления Thresholds для датчика температуры. Переходим в раздел «Threshold Templates» с помощью меню в левой части страницы. На открывшейся странице нажимаем ссылку «Add» (2) вверху справа:

Cacti переход в раздел Threshold Templates

Заполняем поля открывшейся формы, как на скриншоте, и нажимаем кнопку «Create»:

Cacti создание шаблона

На следующей странице заполняем поля:

Cacti заполнение свойств шаблона

Template Name – название шаблона. В нашем примере «Thold_Temperature»;
High Warning Threshold – верхний порог для предупреждения. В нашем примере предупреждение будет выдаваться при превышении температуры 30°C;
Low Warning Threshold – нижний порог для предупреждения. Предупреждение будет выдаваться при понижении температуры ниже 10°C;
High Threshold – верхний порог для тревоги. Тревога будет срабатывать при превышении температурой 40°C;
Low Threshold – нижний порог для тревоги. Тревога будет срабатывать при понижении температуры ниже 5°C;
Warning Notification List – контакт лист для получения предупреждения. Выбираем из списка ранее созданный «List_1»;
Alert Notification List – контакт лист для получения уведомления о тревоге. Выбираем из списка ранее созданный «List_1»;
Alert Emails – текст уведомления о тревоге. Кириллица не поддерживается системой Cacti;
Warning Emails – текст предупреждения. Кириллица не поддерживается системой Cacti.

Остальные поля можно оставить по умолчанию. Подтверждаем внесённые изменения нажатием кнопки «Save».

Следующим шагом нужно применить шаблон Threshold к графикам температуры. Переходим в раздел «Graph Management» (1) с помощью меню в левой части страницы. На открывшейся странице выбираем график температуры устройства UniPing server solution v3/SMS, который ранее настроили, следуя рекомендациям этой статьи. Помечаем нужный график активацией чек бокса (2). Из списка внизу страницы выбираем пункт «Create Threshold from Template» (3) и нажимаем кнопку «Go» (4):

Cacti выбор графика температуры

В открывшейся форме из списка выбираем ранее созданный шаблон Threshold – «Thold_Temperature» и нажимаем кнопку «Continue»:

Cacti применение Threshold шаблона к графику температуры

Готово! После выполнения всех вышеприведённых настроек на e-mail администратора системы, который мы указали в контакт листе будут приходить предупреждения о приближении температуры к пороговым значениям и уведомления об отклонении температуры от нормы.

Реализация отправки SMS-оповещений от системы мониторинга Cacti

Теперь научим Cacti отправлять SMS-оповещения при помощи устройства NetPing SMS. Правим код файла /usr/local/share/cacti/plugins/thold/thold_functions.php. Ищем строку «function thold_mail($to, $from, $subject, $message, $filename, $headers = '') {». Нам нужно добавить в код этой функции работу с SMS. Заменяем весь код функции «function thold_mail» на следующий:

function thold_mail($to, $from, $subject, $message, $filename, $headers = '') {

               

                global $config;

               

                if (strpos($to, '@') === false){

                               $sms = true;

                               $mail = false;

                }else{

                               $sms = false;

                               $mail = true;

                }

/* Укажите IP адрес, логин и пароль для доступа к устройству NetPing */    

                $ip_server = '192.168.0.100';

                $login = 'visor';

                $pass = 'ping';

               

                $phone = trim(strip_tags($to));

                $msg_sms = trim(strip_tags($subject));

                             

                if ($sms == true){

                                                          

                               $ch = curl_init("http://". $ip_server ."/sendsms.cgi?utf8");

                               curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

                               curl_setopt($ch, CURLOPT_HEADER, false);

                               curl_setopt($ch, CURLOPT_TIMEOUT, 60);

                               curl_setopt($ch, CURLOPT_AUTOREFERER, false);

                               curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

                               curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

                               curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

                               curl_setopt($ch, CURLOPT_POST, true);

                               curl_setopt($ch, CURLOPT_POSTFIELDS, "[". $phone ."] ". $msg_sms );

                               curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

                               curl_setopt($ch, CURLOPT_USERPWD, $login . ":" . $pass);

                               curl_exec($ch);

                               curl_close($ch);                 

                              

                               return '';

                              

                }

               

                if ($mail == true){

               

                               thold_debug('Preparing to send email');

                               include_once($config['base_path'] . '/plugins/settings/include/mailer.php');

                               include_once($config['base_path'] . '/plugins/thold/setup.php');


                               $subject = trim($subject);


                               $message = str_replace('<SUBJECT>', $subject, $message);


                               $how = read_config_option('settings_how');

                               if ($how < 0 && $how > 2)

                                               $how = 0;

                               if ($how == 0) {

                                               $Mailer = new Mailer(array(

                                                               'Type' => 'PHP'));

                               } else if ($how == 1) {

                                               $sendmail = read_config_option('settings_sendmail_path');

                                               $Mailer = new Mailer(array(

                                                               'Type' => 'DirectInject',

                                                               'DirectInject_Path' => $sendmail));

                               } else if ($how == 2) {

                                               $smtp_host = read_config_option('settings_smtp_host');

                                               $smtp_port = read_config_option('settings_smtp_port');

                                               $smtp_username = read_config_option('settings_smtp_username');

                                               $smtp_password = read_config_option('settings_smtp_password');


                                               $Mailer = new Mailer(array(

                                                               'Type' => 'SMTP',

                                                               'SMTP_Host' => $smtp_host,

                                                               'SMTP_Port' => $smtp_port,

                                                               'SMTP_Username' => $smtp_username,

                                                               'SMTP_Password' => $smtp_password));

                               }


                               if ($from == '') {

                                               $from = read_config_option('thold_from_email');

                                               $fromname = read_config_option('thold_from_name');

                                               if ($from == '') {

                                                               if (isset($_SERVER['HOSTNAME'])) {

                                                                               $from = 'Cacti@' . $_SERVER['HOSTNAME'];

                                                               } else {

                                                                               $from = 'Cacti@localhost';

                                                               }

                                               }

                                               if ($fromname == '')

                                                               $fromname = 'Cacti'; $from = $Mailer->email_format($fromname, $from);

                                               if ($Mailer->header_set('From', $from) === false) {

                                                               print 'ERROR: ' . $Mailer->error() . "\n";

                                                               return $Mailer->error();

                                               }

                               } else {

                                               $from = $Mailer->email_format('Cacti', $from);

                                               if ($Mailer->header_set('From', $from) === false) {

                                                               print 'ERROR: ' . $Mailer->error() . "\n";

                                                               return $Mailer->error();

                                               }

                               }


                               if ($to == '')

                                               return 'Mailer Error: No <b>TO</b> address set!!<br>If using the <i>Test Mail</i> link, please set the <b>Alert e-mail</b> setting.';

                               $to = explode(',', $to);


                               foreach($to as $t) {

                                               if (trim($t) != '' && !$Mailer->header_set('To', $t)) {

                                                               print 'ERROR: ' . $Mailer->error() . "\n";

                                                               return $Mailer->error();

                                               }

                               }


                               $wordwrap = read_config_option('settings_wordwrap');

                               if ($wordwrap == '')

                                               $wordwrap = 76;

                               if ($wordwrap > 9999)

                                               $wordwrap = 9999;

                               if ($wordwrap < 0)

                                               $wordwrap = 76;


                               $Mailer->Config['Mail']['WordWrap'] = $wordwrap;


                               if (! $Mailer->header_set('Subject', $subject)) {

                                               print 'ERROR: ' . $Mailer->error() . "\n";

                                               return $Mailer->error();

                               }


                               if (is_array($filename) && !empty($filename) && strstr($message, '<GRAPH>') !==0) {

                                               foreach($filename as $val) {

                                                               $graph_data_array = array('output_flag'=> RRDTOOL_OUTPUT_STDOUT);

                                                               if (function_exists('imagecreatefrompng') && function_exists('imagejpeg')) {

                                                                               $data = @png2jpeg(rrdtool_function_graph($val['local_graph_id'], $val['rra_id'], $graph_data_array));

                                                                               $ext = 'jpg';

                                                               } else {

                                                                               $data = @rrdtool_function_graph($val['local_graph_id'], $val['rra_id'], $graph_data_array);

                                                                               $ext = 'png';

                                                               }

                                                               if ($data != '') {

                                                                               $cid = $Mailer->content_id();

                                                                               if ($Mailer->attach($data, $val['filename'].".$ext", "image/$ext", 'inline', $cid) == false) {

                                                                                              print 'ERROR: ' . $Mailer->error() . "\n";

                                                                                              return $Mailer->error();

                                                                               }

                                                                               $message = str_replace('<GRAPH>', "<br><br><img src='cid:$cid'>", $message);

                                                               } else {

                                                                               $message = str_replace('<GRAPH>', "<br><img src='" . $val['file'] . "'><br>Could not open!<br>" . $val['file'], $message);

                                                               }

                                               }

                               }

                               $text = array('text' => '', 'html' => '');

                               if ($filename == '') {

                                               $message = str_replace('<br>', "\n", $message);

                                               $message = str_replace('<BR>', "\n", $message);

                                               $message = str_replace('</BR>', "\n", $message);

                                               $text['text'] = strip_tags($message);

                               } else {

                                               $text['html'] = $message . '<br>';

                                               $text['text'] = strip_tags(str_replace('<br>', "\n", $message));

                               }


                               $v = thold_version();

                               $Mailer->header_set('X-Mailer', 'Cacti-Thold-v' . $v['version']);

                               $Mailer->header_set('User-Agent', 'Cacti-Thold-v' . $v['version']);

                               if (read_config_option('thold_email_prio') == 'on') {

                                               $Mailer->header_set('X-Priority', '1');

                               }

                               thold_debug("Sending email to '" . trim(implode(',',$to),',') . "'");

                               if ($Mailer->send($text) == false) {

                                               print 'ERROR: ' . $Mailer->error() . "\n";

                                               return $Mailer->error();

                               }


                               return '';

               

                }

}

Готовый файл можно скачать здесь. Не забудьте указать свои данные для подключения к устройству NetPing SMS. Функция автоматически отличает e-mail от номера телефона и, в зависимости от этого, отправляет SMS или e-mail уведомление.

В результате администратор системы будет получать SMS-сообщения о приближении к пороговым значениям и/или превышении пороговых значений от системы мониторинга Cacti.

Образец SMS-уведомлений от Cacti


  • Устройство UniPing server solution v3/SMS
  • Устройство UniPing server solution v4/SMS
  • Устройство NetPing 8/PWR-220 v3/SMS
  • Устройство NetPing SMS

Основные теги


Каталог устойств мониторинг серверных комнат и шкафов
Все устройства
Устройство UniPing v3
Устройство UniPing server solution v3/SMS
Устройство NetPing 2/PWR-220 v1/SMS
Устройство NetPing IO v2
Устройства NetPing
Каталог датчиков для устройств NetPing
Устройство NetPing 8/PWR-220 v3/SMS
Устройство NetPing 2/PWR-220 v3/ETH
Устройство NetPing 2/PWR-220 v2/SMS
Устройство NetPing 4/PWR-220 v3/SMS
Устройство NetPing SMS
Устройство NetPing /PWR-220 v3/ETH
Адаптер WiFi VAP11N
Коммутатор PS104GT
Устройство NetPing Mini-UPS
Коммутатор NP-SM4
Сплиттер POE 12В (стандарта 802.3af)
IRC-TR v2 (ИК модуль расширения)
Каталог устройств удалённого управления и распределения электропитания NetPing
Устройство UniPing server solution
Устройство UniPing server solution v3
Датчик разбития стекла (Стекло-3 ИО 329-4), 2м
Переходник для NetPing IO v2
Устройство NetPing PWR68-01
Датчик мониторинга 220В 1-wire
Адаптер DKST910.8
Устройство NetPing DKST61-01
Блок питания 48В 1,5А (мод.HRS20005)
Датчик температуры TS, 1м
Датчик температуры, (T811), 2м
Датчик температуры WT, 1м
Датчик протечки, модель 2605, 2м
Датчик протечки H2О
Датчик температуры 1-wire, (THS), 2м
МАЯК-12-СТ
Датчик движения (PYRONIX COLT QUAD PI ПИК детектор), 2м
Датчик движения (SWAN-QUAD ИК детектор квадросенсор), (2м)
BM8070D Силовое реле 16А/250В на DIN-рейку
MP701 Исполнительный элемент (4 независимых канала по 2 кВт 10А)
Датчик дыма комбинированный (дым/тепло) ИП 212/101-2М-A1R с базой Е412NL
МОЛЛЮСК-12/1,5
Внешний ИБП SKAT-12DC-1.0 Li-ion
ИКС-1 извещатель охранный инфракрасный активный однолучевой
Датчик охранный (Извещатель охранный ИО102-20/Б2П, 2м)
Блок розеток SNR-PDU-08S-1
Устройство NetPing 2/PWR-220 v4/SMS
Устройство UniPing server solution v4/SMS
▼ Все теги
Новинки
Устройство UniPing server solution v4/SMS
Устройство удалённого мониторинга датчиков по сети Ethernet/Internet. Позволяет удалённо получать информацию подробнее...

Цена: 23 870 руб.

Устройство NetPing 2/PWR-220 v4/SMS
Устройство удалённого управления розетками электропитания по сети Ethernet/Internet (IP PDU) c поддержкой подробнее...

Цена: 12 955 руб.

Датчик воздушного потока (модель АМС520)
Датчик воздушного потока позволяет контролировать наличие или отсутствие напора воздушного потока. Содержит подробнее...

Цена: 2 846 руб.

ИКС-1 извещатель охранный инфракрасный активный однолучевой
Извещатель предназначен для регистрации пересечения нарушителями контролируемой зоны, образованной оптическим подробнее...

Цена: 3 854 руб.

Внешний ИБП SKAT-12DC-1.0 Li-ion
Малогабаритный источник бесперебойного питания (ИБП) со встроенной Li-Ion АКБ. Для питания устройств подробнее...

Цена: 3 200 руб.

МОЛЛЮСК-12/1,5
Малогабаритный блок питания с выходным напряжением 12 В. Имеет уникальный корпус, который позволяет подробнее...

Цена: 950 руб.

Датчик дыма комбинированный (дым/тепло) ИП 212/101-2М-A1R с базой Е412NL
Комбинированный извещатель предназначен для обнаружения возгораний в помещениях различных зданий и сооружений подробнее...

Цена: 2 098 руб.

MP701 Исполнительный элемент (4 независимых канала по 2 кВт 10А)
Силовой модуль коммутации предназначен для обеспечения управления при помощи устройств NetPing силовыми подробнее...

Цена: 1 400 руб.

BM8070D Силовое реле 16А/250В на DIN-рейку
Блок реле для удалённой коммутации мощной нагрузки при помощи устройств NetPing. Изготавливается в корпусе подробнее...

Цена: 1 350 руб.

Датчик движения (SWAN-QUAD ИК детектор квадросенсор), (2м)
Пассивный инфракрасный детектор движения позволяет регистрировать любое движение в зоне до 18 метров. подробнее...

Цена: 1 516 руб.

МАЯК-12-СТ
Оповещатель охранно-пожарный световой стробоскопический предназначен для выдачи световых стробоскопических подробнее...

Цена: 385 руб.

Датчик протечки H2О
Датчик протечки позволяет определить наличие воды в точке установки датчика. Устанавливается в нескольких подробнее...

Цена: 1 450 руб.

-+ руб. руб.
Итого руб.

Данные о заказе