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