perl скрипт обработчика логов postfix
Добавлено: 2010-03-17 13:45:22
Здравствуйте господа программисты.
Настроил по этой статье http://www.lissyara.su/articles/freebsd ... tatistics/. Вместе с тем мне надо, чтобы в БД заносился статус письма (отправлено ли, доставлено ли в ящик юзеру, не отправилось ли и т.п.).
С перлом столкнулся впервые, накачал книг, но изучение займет продолжительное время пока сам смогу сделать.
Скрипт из той статьи:
В другой статье вычитал принцип работы скрипта, но не могу понять как добавить, то что с письмом в итоге стало.
Помогите, пожалуйста, разобраться.
Настроил по этой статье http://www.lissyara.su/articles/freebsd ... tatistics/. Вместе с тем мне надо, чтобы в БД заносился статус письма (отправлено ли, доставлено ли в ящик юзеру, не отправилось ли и т.п.).
С перлом столкнулся впервые, накачал книг, но изучение займет продолжительное время пока сам смогу сделать.
Скрипт из той статьи:
Код: Выделить всё
cat maillog.pl
#!/usr/local/bin/perl
use DBI;
$dbh = DBI->connect("DBI:mysql:host=localhost;database=maillogs","mailuser","mailuser")
or die "Нет доступа к СУБД!";
#$insert = "INSERT INTO mails (id,year,month,day,time,ip,mailfrom,rcptto,size) VALUES(?,?,?,?,?,?,?,?,?)";
$insert = "INSERT INTO mails (id,year,month,day,time,ip,mailfrom,rcptto,size,status) VALUES(?,?,?,?,?,?,?,?,?,?)";
$sth = $dbh->prepare("$insert");
my %rec;
open(MAIL, "/var/log/maillog");
while ($line = <MAIL>)
{
my ($month, $day, $time, $hostname, $servicename, $id, $message) = split /\s+/, $line, 7;
if ($id =~ /([a-z0-9]+)\:/i)
{
$id = $1;
$rec{$id} = {}
unless ($rec{$id});
if ($message =~ 'removed')
{
$rec{$id}->{'removed'}++;
}
else
{
# while ($message =~ /(client|size|from|to)=(\S+?)(\s|,)/g)
while ($message =~ /(client|size|from|to|status)=(\S+?)(\s|,)/g)
по аналогии добавил status - в бд теперь заносится при любых вариантах слово sent
{
if ($1 eq 'client') {
$rec{$id}->{'month'} = sprintf "%s", $month;
$rec{$id}->{'day'} = sprintf "%d", $day;
$rec{$id}->{'time'} = sprintf "%s", $time;
}
$rec{$id}->{$1} = $2;
}
}
}
}
close(MAIL);
($year) = (localtime)[5];
$timy = ("%02d\n", $year + 1900);
foreach my $id (sort { $rec{$a}->{'time'} cmp $rec{$b}->{'time'} } keys %rec)
{
$rec{$id}->{'client'} =~ s/(.+)\[(\d+\.\d+\.\d+\.\d+)\]/$2/;
$rec{$id}->{'from'} =~ s/<(.+)>/$1/;
$rec{$id}->{'to'} =~ s/<(.+)>/$1/;
if (
$rec{$id}->{'removed'}
&&
$rec{$id}->{'client'} ne '127.0.0.1'
)
{
if ($rec{$id}->{'from'} ne 'root@fortero.su')
{
$sth1 = $dbh->selectrow_arrayref("SELECT COUNT(*) FROM mails");
$iddt = "$sth1->[0]";
$idd = $iddt + 1;
# $sth->execute($idd,$timy,$rec{$id}->{'month'},$rec{$id}->{'day'},$rec{$id}->{'time'},$rec{$id}->{'client'},$rec{$id}->{'from'},$rec{$id}->{'to'},$rec{$id}->{'size'});
$sth->execute($idd,$timy,$rec{$id}->{'month'},$rec{$id}->{'day'},$rec{$id}->{'time'},$rec{$id}->{'client'},$rec{$id}->{'from'},$rec{$id}->{'to'},$rec{$id}->{'size'},$rec{$id}->{'status'});
}
}
}
$sth1->finish;
$sth->finish;
$dbh->disconnect;
Помогите, пожалуйста, разобраться.