Inhaltsverzeichnis

SMS-Versand

Mit Nagios lassen sich auch SMS-Nachrichten versenden.
Es gibt verschiedene SMS-Modems die sich per Serieller- aber auch per USB-Schnittstelle anschließen lassen.

Hier einige Geräte:

Modell Beschreibung
CEP CT63 USB Modem
USB/Seriell Starter KIT mit Quadband Antenne
Teltonika E10 USB Modem
Nachfolger für Falcom Samba 55/56/75
Multi-Tech SF100-G-EU SMS-Server
Sendet und empfängt 10 SMS pro Minute
Braintower SMS Gateway S SMS-Server
verschickt bis zu 15 SMS pro Minute
Kentix AlarmManager PRO SMS-Server
Bis zu 30 MultiSensoren-RF und LAN und 5 KeyPad anschliessbar

SMSTools

Mit den SMSTools lässt sich Linux um die SMS-Funktionalität erweitern.

SMSTools installieren

Installiert werden die SMSTools aus den Standard Ubuntu Installationsquellen.

apt-get install smstools

Nach dem Installieren verlinkt man noch das Kommandozeilenprogramm sendsms, um damit z.B. Test-SMS zu versenden.

ln -s /usr/share/doc/smstools/examples/scripts/sendsms /usr/bin/sendsms
chmod a+x /usr/share/doc/smstools/examples/scripts/sendsms

WICHTIG: Mit dieser Verlinkung und Änderung der Dateiberechtigungen können alle User diese Datei ausführen. Ggf. für bestimmte Usergruppen anpassen.

Nun passt man die Konfigurationsdatei noch an und kann danach sofort loslegen.
In der Konfigurationsdatei sind für den ersten einsatz nicht viele Sachen anzupassen.

loglevel = 5
[GSM1]
device = <PFAD_ZU_DEVICE>
incoming = yes
pin = <PIN_DER_SIMKARTE>
baudrate = 19200
smsc = <49+TELEFONNUMMER_DER_SMS-ZENTRALE_SEINES_ANBIETERS>

Nach dem Einrichten nur noch ein Reload.

service smstools reload

SMS senden

sendsms <TELEFONNUMMER> '<TEXT>'

Nagios Konfiguration

Befehl für SMS-Notication für Hosts:

sudo /usr/local/bin/sms_nagios.sh $CONTACTPAGER$ "$HOSTNAME$ ist $HOSTSTATE$ @$DATETIME$"

Befehl für SMS-Notication für Services:

sudo /usr/local/bin/sms_nagios.sh $CONTACTPAGER$ "$SERVICEDESC$ auf $HOSTNAME$ ist $SERVICESTATE$ @$DATETIME$"

Damit das Senden der SMS als nicht root Benutzer geht, ruft man den Befehl mit sudo auf. Man sollte hierfür einen Eintrag in der /etc/sudoers setzten, damit nagios kein Password dafür benötigt.

sudoers-Eintrag:

# Fuer Nagios zum senden von SMS
nagios ALL=(ALL) NOPASSWD: /usr/local/bin/sms_nagios.sh
Flood Protection

sms_nagios.sh:

#!/bin/bash
 
FLOODNUM=30
 
EXPECTED_ARGS=2
E_BADARGS=65
 
