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.
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 checked
adresář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 sent
adresář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 skupinasmstools
a smsd
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.