пятница, 19 марта 2010 г.

Скрипт отправки почты. Оповещения о состоянии системы (Linux/Unix)

Для отправки будем использовать программу msmtp, т.к. она умеет отправлять почту через внешний smtp сервер и не требует наличия локального MTA.

Так как я любитель модульности скриптов то и скрипт будет состоять из нескольких частей. Главный скрипт будет заниматься отправкой пустого письма с заданными параметрами, а "модули" построят тело письма.

Итак главный скрипт:

#!/bin/sh
TO="Server admin"
FROM="\"`hostname` Server\""
SUBJECT="Server state - `hostname`"
SMTPHOST="you.smtp.server"
SENDER="от кого будет производиться отправка"
RECEIVER="адрес(а) получателя"
BODY=""
SCRIPTDIR=/home/scripts/sendmail-server-state
DATEYMD=`date "+%Y-%m-%d"`
ls ${SCRIPTDIR}/run|sort>${SCRIPTDIR}/runlist
while read RUN
do
BODY=$BODY`env SCRIPTDIR=$SCRIPTDIR DATEYMD=$DATEYMD "${SCRIPTDIR}/run/$RUN"`
done<${SCRIPTDIR}/runlist
echo "To: $TO\nFrom: $FROM\nSubject: $SUBJECT\n\n$BODY" | msmtp --host=$SMTPHOST --auth=off --from=$SENDER $RECEIVER


Осталось назначить запуск по cron-у и вы будете получать пустое письмо :)

Теперь нужно заполнить тело письма полезной информацией. Для этого в подкаталог run добавьте нужные скрипты, которые будут выдавать в стандартный выходной поток необходимую информацию.

Я сделал так:

Файл "00htader" формирует заголовок письма

#!/bin/bash
echo SERVER `hostname` state on $DATEYMD
echo "\n\n"


Файл "01hdd" рассказывает про состояние дисков на сервере

#!/bin/bash
echo DISK VOLUMES STATE
df -hP / /var /home|sed 's/^/ /; s/ *\([^ "]*\("[^"]*"\)\{0,1\}\)/ \1/g; s/^ //; s/ /\t/g;'
echo "\n\n"

Если вы используете LVM, то лучше подойдет такая строчка:
df -hP / /var /home|sed 's/^/ /; s/ *\([^ "]*\("[^"]*"\)\{0,1\}\)/ \1/g; s/^ //; s/ /\t/g; s/\/dev\/mapper\///g'
Или, например если запускаете под Fedora, то следующая строчка сделает вывод более красивым:
df -hP / /var /tmp /boot|sed 's/^/ /; s/ *\([^ "]*\("[^"]*"\)\{0,1\}\)/ \1/g; s/^ //; s/ /\t/g; s/\/dev\///g'

Для Ubuntu можно получать показания landscape-sysinfo сделав файл "02ubuntusysstate"

#!/bin/bash
echo SYSTEM STATE
landscape-sysinfo --sysinfo-plugins=Load,Memory|sed 's/^[ \t]*//'
echo "\n\n"


Для оповещений о разных кодах в логах apache сосздайте файл назвав его, например, "03apachelog"

#!/bin/bash
echo "HTTP 401 CODES"
cat /var/log/httpd/access_log|grep 'HTTP/1.0" 401'
echo "\nLOGIN IN ADMIN PANEL"
cat /var/log/httpd/access_log|grep '/admin/ HTTP/1.0" 200'
echo "\n\n"


Файл "04auth" сообщит о входах и неудачных попытках входа в систему.

#!/bin/bash
echo "FAILED PASSWORD\n"
cat /var/log/secure|grep "Failed password"
echo "ACCEPTED PASSWORD\n"
cat /var/log/secure|grep "Accepted password"
echo "\n\n"


Думаю для начала этого достаточно. Если ывм понадобится мониторить что-либо еще создавайте нужный модуль и кладите в папку run.
Названия файлов я начинал с чичел для правильной сортировки.

Важное замечание:
На разных сборках вывод команды "echo" происходит по разному. Например на Debian (и его клонах) включен режим обработки бэкслэшей, а на Fedora для конструкций типа "\n" или "\t" нужно добавлять ключ -e. Т.е. для примеров модулей, которые я привел выше, нужно писать в таком виде:
echo -e "FAILED PASSWORD\n"

Enjoy!