Отсылка SMS оповещений в Icinga с помощью MultiTech MultiModem iSMS SF800-G

Sending SMS alerts to Icinga using MultiTech MultiModem iSMS SF800-GВ дополнение к ранее рассмотренной процедуре настройки SMS уведомлений из системы мониторинга Icinga, в этой заметке мы рассмотрим ещё один вариант отсылки SMS с помощью внешнего аппаратного устройства MultiTech MultiModem iSMS SF800-G 8-Port Intelligent SMS Server. Это устройство является смс-шлюзом с 8-ю встроенными GSM-модемами, общей для всех модемов очередью отправки и встроенным Web API, с помощью которого можно организовывать отправку SMS с любых сервисов и систем в локальной сети. Некоторые особенности настройки и подключения устройства MultiTech iSMS к отечественным операторам мобильной связи мы рассмотрели в отдельной статье Вики.

Итак, в ранее рассмотренном примере мы использовали GSM-модем, напрямую подключенный к COM-порту сервера мониторинга. В такой конфигурации формируемые в системе мониторинга данные SMS сообщения передавались в локальную очередь службы smstools (smsd). В случае же использования устройства MultiTech iSMS нам не нужно заморачиваться с настройкой smstools на сервере мониторинга, так как внутри iSMS есть своя очередь для отсылки сообщений. И всё что нам нужно сделать – это сформировать данные оповещения в "съедобный" для Web API iSMS формат и отправить его на специальный URL iSMS.

Когда в своё время я изучал вопрос возможностей использования iSMS в связке с Icinga, то из готовых решений удалось найти лишь старые скрипты от NETWAYS. Скрипт smsfinder.pl предполагается для мониторинга состояния устройства iSMS, а скрипт sendsms.pl - для отправки SMS с помощью устройства iSMS. После тестирования выяснилось, что smsfinder.pl не даёт нормальных возможностей мониторинга, так как скрипт позволяет проверять только лишь показатель мощности сигнала, при этом всегда смотрит только на 1 модем. То есть для мониторинга 4-х и 8-ми портовых моделей iSMS этот скрипт не будет полноценно выполнять даже свой минимум. Скрипт sendsms.pl тоже имеет свои недостатки. Например, с его помощью мне так и не удалось сделать отсылку сообщений в формате Unicode, поэтому если в SMS потребуется кириллица, то этот плагин не поможет. Кроме того, этот скрипт также не рассчитан на использование в многопортовых моделях iSMS: при отсылке SMS нет возможности указания конкретного модема, нет возможности управлять приоритезацией сообщений и т.п. В конечном итоге возникло желание сделать свой скрипт для отсылки SMS уведомлений через iSMS с учётом всех необходимых особенностей.

Для начала следует разобраться с тем, как работает отсылка SMS через интерфейс Web API в iSMS и разобраться с тем, как правильно сформировать HTTP-запрос. Основную часть вопросов может снять изучение документа "MultiModem iSMS Intelligent SMS Server - User Guide for System Administrators", в котором приведены примеры формирования HTTP-запросов для разных операций.

 

Специфика настройки MultiTech MultiModem iSMS

Первой проблемой, с которой пришлось столкнуться - при отсылке SMS сообщения с большим количеством текста устройство iSMS разбивает текст сообщения на части, отсылая каждую часть отельным сообщением, в текст которого добавляется префикс "(1of5)", "(2of5)" и т.д.. Решение этой проблемы нашлось на форуме MultiTech. Необходимо скачать последнюю экспериментальную версию микрокода 1.51.28 с FTP MultiTech по ссылке Firmware SF400_SF800 1.51.28. и провести обновление устройства iSMS. После обновления в меню "SMS Services" > "SMS Settings" включить опции "Enable PDU Mode" и "Concatenate Multipart Outbound Messages".

MultiTech MultiModem iSMS SF800-G - SMS Settings - Enable PDU Mode and Concatenate Multipart Outbound Messages

Здесь же в разделе "ASCII 7-bit Configuration" значение опции "Character Set" установим как "3GPP 23.038". Согласно рекомендации с форума MultiTech такая настройка позволит использовать в SMS сообщениях в формате ACSII дополнительные символы, такие, как возврат каретки (%0D) и перевод строки (%0A).

Кроме того, следует заменить опцию разбора URL для Web API в меню "SMS Services" > "SMS API" в разделе "HTTP API Configuration" определив параметр "Preferred Character Set" в значение "UTF-8".

MultiTech MultiModem iSMS SF800-G - HTTP API Configuration

После этого для построения URL для запроса к Web API необходимо будет использовать новый формат, не описанный в доступной на официальном сайте документации, которая относится к старой версии 1.50.7 (14.08.2012).

Если телефон получателя SMS необходимо указывать в формате +71112223344, то в URL номер телефона должен быть указан в виде to=%2B71112223344. То есть символ + заменяется на %2B.

При создании пользователя для Web API на устройстве iSMS желательно воздержаться от спецсимволов в пароле, так как пароль будет передаваться в составе URL.

Если планируется отправлять SMS сообщения, содержащие только латиницу (ASCII символы), то можно использовать следующий формат:

