1#!/usr/bin/env bash 2# Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ 3# Except of function urlencode which is Copyright (C) by Brian White (brian@aljex.com) used under MIT license 4 5PROG="`basename $0`" 6ICINGA2HOST="`hostname`" 7MAILBIN="mail" 8 9if [ -z "`which $MAILBIN`" ] ; then 10 echo "$MAILBIN not found in \$PATH. Consider installing it." 11 exit 1 12fi 13 14## Function helpers 15Usage() { 16cat << EOF 17 18Required parameters: 19 -d LONGDATETIME (\$icinga.long_date_time\$) 20 -e SERVICENAME (\$service.name\$) 21 -l HOSTNAME (\$host.name\$) 22 -n HOSTDISPLAYNAME (\$host.display_name\$) 23 -o SERVICEOUTPUT (\$service.output\$) 24 -r USEREMAIL (\$user.email\$) 25 -s SERVICESTATE (\$service.state\$) 26 -t NOTIFICATIONTYPE (\$notification.type\$) 27 -u SERVICEDISPLAYNAME (\$service.display_name\$) 28 29Optional parameters: 30 -4 HOSTADDRESS (\$address\$) 31 -6 HOSTADDRESS6 (\$address6\$) 32 -b NOTIFICATIONAUTHORNAME (\$notification.author\$) 33 -c NOTIFICATIONCOMMENT (\$notification.comment\$) 34 -i ICINGAWEB2URL (\$notification_icingaweb2url\$, Default: unset) 35 -f MAILFROM (\$notification_mailfrom\$, requires GNU mailutils (Debian/Ubuntu) or mailx (RHEL/SUSE)) 36 -v (\$notification_sendtosyslog\$, Default: false) 37 38EOF 39} 40 41Help() { 42 Usage; 43 exit 0; 44} 45 46Error() { 47 if [ "$1" ]; then 48 echo $1 49 fi 50 Usage; 51 exit 1; 52} 53 54urlencode() { 55 local LANG=C i=0 c e s="$1" 56 57 while [ $i -lt ${#1} ]; do 58 [ "$i" -eq 0 ] || s="${s#?}" 59 c=${s%"${s#?}"} 60 [ -z "${c#[[:alnum:].~_-]}" ] || c=$(printf '%%%02X' "'$c") 61 e="${e}${c}" 62 i=$((i + 1)) 63 done 64 echo "$e" 65} 66 67## Main 68while getopts 4:6:b:c:d:e:f:hi:l:n:o:r:s:t:u:v: opt 69do 70 case "$opt" in 71 4) HOSTADDRESS=$OPTARG ;; 72 6) HOSTADDRESS6=$OPTARG ;; 73 b) NOTIFICATIONAUTHORNAME=$OPTARG ;; 74 c) NOTIFICATIONCOMMENT=$OPTARG ;; 75 d) LONGDATETIME=$OPTARG ;; # required 76 e) SERVICENAME=$OPTARG ;; # required 77 f) MAILFROM=$OPTARG ;; 78 h) Usage ;; 79 i) ICINGAWEB2URL=$OPTARG ;; 80 l) HOSTNAME=$OPTARG ;; # required 81 n) HOSTDISPLAYNAME=$OPTARG ;; # required 82 o) SERVICEOUTPUT=$OPTARG ;; # required 83 r) USEREMAIL=$OPTARG ;; # required 84 s) SERVICESTATE=$OPTARG ;; # required 85 t) NOTIFICATIONTYPE=$OPTARG ;; # required 86 u) SERVICEDISPLAYNAME=$OPTARG ;; # required 87 v) VERBOSE=$OPTARG ;; 88 \?) echo "ERROR: Invalid option -$OPTARG" >&2 89 Usage ;; 90 :) echo "Missing option argument for -$OPTARG" >&2 91 Usage ;; 92 *) echo "Unimplemented option: -$OPTARG" >&2 93 Usage ;; 94 esac 95done 96 97shift $((OPTIND - 1)) 98 99## Keep formatting in sync with mail-host-notification.sh 100for P in LONGDATETIME HOSTNAME HOSTDISPLAYNAME SERVICENAME SERVICEDISPLAYNAME SERVICEOUTPUT SERVICESTATE USEREMAIL NOTIFICATIONTYPE ; do 101 eval "PAR=\$${P}" 102 103 if [ ! "$PAR" ] ; then 104 Error "Required parameter '$P' is missing." 105 fi 106done 107 108## Build the message's subject 109SUBJECT="[$NOTIFICATIONTYPE] $SERVICEDISPLAYNAME on $HOSTDISPLAYNAME is $SERVICESTATE!" 110 111## Build the notification message 112NOTIFICATION_MESSAGE=`cat << EOF 113***** Service Monitoring on $ICINGA2HOST ***** 114 115$SERVICEDISPLAYNAME on $HOSTDISPLAYNAME is $SERVICESTATE! 116 117Info: $SERVICEOUTPUT 118 119When: $LONGDATETIME 120Service: $SERVICENAME 121Host: $HOSTNAME 122EOF 123` 124 125## Check whether IPv4 was specified. 126if [ -n "$HOSTADDRESS" ] ; then 127 NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE 128IPv4: $HOSTADDRESS" 129fi 130 131## Check whether IPv6 was specified. 132if [ -n "$HOSTADDRESS6" ] ; then 133 NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE 134IPv6: $HOSTADDRESS6" 135fi 136 137## Check whether author and comment was specified. 138if [ -n "$NOTIFICATIONCOMMENT" ] ; then 139 NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE 140 141Comment by $NOTIFICATIONAUTHORNAME: 142 $NOTIFICATIONCOMMENT" 143fi 144 145## Check whether Icinga Web 2 URL was specified. 146if [ -n "$ICINGAWEB2URL" ] ; then 147 NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE 148 149$ICINGAWEB2URL/monitoring/service/show?host=$(urlencode "$HOSTNAME")&service=$(urlencode "$SERVICENAME")" 150fi 151 152## Check whether verbose mode was enabled and log to syslog. 153if [ "$VERBOSE" = "true" ] ; then 154 logger "$PROG sends $SUBJECT => $USEREMAIL" 155fi 156 157## Send the mail using the $MAILBIN command. 158## If an explicit sender was specified, try to set it. 159if [ -n "$MAILFROM" ] ; then 160 161 ## Modify this for your own needs! 162 163 ## Debian/Ubuntu use mailutils which requires `-a` to append the header 164 if [ -f /etc/debian_version ]; then 165 /usr/bin/printf "%b" "$NOTIFICATION_MESSAGE" | $MAILBIN -a "From: $MAILFROM" -s "$SUBJECT" $USEREMAIL 166 ## Other distributions (RHEL/SUSE/etc.) prefer mailx which sets a sender address with `-r` 167 else 168 /usr/bin/printf "%b" "$NOTIFICATION_MESSAGE" | $MAILBIN -r "$MAILFROM" -s "$SUBJECT" $USEREMAIL 169 fi 170 171else 172 /usr/bin/printf "%b" "$NOTIFICATION_MESSAGE" \ 173 | $MAILBIN -s "$SUBJECT" $USEREMAIL 174fi 175