четверг, 16 октября 2008 г.

Построение межпрограмного взаимодействия при помощи logalarm

Инструмент logalarm дает возможности не только своевременного оповещения о ошибках но и построение простейшего межпрограммного взаимодействия.

Задача (пример бредовый, но демонстрирует приёмы построения приложений):

Необходимо по заявке через веб-страницу отправлять журнал за указанный день в e-mail сообщении.

Я прекрасно понимаю что это можно сделать миллионом способов но наш будет совсем оригинальным.

Для исполнения нам потребуется:

1. Веб сервер Apache
2. Модуль logalarm
3. sendmail или аналог.
4. Модули grep,awk,и т.п.
**кроме модуля logalarm все можно найти почти в любой поставке OS Linux.


Для начала разработаем HTML форму для запроса журналов.
Фаил request.html:

<form action="http://myspace.ru/getlog.html" method="get">
Адрес электронной почты:<input name="email" type="text">
Дата журнала[yyyy-mm]:<input name="logdate" type="text">
<input value="Запросить" type="submith">
</form>

Так же создадим фаил getlog.html можно там написать что-то типа "Ваш запрос принят...", а можно оставить пустым.

Далее переходим к части получения запроса.
Этот запрос будет очень хорошо виден в файле access.log сервера apache. (обычно он находится по пути /var/log/apache2/access.log)
чтоб не путать эти запросы с другими мы их отсортируем при помощи grep

# tail -f /var/log/apache2/access.log |grep getlog.html


При запросе нашей формы в файле access.log мы видим строку запроса:

192.168.0.176 - - [24/Sep/2008:19:43:08 +0400] "GET /getlog.html?email=aaa@bbb.ccc&logdate=2008-01 HTTP/1.1" 304 ...


далее осталось только выбрать интересующие нас значения:email и logdate и отправить их в logalarm

# tail -f /var/log/apache2/access.log |grep getlog.html |awk '{print $7}'|awk 'BEGIN {FS="&"} {print substr($1,20)" " substr($2,9)}' | logalarm 'send.sh $(log)s'

Тут возможно все написать в одну строку но я написал вызов модуля отправки через send.sh где сделаю cat файлу pattern_$2.log и отправлю его по адресу $1

Вот собственно и все enjoy!

Комментариев нет: