В файле конфигурации exim пишем:log_file_path = /var/log/exim/exim-%s-%D.log
log_selector = +delivery_size +sender_on_delivery +received_recipientsВ файл /var/db/ukr_net ложим список украинских сетей
И собствено скрипт для подсчета трафика с разделением на украинский и мировой:
#!/usr/bin/perl -w
my ($nmin, $nmax) = (32,0);
open UKRNETS, "/var/db/ukr_net";
while (<UKRNETS>) {
s/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\/([0-9]+)$//;
$UkrIPs{substr(substr(unpack("B32", pack("N", $1)),24).substr(unpack("B32", pack("N", $2)),24).substr(unpack("B32", pack("N", $3)),24).substr(unpack("B32", pack("N", $4)),24),0,$5)}="$1.$2.$3.$4\/$5";
$nmin = $5 if $5 < $nmin;
$nmax = $5 if $5 > $nmax;
}
close UKRNETS;open TRAFF, '/var/log/exim/exim-main-20060122.log';
while (<TRAFF>) {
my ($mail_from,$mail_to,$ip,$bytes_in,$bytes_out);
if (/^[0-9-]+ [0-9:]+ [A-Za-z0-9]{6}-[A-Za-z0-9]{6}-[A-Za-z0-9]{2} <= ([^\@]+@[A-Za-z0-9-.]+).* H=.*\[([0-9.]+)\].* S=([0-9]+).* for ([^\@]+@[A-Za-z0-9-.]+)$/) {
$mail_1=$1;
$mail_2=$4;
$ip=$2;
$bytes_in=$3;
$bytes_out=0;
} elsif (/^[0-9-]+ [0-9:]+ [A-Za-z0-9]{6}-[A-Za-z0-9]{6}-[A-Za-z0-9]{2} [\=\-\*]\> ([^\@]+@[A-Za-z0-9-.]+).* F=\<([^\@]+@[A-Za-z0-9-.]+)\>.* T=remote_smtp S=([0-9]+).* H=.*\[([0-9.]+)\].*/) {
$mail_1=$2;
$mail_2=$1;
$ip=$4;
$bytes_in=0;
$bytes_out=$3;
}
if ((defined($ip)) and ($ip =~ /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/)) {
my $ipB=substr(unpack("B32", pack("N", $1)),24)."".substr(unpack("B32", pack("N", $2)),24)."".substr(unpack("B32", pack("N", $3)),24)."".substr(unpack("B32", pack("N", $4)),24);
for ($Ne=$nmax; $Ne>=$nmin; $Ne--) {
my $ipBin=substr($ipB,0,$Ne);
if ($UkrIPs{$ipBin}) {
$m_from{$mail_1}{ukr}{in} +=$bytes_in;
$m_from{$mail_2}{ukr}{in} +=$bytes_in;
$m_from{$mail_1}{ukr}{out}+=$bytes_out;$m_from{$mail_1}{mir}{in} -=$bytes_in;
$m_from{$mail_2}{mir}{in} -=$bytes_in;
$m_from{$mail_1}{mir}{out}-=$bytes_out;
last;
}
}
$m_from{$mail_1}{mir}{in} +=$bytes_in;
$m_from{$mail_2}{mir}{in} +=$bytes_in;
$m_from{$mail_1}{mir}{out}+=$bytes_out;
}
}
close TRAFF;my $i=0;
foreach $mails (keys %m_from) {
$i++;
print "$i $mails
in ukr $m_from{$mails}{ukr}{in}
out ukr $m_from{$mails}{ukr}{out}
in mir $m_from{$mails}{mir}{in}
out mir $m_from{$mails}{mir}{out}
";
}URL:
Обсуждается: http://www.opennet.me/tips/info/971.shtml
А что-нить подобное для postfix есть?
Нет, exim рулит
а какая разница у постфикса тоже файл лога есть
только не лучше ли по нормальному трафик считать
приходящий с локальных ип и не с локальных
например ipacctd или ipcad кому что
мона киской еще
а считать отдельно UA-IX UkrTel-IX локальный по сетке и остальной мировой по каждому почтовому ящику можно?сомневаюсь
легче написать патч и писать это в базу
>легче написать патч и писать это в базу
а чем встроенный perl не подходит?
вот только лог файл будет раздуваться лишними данными, те становится чуть менее читаемыммне больше по душе идея сделать unseen роутер,у которого в транспорте будет вызываться перловый скрипт который куда надо уложит размера письма
А можно пример конфигурации такого роутера?
>А можно пример конфигурации такого роутера?
logs:
driver = pipe
command = "/usr/local/etc/exim/size.pl ${return_path} ${local_part}
${domain} ${tod_log} ${message_size}"
current_directory = /usr/local/etc/exim/
user = mailnull
group = mail
no_return_output
no_return_path_addlog_router:
driver = accept
unseen = true
transport = logs
retry_use_local_part
Еще существует проект ExiBomb Mail Statistics & Logging.http://sourceforge.net/projects/exibomb/
ExiBomb is a system designd to monitor mail traffic on the Exim based MTA server. The interface is developed in PHP. It reads the maillogs in a tail method and stores all relevant data in a MYSQL Database.The script reading the logs was developed in PERL.