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