- NetPing
- >
- Блог
- >
- Примеры применения
- >
- SMS шлюз для Cacti
SMS шлюз для Cacti
Cacti – open-source web-приложение, система позволяет строить графики при помощи RRDtool. Cacti собирает статистические данные за определённые временные интервалы и позволяет отобразить их в графическом виде. Преимущественно используются стандартные шаблоны для отображения статистики по загрузке процессора, выделению оперативной памяти, количеству запущенных процессов, использованию входящего/исходящего трафика. По сути Cacti является только оболочкой для визуализации накопленных данных мониторинга – рисования графиков. В этой статье мы рассмотрим вариант расширения функционала Cacti для отправки SMS-сообщений о событиях мониторинга (SMS шлюз для Cacti). Для отправки SMS можно использовать следующие устройства компании NetPing:
- шлюз для отправки и приёма SMS-сообщений NetPing SMS;
- устройство мониторинга микроклимата серверных комнат UniPing server solution v4/SMS или UniPing server solution v3/SMS;
- устройство удалённого управления электропитанием (IP power distribution unit) для серверного оборудования NetPing 8/PWR-220 v3/SMS
Это позволит значительно сэкономить на услугах сторонних сервисов SMS-рассылки, потому что в таком случае стоимость SMS будет соответствовать тарифу вашего сотового оператора без дополнительных комиссий.
Требования к оборудованию
- Устройство NetPing перечисленное выше с установленной SIM картой – 1 шт;
- ПК/сервер с OC Ubuntu и установленной на нём системой мониторинга Cacti – 1 шт;
- Локальная сеть – 1 шт.
В нашем примере мы используем Cacti 0.8.8f, установленный на Ubuntu Server 16.04.3 LTS. Для получения информации по настройке системы мониторинга Cacti можно обратиться к официальной документации. В нашем блоге также есть статьи по настройке интеграции устройств NetPing с системой мониторинга Cacti:
- Отображение графиков температуры в системе мониторинга Cacti;
- Cacti + NetPing рисуем графики температуры.
Настройка устройств NetPing
Для отправки SMS-уведомлений в нашем случае необходимо выполнить всего лишь часть базовой настройки (настроить сетевые параметры для доступа по сети) устройств NetPing SMS, UniPing server solution v4/SMS, UniPing server solution v3/SMS, NetPing 8/PWR-220 v3/SMS и установить рабочую SIM карту с положительным балансом в разъём встроенного GSM модема. Прочитать про базовую и дополнительную настройку устройств можно в следующей документации:
- NetPing SMS - описание встроенного ПО;
- UniPing server solution v4/SMS и UniPing server solution v3/SMS - описание встроенного ПО;
- NetPing 8/PWR-220 v3/SMS - описание встроенного ПО.
Реализация отправки 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» становится доступна после установки плагина.
После установки плагинов переходим в раздел «Settings» (1) с помощью меню в левой части страницы. В этом разделе должны появится две новые вкладки «Thresholds» и «Mail/DNS»:
На вкладке 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 во всплывающем окне:
Теперь переходим на вкладку «Thresholds». Все настройки на странице можно оставить по умолчанию, для дальнейшей настройки отправки SMS нам нужно активировать чек бокс «Send Alerts as Text»:
Сохраняем настройки нажатием кнопки «Save».
Следующим шагом создадим контакт-лист для отправки уведомлений: Переходим в раздел «Notification Lists» (1) с помощью меню в левой части страницы. На открывшейся странице нажимаем ссылку «Add» (2) вверху справа:
И заполняем поля в открывшейся форме:
где:
Name – название контакт-листа. В нашем примере «List_1»;
Description – описание контакт-листа;
Email Addresses – список e-mail адресов. Здесь также укажем номер телефона для отправки SMS-уведомлений.
Нажимаем кнопку «Create» для создания контакт-листа.
Теперь настроим уведомления Thresholds для датчика температуры. Переходим в раздел «Threshold Templates» с помощью меню в левой части страницы. На открывшейся странице нажимаем ссылку «Add» (2) вверху справа:
Заполняем поля открывшейся формы, как на скриншоте, и нажимаем кнопку «Create»:
На следующей странице заполняем поля:
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):
В открывшейся форме из списка выбираем ранее созданный шаблон Threshold – «Thold_Temperature» и нажимаем кнопку «Continue»:
Готово! После выполнения всех вышеприведённых настроек на 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.

Цена: 6 200 руб.

Цена: 2 500 руб.

Цена: 20 280 руб.

Цена: 20 280 руб.

Цена: 10 980 руб.

Цена: 8 580 руб.

Цена: 18 000 руб.

Цена: 26 000 руб.

Цена: 1 429 руб.

Цена: 3 354 руб.

Цена: 2 240 руб.

Цена: 1 400 руб.

Цена: 8 157 руб.

Цена: 15 700 руб.

Цена: 1 224 руб.

Цена: 6 700 руб.

Цена: 3 800 руб.