Системные уведомления в группу Telegram

Сегодня я расскажу, как сделать небольшой комплекс по приему и отправки сообщений от различных сервисов (nagios, zabbix и пр.) в группу Телеграма.

В двух словах. На пограничном сервере живет маленький скрипт — бот телеграмма. Он умеет принимать данные тремя способами

  • либо по почте сообщения (от тех сервисов, что иначе не умеют слать уведомления). Затем выбирая, что необходимо
  • Из параметров командной строки, если его запустили локально
  • По сети, то что пришло откуда-то из вне

Изначально планировалось писать полнофункционального бота, но нам нужен лишь метод SendMessage, поэтому решено было обойтись одной строкой которая делает POST, и шлет наше сообщение в JSON, все согласно API .

Бот добавлен в нашу группу, как администратор. И радует нас своими сообщениями.

Как создать бота, я не буду рассказывать, это я уже говорил пару статей назад. Могу лишь сказать, что сам бот, это в итоге, простейший постинг данных. Где в $token{‘bot’} лежит токен бота, в $groupid — номер группы где бот живет.

Теперь расскажу, о каждом из способом чуть более подробно.

Чтение данных из входящего письма

  • делаем почтовый алиас на скрипт
  • в скрипте читаем stdin
  • берем что надо, отправляем в телеграмм.

&nbsp

Чтение данных из командной строки

Тут можно ничего не писать, читаете @ARGV массив и дальше по накатанной.

Чтение данных из сети

Вот тут, я думал сделать простенький сервер, который будет слушать какойто порт, принимать данные и скармливать скрипту. Но лень не дала это сделать. Отдельный демон, отдельная реализация, опять же автозапуск городить, дружить с systemd/initd. Решил подрядить на это старый, и забытый всеми xinetd.

Ставим

yum install xinetd -y && systemctl enable xinetd

Придумаваем порт и записываем его в /etc/services

tlgrmBotSocket 11234/tcp # Socket for Informer Telegram Bot

Разрешаем этот порт в фаерволе, если он у вас есть.

Пишем модуль для xinetd — /etc/xinetd.d/tlgrmBotSocket

service tlgrmBotSocket
{
    enable = yes
    protocol = tcp 
    port = 11234
    wait = no 
    user = nobody
    server = /opt/bot.pl
    server_args = tcpinformer
}

Синтаксис простой, server_args вам даже не надо будет, у меня скрипт по этому аргументу понимает, что дальше идет поток из сети.
В самом скрипте бота

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

Как использовать. К примеру для nagios — уведомления отправляются вот таким образом

echo 'Alert Message from MegaServer' | nc 192.168.22.22 11234

В общем, любой stdout поток можно отправить туда. Стыкуется с любыми системами и скриптами.

Из перловых сриптов шлю вот так

Очень просто. Выглядит как-то так

screenshot_2016-09-23-10-59-18