In diesem kleinen Blog beitrag möchte ich kurz erläutern, wie man in Icinga2 die Benachrichtigungen mit Signal empfangen kann.
Signal gibt es übrigens hier:
[appbox googleplay org.thoughtcrime.securesms][appbox appstore id874139669]
signal-cli: Nachrichten per CLI an Signal verschicken
Damit wir überhaupt Nachrichten über Signal verschicken können, brauchen wir zunächstmal eine Command Line Interface (CLI). Dieses wird glücklicherweise via GitHub angeboten https://github.com/AsamK/signal-cli/releases
Der Download lässt sich schnell durch führen:
$ wget https://github.com/AsamK/signal-cli/releases/download/v0.10.4.2/signal-cli-0.10.4.2-Linux.tar.gz
$ wget https://github.com/AsamK/signal-cli/releases/download/v0.10.4.2/signal-cli-0.10.4.2-Linux.tar.gz.asc
# Überprüfen der Signatur
gpg --verify signal-cli-0.10.4.2-Linux.tar.gz.asc signal-cli-0.10.4.2-Linux.tar.gz
Nachdem der Download abgeschlossen ist, kann die CLI installiert werden:
$ sudo tar xf signal-cli-0.10.4.2-Linux.tar.gz -C /opt
$ sudo ln -sf /opt/signal-cli-0.10.4.2/bin/signal-cli /usr/local/bin/
Hinweis: Die neueren Version der signal-cli sind gegen glibc 2.29 kompiliert, siehe dazu auch https://github.com/AsamK/signal-cli/issues/643. Die Version der glibc könnt ihr wie folgt herausfinden
$ ldd --version
Sollte hier eine Version <2.29 sein so könnt ihr euch unter https://github.com/exquo/signal-libs-build/releases/ die entsprechende Version der libsignal herunterladen. Dann könnt ihr die libsignal entsprechend austauschen
$ wget https://github.com/exquo/signal-libs-build/releases/download/libsignal-client_v0.14.0/libsignal_jni.so-v0.14.0-x86_64-unknown-linux-gnu.tar.gz
$ tar xf libsignal_jni.so-v0.14.0-x86_64-unknown-linux-gnu.tar.gz
$ zip -d signal-cli-0.10.4.2/lib/signal-client-java-*.jar libsignal_jni.so
$ zip signal-cli-0.10.4.2/lib/signal-client-java-*.jar libsignal_jni.so
Nummer registrieren
Nun müsst ihr zunächst die Nummer, die die Nachrichten verschicken soll, in Signal registrieren. Das geht nicht mit der Nummer, die ihr auf eurem Smartphone verwendet! Ihr müsst euch eine extra Nummer nehmen. Wenn man sich für eine Nummer mit SMS Funktionalität entschieden hat, wird die Nummer so registriert
$ sudo -u icinga /usr/local/bin/signal-cli -u <Telefon Nummer> register --captcha '<CAPTCHA>'
Bei Telefonnummer tragt ihr die Mobilfunknummer im internationalen Format ein ein (für Deutschland: +49….) und das Captcha bekommt ihr unter https://signalcaptchas.org/registration/generate.html. Wenn ihr den Link aufruft, öffnet vor dem Bestätigen die Browser Entwicklerwerkzeuge (In Firefox mittels Strg + Umschalt + I oder oben rechts das Burger Menü -> Weitere Werkzeuge -> Werkzeuge für Web…), klickt auf den Tab „Konsole“, harkt das Kästchen an und schaut unten nach „signalcaptcha://“. Alles was danach kommt, wird kopiert und als CAPTCHA oben eingefügt. Wenn alles klappt, erhaltet ihr auf der Konsole keine Ausgabe und bekommt in kürze eine SMS mit dem Authentifizierungscode. Damit müsst ihr noch noch die Nummer bestätigen
$ sudo -u icinga /usr/local/bin/signal-cli -u <Telefon Nummer> verify <Code aus der SMS>
Solltet ihr keine Mobilfunknummer zur Hand haben, geht auch eine Festnetznummer. Dann tragt am Ende noch den Switch --voice
nach
$ sudo -u icinga /usr/local/bin/signal-cli -u <Telefon Nummer> register --captcha '<CAPTCHA>' --voice
Die bestätigung funktioniert dann, wie bei der Mobilfunknummer.
Um das ganze nun zu testen, könnt ihr nach der Regestrierung folgendes versuchen:
sudo -u icinga /usr/local/bin/signal-cli -u <Telefon Nummer> send -m "Test über die signal-cli" <Euer Signal Account>
Danach solltet ihr die Nachricht via Signal bekommen. Ihr könnt natürlich nun einen Beliebigen Text verschicken. Auch Emojis gehen.
Icinga2: Skripte zum verschicken vorbereiten
Damit ihr in Icinga2 nun Signal als Benachrichtigungs Option verwenden könnt, müsst ihr zunächst einmal zwei Skripte unter /etc/icinga2/scripts
anlegen: signal-host-notification.sh
und signal-service-notification.sh
. Der Inhalt dieser Skripte:
signal-host-notification.sh
#!/usr/bin/bash
PROG="`basename $0`"
ICINGA2HOST="`hostname`"
SIGNALCLIBIN="signal-cli"
if [ -z "`which $SIGNALCLIBIN`" ] ; then
echo "$SIGNALCLIBIN not found in \$PATH. Consider installing it."
echo "See also https://github.com/AsamK/signal-cli"
exit 1
fi
## Function helpers
Usage() {
cat << EOF
Required parameters:
-d LONGDATETIME (\$icinga.long_date_time\$)
-l HOSTNAME (\$host.name\$)
-n HOSTDISPLAYNAME (\$host.display_name\$)
-o HOSTOUTPUT (\$host.output\$)
-s HOSTSTATE (\$host.state\$)
-t NOTIFICATIONTYPE (\$notification.type\$)
-x USERPHONE (\$user.pager\$)
Optional parameters:
-4 HOSTADDRESS (\$address\$)
-6 HOSTADDRESS6 (\$address6\$)
-b NOTIFICATIONAUTHORNAME (\$notification.author\$)
-c NOTIFICATIONCOMMENT (\$notification.comment\$)
-i ICINGAWEB2URL (\$notification_icingaweb2url\$, Default: unset)
-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:hi:l:n:o:s:t:v:x: opt
do
case "$opt" in
4) HOSTADDRESS=$OPTARG ;;
6) HOSTADDRESS6=$OPTARG ;;
b) NOTIFICATIONAUTHORNAME=$OPTARG ;;
c) NOTIFICATIONCOMMENT=$OPTARG ;;
d) LONGDATETIME=$OPTARG ;; # required
h) Help ;;
i) ICINGAWEB2URL=$OPTARG ;;
l) HOSTNAME=$OPTARG ;; # required
n) HOSTDISPLAYNAME=$OPTARG ;; # required
o) HOSTOUTPUT=$OPTARG ;; # required
s) HOSTSTATE=$OPTARG ;; # required
t) NOTIFICATIONTYPE=$OPTARG ;; # required
v) VERBOSE=$OPTARG ;;
x) USERPHONE=$OPTARG ;; # required
\?) echo "ERROR: Invalid option -$OPTARG" >&2
Error ;;
:) echo "Missing option argument for -$OPTARG" >&2
Error ;;
*) echo "Unimplemented option: -$OPTARG" >&2
Error ;;
esac
done
shift $((OPTIND - 1))
## Keep formatting in sync with mail-service-notification.sh
for P in LONGDATETIME HOSTNAME HOSTDISPLAYNAME HOSTOUTPUT HOSTSTATE USERPHONE NOTIFICATIONTYPE ; do
eval "PAR=\$${P}"
if [ ! "$PAR" ] ; then
Error "Required parameter '$P' is missing."
fi
done
## Build the message's subject
HEADER="[$NOTIFICATIONTYPE] Host $HOSTDISPLAYNAME is $HOSTSTATE!"
## Build the notification message
NOTIFICATION_MESSAGE=`cat << EOF
***** Host Monitoring on $ICINGA2HOST *****
$HOSTDISPLAYNAME is $HOSTSTATE!
Info: $HOSTOUTPUT
When: $LONGDATETIME
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 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/monitoring/host/show?host=$(urlencode "$HOSTNAME")"
fi
## Check whether verbose mode was enabled and log to syslog.
if [ "$VERBOSE" = "true" ] ; then
logger "$PROG sends $HEADER => $USERPHONE"
fi
/usr/bin/printf "%b" "$HEADER $NOTIFICATION_MESSAGE" | signal-cli -u <Signal Nummer> send $USERPHONE
signal-service-notification.sh
#!/usr/bin/bash
PROG="`basename $0`"
ICINGA2HOST="`hostname`"
SIGNALCLIBIN="signal-cli"
if [ -z "`which $SIGNALCLIBIN`" ] ; then
echo "$SIGNALCLIBIN not found in \$PATH. Consider installing it."
echo "See also https://github.com/AsamK/signal-cli"
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\$)
-s SERVICESTATE (\$service.state\$)
-t NOTIFICATIONTYPE (\$notification.type\$)
-u SERVICEDISPLAYNAME (\$service.display_name\$)
-x USERPHONE (\$user.pager\$)
Optional parameters:
-4 HOSTADDRESS (\$address\$)
-6 HOSTADDRESS6 (\$address6\$)
-b NOTIFICATIONAUTHORNAME (\$notification.author\$)
-c NOTIFICATIONCOMMENT (\$notification.comment\$)
-i ICINGAWEB2URL (\$notification_icingaweb2url\$, Default: unset)
-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:hi:l:n:o:s:t:u:v: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
h) Usage ;;
i) ICINGAWEB2URL=$OPTARG ;;
l) HOSTNAME=$OPTARG ;; # required
n) HOSTDISPLAYNAME=$OPTARG ;; # required
o) SERVICEOUTPUT=$OPTARG ;; # required
s) SERVICESTATE=$OPTARG ;; # required
t) NOTIFICATIONTYPE=$OPTARG ;; # required
u) SERVICEDISPLAYNAME=$OPTARG ;; # required
v) VERBOSE=$OPTARG ;;
x) USERPHONE=$OPTARG ;; # required
\?) 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 USERPHONE 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 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/monitoring/service/show?host=$(urlencode "$HOSTNAME")&service=$(urlencode "$SERVICENAME")"
fi
## Check whether verbose mode was enabled and log to syslog.
if [ "$VERBOSE" = "true" ] ; then
logger "$PROG sends $SUBJECT => $USEREMAIL"
fi
/usr/bin/printf "%b" "$HEADER $NOTIFICATION_MESSAGE" | signal-cli -u +4915231755239 send $USERPHONE
Diese beiden Skripte entsprechen den Mail Skripten, wurden jedoch ein wenig angepasst. Die Skripte müssen natürlich mittels chmod +x ausführbar gemacht werden.
Integration in den Icinga Director
Diese beiden neuen Skripte werden nun im Icinga Director eingetragen. Dazu klickt ihr im Icinga Director auf Kommandos -> Kommandos und auf den Link „+Hinzufügen“. Da füllt ihr nun folgendes aus
Die „Benutzerdefinierte Eigenschaften“ entstehen, wenn ihr vorher die beiden entsprechenden Datenfelder unter Icinga Director -> Datenfelder definiert habt
und diese anschließend im Reiter „Felder“ beim Kommando aktiviert habt
Neben den Felder müssen noch die Argumente angepasst werden
Die Felder, die bei dem Kommando auf „Benötigt“ gestellt werden müssen: -4, -d, -i, -l. -n, -o, -s und -x. Die Werte der Variablen können der Tabelle oben entnommen werden.
Das Gleiche muss für das andere Kommando durchgeführt werden
Damit wäre die Definition der Kommandos abgeschlossen.
Benutzer und Zeit einrichten
Damit diese Benachrichtigungen überhaupt genutzt werden können, müssen wir nun sowohl eine Zeiträume, als auch einen Nutzer einrichten, der die Benachrichtigungen bekommt. Zunächst beginnen wir mit den Zeiträumen. Unter Icinga-Director -> Zeiträume legt ihr nun einen Zeitraum an. Mein Beispiel:
Die Bereiche definiert ihr im Reiter Bereiche
Danach das ganze speichern. Nun richtet ihr eine Benutzervorlage ein. Diese findet ihr unter Icinga-Director -> Benutzer/Kontakte -> Benutzervorlagen. Mein Beispiel
Nun noch zum Benutzer: Den findet ihr unter Icinga-Director -> Benutzer/Kontakte -> Benutzer
Wenn ihr dort einen Benutzernamen, eine E-Mail und einen Pager (eure Mobilfunknummer) eingetragen habt, speichert ihr das ganze.
Benachrichtigungs Template und Benachrichtigungen einrichten
Nun fehlt der letzte Schritt: Die Benachrichtigungen aktivieren. Wir beginnen mit dem Template, zu finden unter Icinga-Director -> Benachrichtigungen -> Benachrichtigungsvorlagen. Als Beispiel meine zwei Vorlagen
Zu Guter letzt die Benachrichtigungen Apply Regeln. Da ich die Plugins der Linuxfabrik aktiviert habe, habe ich die Apply Regeln wie folgt definiert:
Nun könnt ihr alle Änderungen deployen und ihr müsstet ab sofort Benachrichtigungen via Signal erhalten.
Kommentar verfassen