#!/usr/bin/env bash # Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ # Except of function urlencode which is Copyright (C) by Brian White (brian@aljex.com) used under MIT license PROG="`basename $0`" ICINGA2HOST="`hostname`" MAILBIN="mail" if [ -z "`which $MAILBIN`" ] ; then echo "$MAILBIN not found in \$PATH. Consider installing it." exit 1 fi ## Function helpers Usage() { cat << EOF Required parameters: -d LONGDATETIME (\$icinga.long_date_time\$) -e SERVICENAME (\$service.name\$) -l HOSTNAME (\$host.name\$) -n HOSTDISPLAYNAME (\$host.display_name\$) -o SERVICEOUTPUT (\$service.output\$) -r USEREMAIL (\$user.email\$) -s SERVICESTATE (\$service.state\$) -t NOTIFICATIONTYPE (\$notification.type\$) -u SERVICEDISPLAYNAME (\$service.display_name\$) Optional parameters: -4 HOSTADDRESS (\$address\$) -6 HOSTADDRESS6 (\$address6\$) -X HOSTNOTES (\$host.notes\$) -x SERVICENOTES (\$service.notes\$) -b NOTIFICATIONAUTHORNAME (\$notification.author\$) -c NOTIFICATIONCOMMENT (\$notification.comment\$) -i ICINGAWEB2URL (\$notification_icingaweb2url\$, Default: unset) -f MAILFROM (\$notification_mailfrom\$, requires GNU mailutils (Debian/Ubuntu) or mailx (RHEL/SUSE)) -v (\$notification_sendtosyslog\$, Default: false) EOF } Help() { Usage; exit 0; } Error() { if [ "$1" ]; then echo $1 fi Usage; exit 1; } urlencode() { local LANG=C i=0 c e s="$1" while [ $i -lt ${#1} ]; do [ "$i" -eq 0 ] || s="${s#?}" c=${s%"${s#?}"} [ -z "${c#[[:alnum:].~_-]}" ] || c=$(printf '%%%02X' "'$c") e="${e}${c}" i=$((i + 1)) done echo "$e" } ## Main while getopts 4:6:b:c:d:e:f:hi:l:n:o:r:s:t:u:v:X:x: opt do case "$opt" in 4) HOSTADDRESS=$OPTARG ;; 6) HOSTADDRESS6=$OPTARG ;; b) NOTIFICATIONAUTHORNAME=$OPTARG ;; c) NOTIFICATIONCOMMENT=$OPTARG ;; d) LONGDATETIME=$OPTARG ;; # required e) SERVICENAME=$OPTARG ;; # required f) MAILFROM=$OPTARG ;; h) Usage ;; i) ICINGAWEB2URL=$OPTARG ;; l) HOSTNAME=$OPTARG ;; # required n) HOSTDISPLAYNAME=$OPTARG ;; # required X) HOSTNOTES=$OPTARG ;; x) SERVICENOTES=$OPTARG ;; o) SERVICEOUTPUT=$OPTARG ;; # required r) USEREMAIL=$OPTARG ;; # required s) SERVICESTATE=$OPTARG ;; # required t) NOTIFICATIONTYPE=$OPTARG ;; # required u) SERVICEDISPLAYNAME=$OPTARG ;; # required v) VERBOSE=$OPTARG ;; \?) echo "ERROR: Invalid option -$OPTARG" >&2 Usage ;; :) echo "Missing option argument for -$OPTARG" >&2 Usage ;; *) echo "Unimplemented option: -$OPTARG" >&2 Usage ;; esac done shift $((OPTIND - 1)) ## Keep formatting in sync with mail-host-notification.sh for P in LONGDATETIME HOSTNAME HOSTDISPLAYNAME SERVICENAME SERVICEDISPLAYNAME SERVICEOUTPUT SERVICESTATE USEREMAIL NOTIFICATIONTYPE ; do eval "PAR=\$${P}" if [ ! "$PAR" ] ; then Error "Required parameter '$P' is missing." fi done ## Build the message's subject SUBJECT="[$NOTIFICATIONTYPE] $SERVICEDISPLAYNAME on $HOSTDISPLAYNAME is $SERVICESTATE!" ## Build the notification message NOTIFICATION_MESSAGE=`cat << EOF ***** Service Monitoring on $ICINGA2HOST ***** $SERVICEDISPLAYNAME on $HOSTDISPLAYNAME is $SERVICESTATE! Info: $SERVICEOUTPUT When: $LONGDATETIME Service: $SERVICENAME Host: $HOSTNAME EOF ` ## Check whether IPv4 was specified. if [ -n "$HOSTADDRESS" ] ; then NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE IPv4: $HOSTADDRESS" fi ## Check whether IPv6 was specified. if [ -n "$HOSTADDRESS6" ] ; then NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE IPv6: $HOSTADDRESS6" fi ## Check whether host notes was specified. if [ -n "$HOSTNOTES" ] ; then NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE Host notes: $HOSTNOTES" fi ## Check whether service notes was specified. if [ -n "$SERVICENOTES" ] ; then NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE Service notes: $SERVICENOTES" fi ## Check whether author and comment was specified. if [ -n "$NOTIFICATIONCOMMENT" ] ; then NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE Comment by $NOTIFICATIONAUTHORNAME: $NOTIFICATIONCOMMENT" fi ## Check whether Icinga Web 2 URL was specified. if [ -n "$ICINGAWEB2URL" ] ; then NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE $ICINGAWEB2URL/icingadb/service?name=$(urlencode "$SERVICENAME")&host.name=$(urlencode "$HOSTNAME")" fi ## Check whether verbose mode was enabled and log to syslog. if [ "$VERBOSE" = "true" ] ; then logger "$PROG sends $SUBJECT => $USEREMAIL" fi ## Send the mail using the $MAILBIN command. ## If an explicit sender was specified, try to set it. if [ -n "$MAILFROM" ] ; then ## Modify this for your own needs! ## Debian/Ubuntu use mailutils which requires `-a` to append the header if [ -f /etc/debian_version ]; then /usr/bin/printf "%b" "$NOTIFICATION_MESSAGE" | $MAILBIN -a "From: $MAILFROM" -s "$SUBJECT" $USEREMAIL ## Other distributions (RHEL/SUSE/etc.) prefer mailx which sets a sender address with `-r` else /usr/bin/printf "%b" "$NOTIFICATION_MESSAGE" | $MAILBIN -r "$MAILFROM" -s "$SUBJECT" $USEREMAIL fi else /usr/bin/printf "%b" "$NOTIFICATION_MESSAGE" \ | $MAILBIN -s "$SUBJECT" $USEREMAIL fi