if [ $# -ne $EXPECTED_ARGS ]; then
  echo "Usage: `basename $0` NUMBER TEXT"
  exit $E_BADARGS
fi
 
FLOODLOCK="/usr/local/nagios/var/sms-flood/FLOODLOCK_$1"
NOW=$(date +%s)
 
function smssenden {
  /usr/bin/sendsms $1 $2
  date +%s > $FLOODLOCK
}
 
if [ ! -f $FLOODLOCK ]; then
  smssenden $1 $2
  exit 0
fi
 
LASTSEND=$(cat $FLOODLOCK)
let DIFF=$NOW-$LASTSEND
 
if [ $DIFF -gt $FLOODNUM ]; then
  smssenden $1 $2
  exit 0
else
  let TIMELEFT=$FLOODNUM-$DIFF
  echo floodlock aktiv fuer $TIMELEFT Sekunden
  exit 1
fi

Guthaben-Check

Der smsd Daemon erstellt eine Datei, in die der er das abgefragte Guthaben hineinschreibt.
Die Konfigurationsparameter lauten:

regular_run_cmd = AT+CUSD=1,"*106#",15;
regular_run_interval = 86400
regular_run_logfile = <PFAD>
regular_run_statfile = <PFAD>

diese Datei kann von Nagios mit diesem Script abgefragt und bewertet werden.

#!/bin/bash
# bash nagios plugin
 
###
# Variables
###
OK=0
WARNING=1
CRITICAL=2
UNKNOWN=-1
TO_RETURN=${OK}
TO_OUTPUT=''
 
# Print usage information and exit
print_usage(){
    echo -e "" \
    "usage: ./$(basename $0) -f /tmp/guthaben -w 20 -c 30 \n" \
    "-f <FILE>    guthaben file path\n" \
    "-w <EURO>    warning value\n" \
    "-c <EURO>    critical value\n" \
    "-h           this help" \
    "" && exit 1
}
 
###
# Options
###
 
# Loop through $@ to find flags
while getopts ":hf:w:c:" FLAG; do
    case "${FLAG}" in
        f) # Guthaben File
            GUTHABEN_FILE="${OPTARG}" ;;
        w) # Warning value
            WARNING_VALUE="${OPTARG}" ;;
        c) # Critical value
            CRITICAL_VALUE="${OPTARG}" ;;
        h) # Print usage information
            HELP=1;;
        [:?]) # Print usage information
            print_usage;;
    esac
done
 
###
# Functions
###
 
log_date(){
    echo $(date +"%b %e %T")
}
 
error() {
    NOW=$(log_date)
    echo "${NOW}: ERROR: $1"
    exit 1
}
 
warning() {
    NOW=$(log_date)
    echo "${NOW}: WARNING: $1"
}
 
info() {
    NOW=$(log_date)
    echo "${NOW}: INFO: $1"
}
 
# Do something
get_cmd_output(){
    #generate output
    cat ${GUTHABEN_FILE} | sed -E "s/.*Kontostand: ([0-9]{1,}).*/\\1/"  || error "failed to run command"
}
 
###
# Program execution
###
[ "${HELP}" ] && print_usage
 
if [ ${GUTHABEN_FILE} ] && [ ${WARNING_VALUE} ] && [ ${CRITICAL_VALUE} ]
then
    CMD_OUTPUT=$(get_cmd_output)
else
    print_usage
fi
 
if [ "${CMD_OUTPUT}" ] && [ ${CMD_OUTPUT} -le ${CRITICAL_VALUE} ]
then
    TO_RETURN=${CRITICAL}
elif [ "${CMD_OUTPUT}" ] && [ ${CMD_OUTPUT} -le ${WARNING_VALUE} ]
then
    TO_RETURN=${WARNING}
elif [ "${CMD_OUTPUT}" ] && [ ${CMD_OUTPUT} -gt ${CRITICAL_VALUE} ]
then
    TO_RETURN=${OK}
else
    TO_RETURN=${UNKNOWN}
fi
 
if [ $TO_RETURN == ${CRITICAL} ]
then
    TO_OUTPUT="CRITICAL"
elif [ $TO_RETURN == ${WARNING} ]
then
    TO_OUTPUT="WARNING"
elif [ ${TO_RETURN} == ${OK} ]
then
    TO_OUTPUT="OK"
else
    TO_OUTPUT="UNKNOWN"
fi
 
TO_OUTPUT="${TO_OUTPUT} - Guthaben: ${CMD_OUTPUT} EUR; ($WARNING_VALUE/$CRITICAL_VALUE) | guthaben=${CMD_OUTPUT}"
 
echo "$TO_OUTPUT";
exit $TO_RETURN;

Die Nagios Prüfbefehlszeile setzt sich somit wie folgt zusammen:

$USER1$/check_smsguthaben.sh -f $ARG1$ -w $ARG2$ -c $ARG3$