http://isms.holding.com:81/sendmsg?user=myuser&passwd=mYP!ssW0rd&cat=1&enc=0&priority=2&modem=0&to=%2B71112223344&text=MyText

Если же в тексте могут содержаться кириллические символы, то значение параметра "enc" следует заменить на "2", а сам текст SMS-сообщения потребуется преобразовать в Hex.

http://isms.holding.com:81/sendmsg?user=myuser&passwd=mYP!ssW0rd&cat=1&enc=2&priority=2&modem=0&to=%2B71112223344&text=41f;440;438;432;435;442

В нашем примере "41f;440;438;432;435;442" это слово "Привет" в формате Hex. Для конвертации текста в Hex в ходе тестирования можно воспользоваться онлайн-конвертором ASCII Text to Hex Code Converter.

Например, если у нас в устройстве iSMS в 2 модема установлены 2 SIM-карты, и мы хотим проверить успешность отсылки SMS сообщений через каждый из этих модемов, да ещё и с учётом кириллицы, то можем использовать 2 следующих запроса к iSMS:

http://isms.holding.com:81/sendmsg?user=myuser&passwd=mYP!ssW0rd&cat=1&enc=2&priority=2&modem=1&to=%2B71112223344&text=41F;440;43E;434;443;432;43A;430;20;43C;43E;434;435;43C;430;20;2116;31
http://isms.holding.com:81/sendmsg?user=myuser&passwd=mYP!ssW0rd&cat=1&enc=2&priority=2&modem=2&to=%2B71112223344&text=41F;440;43E;434;443;432;43A;430;20;43C;43E;434;435;43C;430;20;2116;32

То есть, с помощью параметра "modem" мы указываем номер модема, через который устройство iSMS должно выполнить отправку сообщения. Если в качестве номера модема указать "0", то сообщение попадёт в общую очередь устройства iSMS и будет отправлено через любой из незанятых модемов.

 

Плагин SMS оповещений для сервера Icinga

После того, как через устройство iSMS отработана проверочная отсылка SMS сообщений в нужном нам формате, можно переходить к подключению плагина SMS оповещений к серверу Icinga. Для этого переходим в каталог /etc/icinga2/scripts/, скачиваем скрипт с GitHub и делаем его исполняемым:

# cd /etc/icinga2/scripts
# wget https://raw.githubusercontent.com/Aleksey-Maksimov/Icinga_notification-to-iSMS/main/notification-to-isms.sh
# chmod +x notification-to-isms.sh

Прежде, чем интегрировать скрипт в Icinga Director, желательно протестировать его работу из консоли, используя поддерживаемые скриптом аргументы. Получить полный список допустимых аргументов и их описание можно командой:

# /etc/icinga2/scripts/notification-to-isms.sh --help

Чтобы базово убедиться в том, что скрипт успешно сможет отправлять SMS-сообщения, можно запустить его с набором аргументов, имеющих некие вымышленные значения. Здесь важно лишь правильно указать режим работы скрипта (--plugin-mode), корректные параметры подключения к iSMS (--isms-*) и реальный номер мобильного телефона получателя (--sms-to). Скрипт имеет 2 основных режима работы – для отправки оповещений об изменении состояния Хостов Icinga (--plugin-mode 'host-mode') и для отправки оповещений об изменении состояния Служб Icinga (--plugin-mode 'service-mode').

Выполним проверочный вызов скрипта с набором аргументов, которые будут передаваться со стороны Icinga в случае с оповещением о недоступности какого-то Хоста Icinga:

# /etc/icinga2/scripts/notification-to-isms.sh --plugin-mode 'host-mode' --notification-type 'PROBLEM' --long-datetime '2024-05-08 15:00:01' --host-displayname 'RT001' --host-address '10.10.10.5' --item-comment 'Роутер Mikrotik - Телеком.узел Соловки, стойка 5' --host-output 'PING CRITICAL - Packet loss = 100%' --notification-autor 'petya' --notification-comment 'проверка плагина 1' --sms-to '72223334455' --isms-server 'isms.holding.com:81' --isms-user 'icinga' --isms-password 'p!sSW0rD' --isms-priority '3' --isms-modem-num '0'

Проверим ещё один вызов, который будет использоваться со стороны Icinga в случае с оповещением о проблеме со Службой Icinga:

# /etc/icinga2/scripts/notification-to-isms.sh --plugin-mode 'service-mode' --notification-type 'RECOVERY' --notification-autor 'petya' --notification-comment 'проверка плагина 2' --long-datetime '2024-05-08 15:10:00' --host-displayname 'UPS011' --service-desc 'APC UPS Input Lines' --service-output "OK: voltage: 230.1 V, frequence: 50 Hz"  --item-comment "ИБП APC Smart-UPS 5000 - ЦОД, стойка 8" --sms-to "72223334455" --isms-server "isms.holding.com:81" --isms-user icinga --isms-password='p!sSW0rD' --isms-priority=2 --isms-modem-num=0

В результате этих проверочных запусков скрипта мы должны получить соответствующие SMS-оповещения.

SMS from Icinga notification script via MultiTech MultiModem iSMS SF800-G

Теперь можно переходить в веб-интерфейс Icinga Director и на базе скрипта создавать Notification Plugin Command и Notifications по аналогии с процедурой, описанной ранее.

Добавить комментарий