Sending Icinga 2 notifications via Telegram!
Find a file
2020-10-25 21:26:14 +01:00
contrib contrib: provide sample baskets 2020-04-09 15:20:13 +02:00
img Added screenshot of my changes 2020-10-25 21:26:14 +01:00
host-by-telegram.sh Clarify Copyright declaration 2020-06-22 12:44:57 +02:00
LICENSE Initial commit 2018-01-29 10:25:07 +01:00
README.md Clarify Copyright declaration 2020-06-22 12:44:57 +02:00
service-by-telegram.sh Clarify Copyright declaration 2020-06-22 12:44:57 +02:00

Notification by Telegram

Sending Icinga 2 notifications via Telegram!

Special thanks to contributing steadfasterX and Tom :-)

Preparing

Create your bot

Obviously you need a bot to begin:

Follow the official Telegram guide and do not forget to grab your bot API TOKEN (referred to here as BOTTOKEN) afterwards

Get your chat_id(s)

You can notify a specific TG user account or throw a message to a TG group.

In order to do so you need to know the corresponding (hidden) ID also called chat_id (-q TELEGRAM_CHATID).

If you want to notify a group/channel:

  1. Add your bot to that group/channel

  2. Send with your favorite client a simple mention msg to your bot (e.g. hi @mybot)

  3. Catch updates for your bot: curl https://api.telegram.org/bot<BOTTOKEN>/getUpdates

  4. Review the output, an example below:

    "message":{"message_id":91, "from":{"id":123456789, "is_bot":false,"first_name":"foo","username":"foobar","language_code":"de"}, "chat":{"id":-987654321, "title":"","type":"group","all_members_are_administrators":true},"date":1563547428,"group_chat_created":true}}]}`

    There are 2 important parts here:

    • a) "from":{"id":123456789 which is the unique user/chat_id of the user who sends a message to your bot (required to send to a notify to that person directly)
    • b) "chat":{"id":-987654321 which is the unique group/channel id of the group where the message has been sent

If you do not want to notify a group i.e. just a direct user notification:

  1. Do the same as above, just at step 1 make a direct message to your bot instead
  2. As you have done a direct message you will only get a "from" id which is all you need here

Examples

Testing a notification

Sending a test notification replace the token, botname and chat id obviously.

sudo -u nagios ./service-by-telegram.sh -4 127.0.0.1 \
-l myhostname \
-o testingTGnotifiy \
-p <myBotname> \
-q <myGroupChatId> \
-r "<1234134325:blafasel>" \
-s CRITICAL \
-c mycomment \
-b mycommentuser \
-i https://myicingaserver/icingaweb2 \
-n maaaaaaaaaaa \
-d"$(date +%F-%T)" \
-e serviceshort \
-u fullservicename \
-D

Icinga2 objects

Example host objects

Example host template
template Host "Generic Host Template" {
  check_command = "hostalive"
  max_check_attempts = "3"
  check_interval = 1m
  retry_interval = 1m
  check_timeout = 30s
  enable_notifications = true
  enable_active_checks = true
  enable_passive_checks = true
  enable_event_handler = true
  enable_flapping = true
  enable_perfdata = true
  volatile = false
  vars.notification_type = "Telegram"
}
Example host object
object Host "icinga2-master" {
    import "Generic Host Template"
    address = "127.0.0.1"
}

Example user templates

Generic user template
template User "Generic User Template" {
    enable_notifications = true
}
User "telegram_bot"
object User "telegram_bot" {
    import "Generic User Template"

    display_name = "Bot via Telegram"
    email = "you@yourdomain.tld"
    states = [ Critical, Down, OK, Unknown, Up, Warning ]
    types = [ Custom, Problem, Recovery ]
}

Example command definitions

Notification Command: Hosts by Telegram
object NotificationCommand "Notify Host By Telegram" {
    import "plugin-notification-command"
    command = [ "/etc/icinga2/scripts/host-by-telegram.sh" ]
    arguments += {
        "-4" = {
            required = true
            value = "$address$"
        }
        "-6" = "$address6$"
        "-b" = "$notification.author$"
        "-c" = "$notification.comment$"
        "-d" = {
            required = true
            value = "$icinga.long_date_time$"
        }
        "-i" = "$icingaweb2url$"
        "-l" = {
            required = true
            value = "$host.name$"
        }
        "-n" = "$host.display_name$"
        "-o" = {
            required = true
            value = "$host.output$"
        }
        "-p" = {
            required = true
            value = "$telegram_bot$"
        }
        "-q" = {
            required = true
            value = "$telegram_chatid$"
        }
        "-r" = {
            required = true
            value = "$telegram_bottoken$"
        }
        "-s" = {
            required = true
            value = "$host.state$"
        }
        "-t" = {
            required = true
            value = "$notification.type$"
        }
        "-v" = "$telegram_notification_logtosyslog$"
    }
}
Notification Command: Services by Telegram
object NotificationCommand "Notify Service By Telegram" {
    import "plugin-notification-command"
    command = [ "/etc/icinga2/scripts/service-by-telegram.sh" ]
    arguments += {
        "-4" = {
            required = true
            value = "$address$"
        }
        "-6" = "$address6$"
        "-b" = "$notification.author$"
        "-c" = "$notification.comment$"
        "-d" = {
            required = true
            value = "$icinga.long_date_time$"
        }
        "-e" = {
            required = true
            value = "$service.name$"
        }
        "-i" = "$icingaweb2url$"
        "-l" = {
            required = true
            value = "$host.name$"
        }
        "-n" = "$host.display_name$"
        "-o" = {
            required = true
            value = "$service.output$"
        }
        "-p" = {
            required = true
            value = "$telegram_bot$"
        }
        "-q" = {
            required = true
            value = "$telegram_chatid$"
        }
        "-r" = {
            required = true
            value = "$telegram_bottoken$"
        }
        "-s" = {
            required = true
            value = "$service.state$"
        }
        "-t" = {
            required = true
            value = "$notification.type$"
        }
        "-u" = {
            required = true
            value = "$service.display_name$"
        }
        "-v" = "$telegram_notification_logtosyslog$"
    }
}

Example notification objects

Notification Template: Telegram Generic
template Notification "Template: Telegram (Generic)" {
    vars.telegram_bot = "<YOUR_TELEGRAM_BOT_NAME>"
    vars.telegram_bottoken = "<YOUR_TELEGRAM_BOT_TOKEN>"
    vars.telegram_chatid = "<YOUR_TELEGRAM_CHAT_ID>"
    vars.telegram_notification_logtosyslog = true
}
Notification Template: Host Notifications
template Notification "Template: Host Notifications via Telegram" {
    import "Template: Telegram (Generic)"

    command = "Notify Host By Telegram"
    interval = 1h
}
Notification Template: Service Notifications
template Notification "Template: Service Notifications via Telegram" {
    import "Template: Telegram (Generic)"

    command = "Notify Service By Telegram"
    interval = 4h
}

Example notification apply rules

Apply rule for host notifications
   apply Notification "Host Alert via @telegram_bot" to Host {
    import "Template: Host Notifications via Telegram"

    interval = 1h
    assign where host.vars.notification_type == "Telegram"
    states = [ Down, Up ]
    types = [ Custom, Problem, Recovery ]
    users = [ "telegram_bot" ]
}
Apply rule for service notifications
apply Notification "Service Alerts via @telegram_bot" to Service {
  import "Template: Service Notifications via Telegram"

  interval = 12h
  assign where host.vars.notification_type == "Telegram"
  users = [ "telegram_bot" ]
}

Example Director screenshot

Notifications by Telegram via Icinga Director

Icinga Director Config

License

Copyright (C) 2018 Marianne M. Spiller github@spiller.me

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.