unify into one script

This commit is contained in:
C0rn3j 2020-06-11 23:06:53 +02:00
parent 41f83bdb06
commit 9b2ab135ea
6 changed files with 192 additions and 275 deletions

View file

@ -3,7 +3,6 @@ Sending Icinga 2 notifications via Telegram!
Special thanks to contributing [steadfasterX](https://github.com/steadfasterX) and [Tom](https://github.com/Thomas-Gelf) :-)
## Preparing
### Create your bot
@ -44,7 +43,8 @@ If you do not want to notify a group i.e. just **a direct user 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 \
sudo -u nagios ./alert-by-telegram.sh -4 127.0.0.1 \
-a service \
-l myhostname \
-o testingTGnotifiy \
-p <myBotname> \
@ -87,7 +87,7 @@ template Host "Generic Host Template" {
<details>
<summary>Example host object</summary>
```ini
object Host "icinga2-master" {
import "Generic Host Template"
@ -130,13 +130,14 @@ object User "telegram_bot" {
```ini
object NotificationCommand "Notify Host By Telegram" {
import "plugin-notification-command"
command = [ "/etc/icinga2/scripts/host-by-telegram.sh" ]
command = [ "/etc/icinga2/scripts/alert-by-telegram.sh" ]
arguments += {
"-4" = {
required = true
value = "$address$"
}
"-6" = "$address6$"
"-a" = "host"
"-b" = "$notification.author$"
"-c" = "$notification.comment$"
"-d" = {
@ -185,13 +186,14 @@ object NotificationCommand "Notify Host By Telegram" {
```ini
object NotificationCommand "Notify Service By Telegram" {
import "plugin-notification-command"
command = [ "/etc/icinga2/scripts/service-by-telegram.sh" ]
command = [ "/etc/icinga2/scripts/alert-by-telegram.sh" ]
arguments += {
"-4" = {
required = true
value = "$address$"
}
"-6" = "$address6$"
"-a" = "service"
"-b" = "$notification.author$"
"-c" = "$notification.comment$"
"-d" = {
@ -259,7 +261,7 @@ template Notification "Template: Telegram (Generic)" {
<details>
<summary>Notification Template: Host Notifications</summary>
```ini
template Notification "Template: Host Notifications via Telegram" {
import "Template: Telegram (Generic)"
@ -272,7 +274,7 @@ template Notification "Template: Host Notifications via Telegram" {
<details>
<summary>Notification Template: Service Notifications</summary>
```ini
template Notification "Template: Service Notifications via Telegram" {
import "Template: Telegram (Generic)"
@ -283,11 +285,10 @@ template Notification "Template: Service Notifications via Telegram" {
```
</details>
#### Example notification apply rules
<details>
<summary>Apply rule for host notifications</summary>
```ini
apply Notification "Host Alert via @telegram_bot" to Host {
import "Template: Host Notifications via Telegram"
@ -303,7 +304,7 @@ template Notification "Template: Service Notifications via Telegram" {
<details>
<summary>Apply rule for service notifications</summary>
```ini
apply Notification "Service Alerts via @telegram_bot" to Service {
import "Template: Service Notifications via Telegram"
@ -315,11 +316,10 @@ apply Notification "Service Alerts via @telegram_bot" to Service {
```
</details>
#### Example Director screenshot
<details>
<summary>Notifications by Telegram via Icinga Director</summary>
![Icinga Director Config](img/Telegram_Notification_in_Icinga_Director.jpg)
</details>

167
alert-by-telegram.sh Executable file
View file

@ -0,0 +1,167 @@
#!/bin/bash
set -euo pipefail
# /etc/icinga2/scripts/service-by-telegram.sh
# Marianne M. Spiller <github@spiller.me>
# Last updated 2020-06-11
# Last tests used icinga2-2.11.2-1.buster
PROG="$(basename $0)"
HOSTNAME="$(hostname)"
TRANSPORT="curl"
unset DEBUG
if [[ -z "$(command -v $TRANSPORT)" ]]; then
echo "$TRANSPORT not in \$PATH. Consider installing it."
exit 1
fi
Usage() {
cat << EOF
alert-by-telegram notification script for Icinga 2 by spillerm <github@spiller.me>
The following are mandatory:
-4 HOSTADDRESS (\$address$)
-6 HOSTADDRESS6 (\$address6$)
-a ALERTTYPE (host or service)
-d LONGDATETIME (\$icinga.long_date_time$)
-e SERVICENAME (\$service.name$ Only if ALERTTYPE is service) # TODO, currently unused
-l HOSTALIAS (\$host.name$)
-n HOSTDISPLAYNAME (\$host.display_name$)
-o SERVICEOUTPUT (\$service.output$ or \$host.output$)
-p TELEGRAM_BOT (\$telegram_bot$)
-q TELEGRAM_CHATID (\$telegram_chatid$)
-r TELEGRAM_BOTTOKEN (\$telegram_bottoken$)
-s SERVICESTATE (\$service.state$ or \$host.state$)
-t NOTIFICATIONTYPE (\$notification.type$)
-u SERVICEDISPLAYNAME (\$service.display_name$)
And these are optional:
-b NOTIFICATIONAUTHORNAME (\$notification.author$)
-c NOTIFICATIONCOMMENT (\$notification.comment$)
-i HAS_ICINGAWEB2 (\$icingaweb2url$, Default: unset)
-v (\$notification_logtosyslog$, Default: false)
-D DEBUG enable debug output - meant for CLI debug only
EOF
}
while getopts 4:6:a:b:c:d:e:f:hi:l:n:o:p:q:r:s:t:u:v:D opt; do
case "$opt" in
4) HOSTADDRESS=$OPTARG ;;
6) HOSTADDRESS6=$OPTARG ;;
a) ALERTTYPE=$OPTARG ;;
b) NOTIFICATIONAUTHORNAME=$OPTARG ;;
c) NOTIFICATIONCOMMENT=$OPTARG ;;
d) LONGDATETIME=$OPTARG ;;
e) SERVICENAME=$OPTARG ;;
h) Usage; exit 0;;
i) HAS_ICINGAWEB2=$OPTARG ;;
l) HOSTALIAS=$OPTARG ;;
n) HOSTDISPLAYNAME=$OPTARG ;;
o) SERVICEOUTPUT=$OPTARG ;;
p) TELEGRAM_BOT=$OPTARG ;;
q) TELEGRAM_CHATID=$OPTARG ;;
r) TELEGRAM_BOTTOKEN=$OPTARG ;;
s) SERVICESTATE=$OPTARG ;;
t) NOTIFICATIONTYPE=$OPTARG ;;
u) SERVICEDISPLAYNAME=$OPTARG ;;
v) VERBOSE=$OPTARG ;;
D) DEBUG=1; echo -e "\n**********************************************\nWARNING: DEBUG MODE, DEACTIVATE ASAP\n**********************************************\n" ;;
\?) echo "ERROR: Invalid option -$OPTARG" >&2
Usage; exit 1;;
:) echo "Missing option argument for -$OPTARG" >&2
Usage; exit 1;;
*) echo "Unimplemented option: -$OPTARG" >&2
Usage; exit 1;;
esac
done
if [[ ${ALERTTYPE-} != "host" ]] && [[ ${ALERTTYPE-} != "service" ]]; then
Usage
echo ""
echo "ALERTTYPE needs to be either 'host' or 'service'!"
exit 1
fi
if [[ $ALERTTYPE == "host" ]]; then
echo ""
else
if [[ -z ${SERVICENAME-} ]] || [[ -z ${SERVICEDISPLAYNAME-} ]]; then
Usage
exit 1
fi
fi
if [[ -z ${HOSTADDRESS-} ]] || [[ -z ${HOSTADDRESS6-} ]] || [[ -z ${LONGDATETIME-} ]] || [[ -z ${HOSTALIAS-} ]] \
|| [[ -z ${HOSTDISPLAYNAME-} ]] || [[ -z ${SERVICEOUTPUT-} ]] || [[ -z ${TELEGRAM_BOT-} ]] || [[ -z ${TELEGRAM_CHATID-} ]] \
|| [[ -z ${TELEGRAM_BOTTOKEN-} ]] || [[ -z ${SERVICESTATE-} ]] || [[ -z ${NOTIFICATIONTYPE-} ]]; then
Usage
exit 1
fi
## Build the message's subject
if [[ $ALERTTYPE == "host" ]]; then
SUBJECT="[$NOTIFICATIONTYPE] Host $HOSTDISPLAYNAME is $SERVICESTATE!"
else
SUBJECT="[$NOTIFICATIONTYPE] $SERVICEDISPLAYNAME on $HOSTDISPLAYNAME is $SERVICESTATE!"
fi
## Build the message itself
if [[ $ALERTTYPE == "host" ]]; then
NOTIFICATION_MESSAGE=$(cat << EOF
$HOSTDISPLAYNAME ($HOSTALIAS) is $SERVICESTATE!
When? $LONGDATETIME
Info? $SERVICEOUTPUT
Host? $HOSTALIAS
IPv4? $HOSTADDRESS
EOF
)
else
NOTIFICATION_MESSAGE=$(cat << EOF
[$SERVICESTATE] $SERVICEDISPLAYNAME is $SERVICESTATE since $LONGDATETIME
Host: $HOSTALIAS (IPv4 $HOSTADDRESS)
More info: $SERVICEOUTPUT
EOF
)
fi
## Is this host IPv6 capable?
if [ -n "$HOSTADDRESS6" ]; then
NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE
IPv6? $HOSTADDRESS6"
fi
## Are there any comments? Put them into the message!
if [ -n "${NOTIFICATIONCOMMENT-}" ] ; then
NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE
Comment by $NOTIFICATIONAUTHORNAME:
$NOTIFICATIONCOMMENT"
fi
## Are we using Icinga Web 2? Put the URL into the message!
if [ -n "${HAS_ICINGAWEB2-}" ] ; then
NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE
Get live status:
$HAS_ICINGAWEB2/monitoring/host/show?host=$HOSTALIAS"
fi
## Are we verbose? Then put a message to syslog...
if [ "${VERBOSE-}" == "true" ] ; then
logger "$PROG sends $SUBJECT => Telegram Channel $TELEGRAM_BOT"
fi
## debug output or not?
if [ -z ${DEBUG-} ]; then
CURLARGS="--silent --output /dev/null"
else
CURLARGS=-v
set -x
echo -e "DEBUG MODE!"
fi
## And finally, send the message
/usr/bin/curl $CURLARGS \
--data-urlencode "chat_id=${TELEGRAM_CHATID}" \
--data-urlencode "text=${NOTIFICATION_MESSAGE}" \
--data-urlencode "parse_mode=HTML" \
--data-urlencode "disable_web_page_preview=true" \
"https://api.telegram.org/bot${TELEGRAM_BOTTOKEN}/sendMessage"

View file

@ -9,6 +9,9 @@
"required": true,
"value": "$address$"
},
"-a": {
"value": "service"
},
"-b": {
"value": "$notification.author$"
},
@ -86,6 +89,9 @@
"required": true,
"value": "$address$"
},
"-a": {
"value": "host"
},
"-b": {
"value": "$notification.author$"
},
@ -147,4 +153,4 @@
"zone": null
}
}
}
}

View file

@ -9,6 +9,9 @@
"required": true,
"value": "$address$"
},
"-a": {
"value": "service"
},
"-b": {
"value": "$notification.author$"
},
@ -86,6 +89,9 @@
"required": true,
"value": "$address$"
},
"-a": {
"value": "host"
},
"-b": {
"value": "$notification.author$"
},

View file

@ -1,130 +0,0 @@
#!/usr/bin/env bash
## /etc/icinga2/scripts/host-by-telegram.sh / 20170330
## Marianne M. Spiller <github@spiller.me>
## Last updated 20190820
## Last tests used 2.11.2-1.buster
PROG="`basename $0`"
HOSTNAME="`hostname`"
TRANSPORT="curl"
unset DEBUG
if [ -z "`which $TRANSPORT`" ] ; then
echo "$TRANSPORT not in \$PATH. Consider installing it."
exit 1
fi
Usage() {
cat << EOF
host-by-mail notification script for Icinga 2 by spillerm <github@spiller.me>
The following are mandatory:
-4 HOSTADDRESS (\$address$)
-6 HOSTADDRESS6 (\$address6$)
-d LONGDATETIME (\$icinga.long_date_time$)
-l HOSTALIAS (\$host.name$)
-n HOSTDISPLAYNAME (\$host.display_name$)
-o HOSTOUTPUT (\$host.output$)
-p TELEGRAM_BOT (\$telegram_bot$)
-q TELEGRAM_CHATID (\$telegram_chatid$)
-r TELEGRAM_BOTTOKEN (\$telegram_bottoken$)
-s HOSTSTATE (\$host.state$)
-t NOTIFICATIONTYPE (\$notification.type$)
And these are optional:
-b NOTIFICATIONAUTHORNAME (\$notification.author$)
-c NOTIFICATIONCOMMENT (\$notification.comment$)
-i HAS_ICINGAWEB2 (\$icingaweb2url$, Default: unset)
-v (\$notification_logtosyslog$, Default: false)
-D DEBUG enable debug output - meant for CLI debug only
EOF
exit 1;
}
while getopts 4:6::b:c:d:hi:l:n:o:p:q:r:s:t:u:v:D opt
do
case "$opt" in
4) HOSTADDRESS=$OPTARG ;;
6) HOSTADDRESS6=$OPTARG ;;
b) NOTIFICATIONAUTHORNAME=$OPTARG ;;
c) NOTIFICATIONCOMMENT=$OPTARG ;;
d) LONGDATETIME=$OPTARG ;;
h) Usage ;;
i) HAS_ICINGAWEB2=$OPTARG ;;
l) HOSTALIAS=$OPTARG ;;
n) HOSTDISPLAYNAME=$OPTARG ;;
o) HOSTOUTPUT=$OPTARG ;;
p) TELEGRAM_BOT=$OPTARG ;;
q) TELEGRAM_CHATID=$OPTARG ;;
r) TELEGRAM_BOTTOKEN=$OPTARG ;;
s) HOSTSTATE=$OPTARG ;;
t) NOTIFICATIONTYPE=$OPTARG ;;
v) VERBOSE=$OPTARG ;;
D) DEBUG=1; echo -e "\n**********************************************\nWARNING: DEBUG MODE, DEACTIVATE ASAP\n**********************************************\n" ;;
\?) echo "ERROR: Invalid option -$OPTARG" >&2
Usage ;;
:) echo "Missing option argument for -$OPTARG" >&2
Usage ;;
*) echo "Unimplemented option: -$OPTARG" >&2
Usage ;;
esac
done
## Build the message's subject
SUBJECT="[$NOTIFICATIONTYPE] $SERVICEDISPLAYNAME on $HOSTDISPLAYNAME is $SERVICESTATE!"
## Build the message itself
NOTIFICATION_MESSAGE=$(cat << EOF
$HOSTDISPLAYNAME ($HOSTALIAS) is $HOSTSTATE!
When? $LONGDATETIME
Info? $HOSTOUTPUT
Host? $HOSTALIAS
IPv4? $HOSTADDRESS
EOF
)
## Is this host IPv6 capable?
if [ -n "$HOSTADDRESS6" ] ; then
NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE
IPv6? $HOSTADDRESS6"
fi
## Are there any comments? Put them into the message!
if [ -n "$NOTIFICATIONCOMMENT" ] ; then
NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE
Comment by $NOTIFICATIONAUTHORNAME:
$NOTIFICATIONCOMMENT"
fi
## Are we using Icinga Web 2? Put the URL into the message!
if [ -n "$HAS_ICINGAWEB2" ] ; then
NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE
Get live status:
$HAS_ICINGAWEB2/monitoring/host/show?host=$HOSTALIAS"
fi
## Build the message's subject
SUBJECT="[$NOTIFICATIONTYPE] Host $HOSTDISPLAYNAME is $HOSTSTATE!"
## Are we verbose? Then put a message to syslog...
if [ "$VERBOSE" == "true" ] ; then
logger "$PROG sends $SUBJECT => Telegram Channel $TELEGRAM_BOT"
fi
## debug output or not
if [ -z $DEBUG ];then
CURLARGS="--silent --output /dev/null"
else
CURLARGS=-v
set -x
echo -e "DEBUG MODE!"
fi
## And finally, send the message
/usr/bin/curl $CURLARGS \
--data-urlencode "chat_id=${TELEGRAM_CHATID}" \
--data-urlencode "text=${NOTIFICATION_MESSAGE}" \
--data-urlencode "parse_mode=HTML" \
--data-urlencode "disable_web_page_preview=true" \
"https://api.telegram.org/bot${TELEGRAM_BOTTOKEN}/sendMessage"
set +x

View file

@ -1,132 +0,0 @@
#!/usr/bin/env bash
## /etc/icinga2/scripts/service-by-telegram.sh / 20170330
## Marianne M. Spiller <github@spiller.me>
## Last updated 20190820
## Last tests used icinga2-2.11.2-1.buster
PROG="`basename $0`"
HOSTNAME="`hostname`"
TRANSPORT="curl"
unset DEBUG
if [ -z "`which $TRANSPORT`" ] ; then
echo "$TRANSPORT not in \$PATH. Consider installing it."
exit 1
fi
Usage() {
cat << EOF
service-by-telegram notification script for Icinga 2 by spillerm <github@spiller.me>
The following are mandatory:
-4 HOSTADDRESS (\$address$)
-6 HOSTADDRESS6 (\$address6$)
-d LONGDATETIME (\$icinga.long_date_time$)
-e SERVICENAME (\$service.name$)
-l HOSTALIAS (\$host.name$)
-n HOSTDISPLAYNAME (\$host.display_name$)
-o SERVICEOUTPUT (\$service.output$)
-p TELEGRAM_BOT (\$telegram_bot$)
-q TELEGRAM_CHATID (\$telegram_chatid$)
-r TELEGRAM_BOTTOKEN (\$telegram_bottoken$)
-s SERVICESTATE (\$service.state$)
-t NOTIFICATIONTYPE (\$notification.type$)
-u SERVICEDISPLAYNAME (\$service.display_name$)
And these are optional:
-b NOTIFICATIONAUTHORNAME (\$notification.author$)
-c NOTIFICATIONCOMMENT (\$notification.comment$)
-i HAS_ICINGAWEB2 (\$icingaweb2url$, Default: unset)
-v (\$notification_logtosyslog$, Default: false)
-D DEBUG enable debug output - meant for CLI debug only
EOF
exit 1;
}
while getopts 4:6:b:c:d:e:f:hi:l:n:o:p:q:r:s:t:u:v:D opt
do
case "$opt" in
4) HOSTADDRESS=$OPTARG ;;
6) HOSTADDRESS6=$OPTARG ;;
b) NOTIFICATIONAUTHORNAME=$OPTARG ;;
c) NOTIFICATIONCOMMENT=$OPTARG ;;
d) LONGDATETIME=$OPTARG ;;
e) SERVICENAME=$OPTARG ;;
h) Usage ;;
i) HAS_ICINGAWEB2=$OPTARG ;;
l) HOSTALIAS=$OPTARG ;;
n) HOSTDISPLAYNAME=$OPTARG ;;
o) SERVICEOUTPUT=$OPTARG ;;
p) TELEGRAM_BOT=$OPTARG ;;
q) TELEGRAM_CHATID=$OPTARG ;;
r) TELEGRAM_BOTTOKEN=$OPTARG ;;
s) SERVICESTATE=$OPTARG ;;
t) NOTIFICATIONTYPE=$OPTARG ;;
u) SERVICEDISPLAYNAME=$OPTARG ;;
v) VERBOSE=$OPTARG ;;
D) DEBUG=1; echo -e "\n**********************************************\nWARNING: DEBUG MODE, DEACTIVATE ASAP\n**********************************************\n" ;;
\?) echo "ERROR: Invalid option -$OPTARG" >&2
Usage ;;
:) echo "Missing option argument for -$OPTARG" >&2
Usage ;;
*) echo "Unimplemented option: -$OPTARG" >&2
Usage ;;
esac
done
## Build the message's subject
SUBJECT="[$NOTIFICATIONTYPE] $SERVICEDISPLAYNAME on $HOSTDISPLAYNAME is $SERVICESTATE!"
## Build the message itself
NOTIFICATION_MESSAGE=$(cat << EOF
[$SERVICESTATE] $SERVICEDISPLAYNAME is $SERVICESTATE since $LONGDATETIME
Host: $HOSTALIAS (IPv4 $HOSTADDRESS)
More info: $SERVICEOUTPUT
EOF
)
## Is this host IPv6 capable?
if [ -n "$HOSTADDRESS6" ] ; then
NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE
IPv6? $HOSTADDRESS6"
fi
## Are there any comments? Put them into the message!
if [ -n "$NOTIFICATIONCOMMENT" ] ; then
NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE
Comment by $NOTIFICATIONAUTHORNAME:
$NOTIFICATIONCOMMENT"
fi
## Are we using Icinga Web 2? Put the URL into the message!
if [ -n "$HAS_ICINGAWEB2" ] ; then
NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE
Get live status:
$HAS_ICINGAWEB2/monitoring/host/show?host=$HOSTALIAS"
fi
## Are we verbose? Then put a message to syslog...
if [ "$VERBOSE" == "true" ] ; then
logger "$PROG sends $SUBJECT => Telegram Channel $TELEGRAM_BOT"
fi
## debug output or not?
if [ -z $DEBUG ];then
CURLARGS="--silent --output /dev/null"
else
CURLARGS=-v
set -x
echo -e "DEBUG MODE!"
fi
## And finally, send the message
/usr/bin/curl $CURLARGS \
--data-urlencode "chat_id=${TELEGRAM_CHATID}" \
--data-urlencode "text=${NOTIFICATION_MESSAGE}" \
--data-urlencode "parse_mode=HTML" \
--data-urlencode "disable_web_page_preview=true" \
"https://api.telegram.org/bot${TELEGRAM_BOTTOKEN}/sendMessage"
set +x