#!/usr/bin/env bash ## /etc/icinga2/scripts/host-by-telegram.sh / 20170330 ## Last updated 20190820 ## Last tests used 2.11.2-1.buster # Copyright (C) 2018 Marianne M. Spiller # # 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 . PROG="`basename $0`" HOSTNAME="`hostname`" TRANSPORT="curl" LF=$'\n' 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 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 # make icon out of service state case "$HOSTSTATE" in UP) HOSTSTATEICON=$'\xF0\x9F\x9F\xA9 ';; DOWN) HOSTSTATEICON=$'\xF0\x9F\x9F\xA5 ';; UNKNOWN) HOSTSTATEICON=$'\xE2\x9D\x93\x0A ';; *) HOSTSTATEICON="";; esac # convert date dateInSec=$(date -d "$LONGDATETIME" +%s) nowInSec=$(date +%s) ageInSec=$(($nowInSec - $dateInSec)) ageInMin=$(($ageInSec/60)) ageInHours=$(($ageInMin/60)) ageInDays=$(($ageInHours/24)) if [ "${LONGDATETIME:0:10}" == "$(date +"%Y-%m-%d")" ]; then LONGDATETIME="${LONGDATETIME:11}" fi date=${LONGDATETIME#} if [ $ageInDays -gt 0 ]; then age="Since ${ageInDays}d $(($ageInHours-$ageInDays*24))h ($LONGDATETIME)$LF" elif [ $ageInHours -gt 0 ]; then age="Since ${ageInHours}h $(($ageInMin-$ageInHours*60))m ($LONGDATETIME)$LF" elif [ $ageInMin -gt 0 ]; then age="Since ${ageInMin}m $(($ageInSec-$ageInMin*60))s$LF" elif [ $ageInSec -gt 5 ]; then age="Since ${ageInSec}s$LF" elif [ $ageInSec -lt 0 ]; then age="Since $LONGDATETIME$LF" fi if [ "$HOSTALIAS" == "$HOSTDISPLAYNAME" ]; then HOSTALIAS2="" else HOSTALIAS2=" ($HOSTALIAS)" fi ## Build the message itself NOTIFICATION_MESSAGE=$(cat << EOF $HOSTSTATEICON$HOSTDISPLAYNAME$HOSTALIAS2 is $HOSTSTATE! ${age}Info $HOSTOUTPUT 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 $HAS_ICINGAWEB2" fi ## Are we verbose? Then put a message to syslog... if [ "$VERBOSE" == "true" ] ; then ## Build the message's subject SUBJECT="[$NOTIFICATIONTYPE] Host $HOSTDISPLAYNAME is $HOSTSTATE!" 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