Zasílání SMS z Nagiosu

Na našem webhostingu Klenot.cz používáme pro monitorování běhu serverů a služeb, které na nich běží, systém Nagios. Sytém Nagios je velice dobře konfigurovatelný a je možné pomocí něj monitorovat téměř cokoliv. V našem případě monitoruje dostupnost několik desítek serverů a více než 350 služeb. Důležitou součástí dohledu je zasílání zpráv o možných problémech na serverech. Samotný nagios neumožňuje odesílání zpráv ale jenom je pomocí nadefinovaných příkazů předá dalšímu programu, např. mail serveru, který je odešle. Administrátor však nesedí neustále při počítači a nemá tak možnost sledovat nagios nebo emaily. V případě produkčních systémů je potřebné aby byl administrátor informován o možných potížích okamžite.

SMS brána

Pro odesílání SMS zpráv přímo z nagiosu jsem použil GSM bránu Siemens mc39i. Jako software pro správu SMS jsem použil smstools (verze 2.2.20). Mc39i se připojuje přes sériový port, ale vzhledem k tomu, že server, ke kterému jsem to připojoval, nemá sériový port, tak jsem použil USB< ->RS232 rekudkci. Ale na konfiguraci to téměr nic nemění. Siemens mc39i podporuje funkci SIM-Toolkit takže stačí zakoupit vhodný program a SIMku vložit do GSM brány. V operačním systému se nám objeví jako zařízení /dev/ttyUSB0.

 

 

Konfigurace smstools

Po tom co aplikaci smstools stáhneme, rozbalíme archiv a zkompilujeme

$ tar xfz smstools-2.2.20.tar.gz
$ make
$ make install

Aplikace se naistaluje do /usr/local/bin. V případě, že chcete aplikaci naistalovat někam jinam, stačí upravit skript install.sh, konkrétně proměnnou BINDIR. Součástí archivu se zdrojovými kódy je i dokumetace obsahující kompletní návod na instalaci a konfiguraci. Dokumentace se nachází v adresáři doc.

 

Aplikace smstools běží jako daemon smsd a sleduje adresáře pro odesílání (outgoing) a příjmání (incoming) SMS. Každá SMS představuje textový soubor s určitou strukturou. Minimální tvar textového souboru pro odeslání SMS je

To: 420XXXXXX # číslo příjemce - musí být v mezinárodním formátu ale bez znaku "+" nebo "00" na začátku

text # text SMS zprávy

S touto minimální konfigurací si vystačíme i my. Po tom co smsd najde v outgoing adresáři soubor s SMSkou (libovolný textový soubor) zkontroluje jeho strukturu a v případě, že je správná, přesune soubor do checkedadresáře, který představuje frontu pro odesílání přes GSM bránu. Z checked adresáře pak daemon posílá obsahy SMS souborů na GMS bránu, která je odešle. Po odeslání SMS je soubor přesunut z checked adresáře do sentadresáře. V případě, že se SMS nepodaří odeslat, je soubor z outgoing adresáře přesunut do failed adresáře.

 

Konfigurace smstools se nachází v souboru /etc/smsd.conf. Upravíme si teda konfiguraci

$ vim /etc/smsd.conf
# zařízení, které se bude používat pro odesílání/příjímaní SMS zpráv
devices = GSM1

# adresář pro odchozí SMS, tam je bude umistňovat nagios
outgoing = /home/smstools/outgoing

# adresář pro SMS soubory, které mají odpovídající strukturu pro odeslání
checked = /home/smstools/checked

# adresář obsahující SMS soubory, které se nepodařilo odeslat
failed = /home/smstools/failed

# adresář obsahující soubory příchozích SMS
incoming = /home/smstools/incoming

# adresář pro již odeslané SMS soubory
sent = /home/smstools/sent

# soubor kam bude smsd logovat
logfile = /var/log/smsd.log

# úroveň logu
loglevel = 4

# konfigurace zařízení
[GSM1]

# zařízení pro odesílání a příjmání SMS
device = /dev/ttyUSB0

# určuje, zda povolit příjmání SMS
incoming = yes

Teď je potřeba vytvořit si adresárovou strukturu jak jsme si ji nadefinovali v konfiguraci a upravit přístupová práva

