A Freak Like Me

Oder: Ich bin ganz normal

  •  
  •  
  • Über mich
  • Datenschutzerklärung
  • Impressum

Benachrichtigungen von Icinga2 mittels Signal

3. April 2022 by Stephan 0 Comments

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

Datenfelder hinzufügen

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.

Ähnliche Beiträge

Categories Server Tags: Icinga2, Monitoring, Server

About Stephan

See all the posts by Stephan at this link.

Kommentar verfassen Antwort abbrechen

Neueste Beiträge

  • Misskey auf CentOS 7 installieren
  • Benachrichtigungen von Icinga2 mittels Signal
  • [Werbung] Nestlé Special.T Mini.T
  • Wie ich mich vor „hacking“ schütze
  • Matrix – Referenz Server „Synapse“ installieren

Kategorien

  • Allgemein
  • Komplettlösung
  • Nintendo
  • Produkttests
  • Review
  • Security
  • Server
  • Werbung
  • Zelda

Gib mir dein Like!

Gib mir dein Like!

Mastodon Link

@therealkings@toot.krinetzki.de


Stop Spam Harvesters, Join Project Honey Pot

Archiv

Neueste Beiträge

  • Misskey auf CentOS 7 installieren
  • Benachrichtigungen von Icinga2 mittels Signal
  • [Werbung] Nestlé Special.T Mini.T
  • Wie ich mich vor „hacking“ schütze
  • Matrix – Referenz Server „Synapse“ installieren

Neueste Kommentare

  • Rasierer - Reinhard bei Neuer Produkttest: Panasonic ES-LT4N Nass/Trocken-Rasierer
  • Prov94 bei Installation von Mastodon auf Debian 8 (Jessie)
  • Balack bei Neuer Produkttest: Panasonic ES-LT4N Nass/Trocken-Rasierer
  • Showdown: Panasonic ES-LT4N VS. Braun Series 7 7898cc – A Freak Like Me bei Braun Series 7 im trnd-Produkttest
  • Braun Series 7 im trnd-Produkttest – A Freak Like Me bei Neuer Produkttest: Panasonic ES-LT4N Nass/Trocken-Rasierer

Copyright © 2022 ~ A Freak Like Me ~ The Funk
Proudly powered by WordPress