Re: учёт трафика

From
Michael Babakov (2:5020/400)
To
Dmitry Ishutkin
Date
2005-12-05T16:15:02Z
Area
RU.UNIX.SOLARIS
From: Michael Babakov <M.Babakov@sochi.net.ru>

Dmitry Ishutkin wrote:

>>>Можно попробовать откомпилировать cnupm (в портах фри он есть) и снимать
>>>статистику им, он пользуется pcap.
>>  Хоп, записал, если что, то попробую.
> 
> И pmacct "если что" попробуйте. "Тот же спирт, только в профиль" :)
> 
>  > Пока с extended accounting разобрался.
>> Вроде даже работает. :)
> 
> А не обнародуете скриптик, которым из extended accounting в удобоваримый 
> вид вытаскиваете? А то я буквально на той неделе тоже самое делал, но
> очень уж "на коленке" собрал за недостатком времени. Любопытно было бы
> взглянуть.

Ха! Думаешь я его на станке с ЧПУ собирал? :) Та же коленка, только может
левая, а не правая. :) Понятно, что зв основу взят скрипт из документации,
добавлена одна функция и убрано лишнее. Причём, лишнее убрано, похоже не
всё. :)

=== cut ===
#!/usr/perl5/5.6.1/bin/perl

use strict;
#use warnings;
use Sun::Solaris::Exacct qw(:EXACCT_ALL);
use NetAddr::IP ':aton';

die("Usage is dumpexacct <exacct file>\n") unless (@ARGV == 1);

# Open the exact file and display the header information.
my $ef = ea_new_file($ARGV[0], &O_RDONLY) || die(error_str());

# это можно и убрать
printf("Creator:  %s\n", $ef->creator());
printf("Hostname: %s\n\n", $ef->hostname());

# Dump the file contents
while (my $obj = $ef->get()) {
 dump_object($obj, 1);
}

# Report any errors
if (ea_error() != EXR_OK && ea_error() != EXR_EOF)  {
 printf("\nERROR: %s\n", ea_error_str());
 exit(1);
}
exit(0);

sub dump_object {
  my ($obj, $indent) = @_;
  my $istr = '  ' x $indent;

  my @cat = $obj->catalog()->value();

  my %rec = ();
  if ($obj->type() == &EO_ITEM) {
   $indent++; # к чему это?

   my $val = $obj->value();
   if (ref($val)) {
    # как я понял, в нашем случае сюда ни когда не попадём
    dump_object($val, $indent);
   } else {
    # а отсюда возврат в dump_object расположенный ниже
    return ($cat[2], $val);
   }

  } else {
   $indent++; # к чему это?
   foreach my $val ($obj->value()) {
    # возврат из этого рекурсивного вызова чуть выше :)
    my ($c, $v) = dump_object($val, $indent);
    # заполняем наш хэш
    if($c eq 'EXD_FLOW_V4SADDR'){$rec{'saddr'} = inet_aton($v)}
    elsif($c eq 'EXD_FLOW_V4DADDR'){$rec{'daddr'} = inet_aton($v)}
    elsif($c eq 'EXD_FLOW_SPORT'){$rec{'sport'} = $v}
    elsif($c eq 'EXD_FLOW_DPORT'){$rec{'dport'} = $v}
    elsif($c eq 'EXD_FLOW_PROTOCOL'){$rec{'proto'} = $v}
    elsif($c eq 'EXD_FLOW_DSFIELD'){$rec{'dsfld'} = $v}
    elsif($c eq 'EXD_FLOW_CTIME'){$rec{'ctime'} = localtime $v} # тут надо
оставить как есть. localtime использую только для отладки
    elsif($c eq 'EXD_FLOW_LSEEN'){$rec{'lseen'} = $v}
    elsif($c eq 'EXD_FLOW_NBYTES'){$rec{'nbytes'} = $v}
    elsif($c eq 'EXD_FLOW_NPKTS'){$rec{'npkts'} = $v}
   }
  }
  if (defined $rec{'npkts'} ) {
   # вот тут что-то делаем с полученными данными, например, выводим на
печать 
   printf("%s %s %s %s %s %s %s %s\n", 
    $rec{'ctime'}, $rec{'saddr'}, $rec{'daddr'},
    $rec{'sport'}, $rec{'dport'}, $rec{'proto'},
    $rec{'nbytes'}, $rec{'npkts'}, $rec{'lseen'}, $rec{'dsfld'});
  }
}

#--------------------
# преобразуем ip в приятный человеческому глазу вид
sub inet_aton {
 my $a = shift;
 my $ip = new NetAddr::IP($a);
 return $ip;
}
=== cut ===



-- 
С уважением,
 Михаил Бабаков

- ---
e-mail: M.Babakov@sochi.net.ru
http://sochi.net.ru/~mike/

--- ifmail v.2.15dev5.3
 * Origin: - --- (2:5020/400)
SEEN-BY: 46/50 50/203 520 450/159 186 1024 451/30 461/640 469/999 4625/8
SEEN-BY: 4627/10 5000/76 5000 5001/5001 5006/1 5007/1 5010/70 5011/13 5012/46
SEEN-BY: 5015/10 28 5020/118 175 194 400 545 715 758 830 902 937 1042 1169
SEEN-BY: 5020/1523 1604 1922 2020 2238 4441 5021/29 5022/128 5025/3 750
SEEN-BY: 5026/45 5027/16 5030/49 115 436 556 966 1900 1957 5031/47 72 5035/3
SEEN-BY: 5035/38 5036/1 5040/47 5045/7 5051/15 5053/16 5054/1 4 8 9 28 35 37
SEEN-BY: 5057/1 5060/88 5061/15 120 5062/1 10 5066/18 5067/2 5069/7 5070/1222
SEEN-BY: 5074/9 5075/5 5080/80 1003 5081/2 5082/6 5083/21 5085/13 5090/113
SEEN-BY: 5093/57 5095/20 5096/18 6000/254 6001/3
PATH: 5020/400 4441 545 5054/1 37