$ mkdir -p /home/smstools
$ cd /home/smstools
$ mkdir -p incoming outgoing checked sent failed
$ chmod 750 incoming outgoing checked sent failed
$ chmod g+w incoming outgoing

Dále chceme, aby smsd běžel pod vlastním uživatelem. Vytvoříme si proto uživatele, například smstools

$ useradd -r -d /home/smstools smstools

a převedeme vlastnictví souborů na nového uživatele

$ chown -R smstools:smstools /home/smstools

Aby mohl uživatel smstools přistupovat (zapisovat) na zařízení GSM brány (/dev/ttyUSB0) je potřeba ho přidat do vlastnické skupiny tohoto zařízení (skupina uucp)

$ usermod -aG uucp smstools

Součástí instalace smstools je i init skript, který je ale potřeba malinko upravit (doplnit parametry prochkconfig a spouštění pod vlastním uživatelem)

$ vim /etc/init.d/sms
#! /bin/sh
# sms   This script can be used to start/stop smsd
#       as a daemon in Linux and Solaris.
#
# chkconfig: 2345 99 01
# description: SMS daemon


# Maximum time to stop smsd, after that it gets killed hardly
maxwait=30

case "$1" in
    start)
        find /var/spool/sms -name '*.LOCK' -exec rm {} \; &> /dev/null
        sudo -u smstools /usr/local/bin/smsd &
        ;;
    stop)
        kill `ps -e | grep smsd | awk '{print $1}'`
        sleep 1
        if ps -e | grep smsd >/dev/null; then
          echo "Allowing smsd to terminate gracefully within $maxwait seconds"
          seconds=0
          while ps -e | grep smsd >/dev/null; do
            seconds=`expr $seconds + 1`
            if [ "$seconds" -ge $maxwait ]; then
              echo "Timeout occured, killing smsd hardly."
              kill -9 `ps -e | grep smsd | awk '{print $1}'`
              seconds=0
            fi
            sleep 1
          done
        fi
        ;;
    restart|reload)
        $0 stop
        $0 start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

Konfigurace chkconfig

$ chkconfig --add sms
$ chkconfig sms on
$ chkconfig --list sms
sms            	0:off	1:off	2:on	3:on	4:on	5:on	6:off

 

 

Konfigurace nagiosu

Na straně nagiosu je potřeba nadefinovat příkazy, pomocí kterých bude nagios vytvářet SMS soubory (v našem případě je nagios na stejném serveru jako GSM brána). Do konfiguračního souboru/etc/nagios/commands.conf doplníme

$ vim /etc/nagios/commands.conf
# notify host via SMS
...
define command{
        command_name    notify-host-by-sms
        command_line    /usr/bin/printf "%b" "From: Nagios\nTo: $CONTACTPAGER$\n\nType: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nIP: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\nDate/Time: $LONGDATETIME$\n" > `mktemp -u /home/smstools/outgoing/sms_XXXXXXX`
}

# notify service via SMS
define command{
        command_name    notify-service-by-sms
        command_line    /usr/bin/printf "%b" "From: Nagios\nTo: $CONTACTPAGER$\n\nType: $NOTIFICATIONTYPE$\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nIP: $HOSTADDRESS$\nState: $SERVICESTATE$\nDate/Time: $LONGDATETIME$\nMore Info: $SERVICEOUTPUT$" > `mktemp -u /home/smstools/outgoing/sms_XXXXXXX`
}
...

Uvedené příkazy vytvoří pri notifikaci nagiosu SMS soubor s názvem ve tvaru „sms_XXXXXXX“ kde řetezec „XXXXXXX“ je nahrazen náhodným řetezcem stejné délky. Samozřejmě, to jaký tvar budou mít nazvy SMS souborů je každého vlastním uvážení. SMSka se odešle na číslo uvedené v proměnné $CONTACTPAGER$ v dfinici kontaktu. Samozřejmě je ještě potřeba v nagiosu nastavit aby byly uživatelé (kontakty) notifikováni přes SMS, tj. aby se pro odesílání notifikací z nagiosu používali právě zmíněné příkazy. Nechť jsou kontakty pro nagios nadefinovány v souboru /etc/nagios/conf.d/contacts.cfg

$ vim /etc/nagios/conf.d/contacts.cg
...
define contact{
        contact_name                    panko
        alias                           Daniel Smolarik
        email                           muj@email.cz
        pager                           420123456790
        service_notification_period     24x7
        host_notification_period        24x7
        service_notification_options    w,u,c,r
        host_notification_options       d,u,r
        service_notification_commands   notify-service-by-email,notify-service-by-sms
        host_notification_commands      notify-host-by-email,notify-host-by-sms
}
...

V našem případě jsou zprávy z nagiosu posílány také na email.

 

Vzhledem k tomu, že nagios běží pod vlastním uživatelem (uživatel nagios) je potřeba ho přidat do skupinysmstools aby mohl zapisovat do outgoing adresáře

$ usermod -aG smstools nagios

Nově vytvořené SMS soubory v outgoing adresáři se vytvářejí s vlastnictvím nagios:nagios. Proto potřebujeme, aby vlastnickou skupinou u nově vytvořených SMS souborů v outgoing adresáři byla skupinasmstoolssmsd tak mohl přemistňovat SMS soubory. K tomu nám postačí SGID bit

$ chmod g+s /home/smstools/outgoing /home/smstools/incoming

Navíc mktemp vytváří soubory s právami pro čtení a zápis jenom pro vlastníka (v napřípadě nagios), tj. s právami 0600. Aby SMS soubory mohl smsd běžící pod uživatelem smstools přemistňovat je potřeba nastavit předvolená práva pro vlastnickou skupinu (tou je smstools dle SGIT bitu). K tomu nastavíme ACL záznamy

$ setfacl -m default:group:smstools:rw /home/smstools/outgoing

Výsledná práva a vlastnictví bude vypadat nasledovně

$ ll /home/smstools/
drwxr-x---  2 smstools smstools 134 Nov  3 16:06 backup
drwxr-x---  2 smstools smstools   6 Oct 30 04:21 checked
drwxr-x---  2 smstools smstools   6 Oct  1 10:14 failed
drwxrws---+ 2 smstools smstools   6 Oct  2 04:02 incoming
drwxrws---+ 2 smstools smstools   6 Oct 30 04:20 outgoing
drwxr-x---  2 smstools smstools  26 Nov  3 14:45 sent

$ getfacl /home/smstools/outgoing
# file: data/smstools/outgoing
# owner: smstools
# group: smstools
user::rwx
group::rwx
other::---
default:user::rwx
default:group::rw-
default:other::---

Nakonec spustíme SMS daemona

$ /etc/init.d/nagios reload
$ /etc/init.d/sms start

 

Jak již bylo zmíněno, soubory odeslaných SMS se umistňují do sent adresáře (/home/smstools/sent). Těchto souborů však může být po nějaké době poměrně hodně a tak je vhodné je nějakým spůsobem archivovat. Asi nejjednoduší spůsob je napsat si skript a pomocí cronu jej pravidelně spouštět. Záložné archivy budeme skladovat např. v adresáři /home/smstools/backup

$ mkdir -p /home/smstools/backup && chmod 750 /home/smstools/backup

$ vim /etc/cron.monthly/sms-cleanup
#!/bin/bash

SMS_SENT_DIR=/home/smstools/sent
SMS_BACKUP_DIR=/home/smstools/backup
HOLD_BACKUPS=730
DATE=$(date +%d-%m-%Y)

cd "$SMS_SENT_DIR"
[ ! -e sms-bak_"$DATE" ] && mkdir sms-bak_"$DATE"
mv "$SMS_SENT_DIR"/sms_* sms-bak_"$DATE"
tar cfz "$SMS_BACKUP_DIR"/sms-bak_"$DATE".tar.gz sms-bak_"$DATE" && \
rm -rf sms-bak_"$DATE"

find "$SMS_BACKUP_DIR" -mtime +"$HOLD_BACKUPS" -type f -printf '%p\n' | xargs rm -f

$ chmod +x /etc/cron.monthly/sms-cleanup

Uvedený skript vezme SMS soubory ze sent adresáře a zabalí je do archivu, kterého název obsahuje aktuální datum. Skript se spoští jednou měsíčně. Archivy s SMS soubory si ponecháme 2 roky.

 

Uvedená konfigurace pro smstools je prevážne použitelná i na jiné aplikace než je zasílání notifikací z nagiosu. Zároveň je také monžé mc39i použít i jako záložné připojení přes GPRS.