пятница, 26 ноября 2010 г.

Почтовый бот

Автоматизация наше все =)

На одной из моих подработок часто возникала задача заблокировать какой-то из адресов на сервере. Чтобы человеку с этого ip нельзя было зайти ни на один из сайтов.
В принципе, телодвижений минимум, но делать это все равно не очень хотелось - уж очень однообразно. А однообразные задачи несложно автоматизировать. Вот я и задумался над вопросом автоматизации этой операции.
Итак, какие операции мне требуется выполнять программно?
1. Забирать письма из определенного почтового ящика
2. Выбирать из этого письма ip-адрес
3. Добавлять адрес в определенную цепочку файрвола
4. Удалить письмо, как более не нужное

Работа с письмами

Для работы с письмами я выбрал легковесный, но подходящий для моих целей сборщик писем - getmail.
В конфигурационном файле также указал, что собранные письма следует сразу же удалять.
Вот такой конфигурационный файл (getmailrc):

[retriever]
type = SimpleIMAPRetriever
server = mail.v-midas.com
username = xxxx@xxxx.com
password = yyyyyy

[destination]
type = Maildir
path = ~/.maildir/


Для писем, как уже видно из конфига создана директория ~/.maildir. Во время испытаний оказалось, что getmail не умеет создавать поддректории и поэтому их придется создать самостоятельно. В ~/.maildir нужно создать new cur tmp.

Файрвол

Тут все достаточно тривиально. Для блокировки создана отдельная цепочка, в которую и заносятся все записи. В моем случае это цепочка blocked.

Автоматизация

Естественно, автоматизация всех описанных в начале операций выполнена в виде bash-скрипта. Вот он:

#!/bin/bash

export HOME="/home/blocked"
export DISPLAY=":0"
CUR_PATH="$HOME/.getmail"
cd $CUR_PATH
MAIL_DIR="$HOME/.maildir"
export LANG="ru_RU.UTF-8"
export LC_ALL="$LANG"
FPID="/tmp/cc.pid"


date
if [ -s $FPID ]; then
echo "found cc.pid"
cat $FPID
rm $FPID
exit 78
fi

echo $$ >$FPID

getmail -n 1>std.msg 2>err.msg

sleep 2

mailfiles=`ls $HOME/.maildir/new`

for i in $mailfiles
do
iptables -A blocked -s `cat $HOME/.maildir/new/$i | egrep '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'` -j REJECT
done


rm $FPID


Этот скрипт запускается по крону раз в 10 минут. В него можно добавить еще много разных функций, если вдруг это потребуется.

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

Отправить комментарий