The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Подсчет exim трафика с разделением на локальный и мировой
В файле конфигурации 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}
";
}
 
24.01.2006 , Автор: DelGod
Ключи: perl, exim, traffic / Лицензия: CC-BY
Раздел:    Корень / Программисту и web-разработчику / Perl / Полезные подпрограммы на Perl / Работа с сетью и IP адресами на Perl

Обсуждение [ RSS ]
  • 1.1, Незнайка (ok), 15:54, 24/01/2006 [ответить]  
  • +/
    А что-нить подобное для postfix есть?
     
  • 1.2, Антонио (?), 16:52, 05/02/2006 [ответить]  
  • +/
    Нет, exim рулит
     
  • 1.3, Eagla (ok), 13:41, 08/02/2006 [ответить]  
  • +/
    а какая разница у постфикса тоже файл лога есть
    только не лучше ли по нормальному трафик считать
    приходящий с локальных ип и не с локальных
    например ipacctd или ipcad кому что
    мона киской еще
     
     
  • 2.4, Horol (?), 14:55, 08/02/2006 [^] [^^] [^^^] [ответить]  
  • +/
    а считать  отдельно UA-IX UkrTel-IX локальный по сетке и остальной мировой по каждому почтовому ящику можно?

    сомневаюсь

     
     
  • 3.6, vvvua (??), 11:05, 13/02/2006 [^] [^^] [^^^] [ответить]  
  • +/
    легче написать патч и писать это в базу
     
     
  • 4.7, vgray (ok), 12:20, 13/02/2006 [^] [^^] [^^^] [ответить]  
  • +/
    >легче написать патч и писать это в базу


    а чем встроенный perl не подходит?

     

  • 1.5, vgray (??), 18:51, 12/02/2006 [ответить]  
  • +/
    вот только лог файл будет раздуваться лишними данными, те становится чуть менее читаемым

    мне больше по душе идея сделать unseen роутер,у которого в транспорте будет вызываться перловый скрипт который куда надо уложит размера письма

     
     
  • 2.8, Paladin (??), 19:40, 03/03/2006 [^] [^^] [^^^] [ответить]  
  • +/
    А можно пример конфигурации такого роутера?
     
     
  • 3.9, vgray (??), 07:48, 05/03/2006 [^] [^^] [^^^] [ответить]  
  • +/
    >А можно пример конфигурации такого роутера?


    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_add

    log_router:
        driver = accept
        unseen = true
        transport = logs
        retry_use_local_part

     

  • 1.10, Серж (??), 12:58, 05/12/2006 [ответить]  
  • +/
    Еще существует проект 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.

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру