Source: Freelock Computing, Open Source For Business Solutions Blog

Freelock Computing, Open Source For Business Solutions Blog Post Nagios/Icinga alerts to a Matrix room

We just added Matrix notifications to an old Icinga server we have, because why not? We love having everything in Matrix...To get this done, we borrowed heavily from this post.First of all, the script. This is what sends the actual message to a Matrix room:#!/bin/bash # /usr/local/bin/matrix-icinga.sh # Pipe the message to send into stdin # Matrix items: MX_TOKEN=[Set token for a Matrix user here] MX_SERVER=https://[Your matrix server url] MX_ROOM=[Matrix room ID, not alias] MX_TXN="`date "+%s"`$(( RANDOM % 9999 ))" warn_ico="⚠" error_ico="❌" ok_ico="" question_ico="❓" #Set the message icon based on service state # For nagios, replace ICINGA_ with NAGIOS_ to get the environment variables from Nagios if [ "$ICINGA_HOSTSTATE" = "UP" ] then ICON=$ok_ico elif [ "$ICINGA_HOSTSTATE" = "DOWN" ] then ICON=$error_ico fi if [ "$ICINGA_SERVICESTATE" = "UNKNOWN" ] then ICON=$question_ico elif [ "$ICINGA_SERVICESTATE" = "OK" ] then ICON=$ok_ico elif [ "$ICINGA_SERVICESTATE" = "WARNING" ] then ICON=$warn_ico elif [ "$ICINGA_SERVICESTATE" = "CRITICAL" ] then ICON=$error_ico fi MY_HOSTNAME=`hostname` read message while read line; do message="${message}\n${line}" done BODY="${ICON} HOST: ${ICINGA_HOSTNAME} SERVICE: ${ICINGA_SERVICEDISPLAYNAME} \ MESSAGE: ${ICINGA_SERVICEOUTPUT} ${ICINGA_HOSTOUTPUT} \ https://${MY_HOSTNAME}/cgi-bin/icinga/status.cgi?host=${ICINGA_HOSTNAME} ${message}" # Post into maint room curl -X PUT --header 'Content-Type: application/json' --header 'Accept: application/json' -d "{ \"msgtype\": \"m.text\", \"body\": \"$BODY\" }" "$MX_SERVER/_matrix/client/unstable/rooms/$MX_ROOM/send/m.room.message/$MX_TXN?access_token=$MX_TOKEN" ... Next, set up the commands for host and service notifications. On our system, commands are in /etc/icinga/commands.cfg.############################### # Matrix notifications ############################### # 'notify-service-by-matrix' command definition define command { command_name notify-service-by-matrix command_line /usr/bin/printf "%b" "Notification Type: $NOTIFICATIONTYPE$ State: $SERVICESTATE$ \ Date/Time: $LONGDATETIME$" | /usr/local/bin/matrix_icinga.sh $NOTIFICATIONTYPE$ >> /tmp/matrix.log } # 'notify-host-by-matrix' command definition define command { command_name notify-host-by-matrix command_line /usr/bin/printf "%b" "Notification Type: $NOTIFICATIONTYPE$\n\nState: \ $HOSTSTATE$\nDate/Time: $LONGDATETIME$\n" | /usr/local/bin/matrix_icinga.sh $NOTIFICATIONTYPES$ \ >> /tmp/matrix.log }Next, add a "Matrix" contact. In our system, this is in /etc/icinga/objects/contacts_icinga.cfg:define contact { contact_name matrix alias Matrix service_notification_period 24x7 host_notification_period 24x7 service_notification_options w,u,c,r host_notification_options d,r service_notification_commands notify-service-by-matrix host_notification_commands notify-host-by-matrix } Finally, add to an active contact group to finish the setup. In our system, using check_mk, this ended up being /etc/icinga/objects/check_mk/check_mk_templates.cfg:define contactgroup { contactgroup_name check_mk alias check_mk dummy contact group members check_mk,matrix } After updating check_mk and reloading, notifications now deliver to the Matrix room!Tags: Tech bitMatrixIcingaNagiosStory Type: Dev Cornerselection_393.png

Read full article »
Est. Annual Revenue
$100K-5.0M
Est. Employees
1-25