Страница 1 из 1
Анализ логов cnupm
Добавлено: 2008-07-25 8:49:21
different
Здравствуйте.
Есть сервер под OpenBSD. Трафик на нем считается через cnupm.
Есть нужда анализировать .dupm спирта и составлять отчеты, кто и сколько трафика сожрал.
Чем?
Заранее спасибо.
Re: Анализ логов cnupm
Добавлено: 2008-07-25 9:19:01
manefesto
здесь народ писал
http://osdir.com/ml/openbsd.misc.ru/200 ... 00191.html
Анализатора логов нету. Есть самописный.
Надо посмотреть ваш спирт, не зря же я перл учил
Re: Анализ логов cnupm
Добавлено: 2008-07-25 11:14:02
different
Формат фалйа, после перегонки бинарного в текстовый:
<beg_date> <end_date> <src_addr> <dst_addr> <ip_proto> <nbytes>
Желательно енто разобрать и загнать в БД, суммируя трафик по IP. Чтобы потом привинтить отчеты по юзерам и Web-интерфейс.
Re: Анализ логов cnupm
Добавлено: 2008-07-25 11:15:58
different
Примеры записей с боевого сервера:
2007-12-07 11:47:54 2007-12-07 11:52:54 212.23.83.157:443 195.58.28.249:63754 tcp 5433
2007-12-07 11:47:54 2007-12-07 11:52:54 212.23.83.157:443 195.58.28.249:50706 tcp 3632
2007-12-07 11:47:54 2007-12-07 11:52:54 212.23.83.157:443 195.58.28.249:54547 tcp 2434
2007-12-07 11:47:54 2007-12-07 11:52:54 212.23.83.157:443 195.58.28.249:52250 tcp 1533
Re: Анализ логов cnupm
Добавлено: 2008-07-25 12:51:10
manefesto
давай кидай мне пример лог файла по почте. буду вечером смотреть
Re: Анализ логов cnupm
Добавлено: 2008-07-25 13:23:42
different
Весь логфайл - это 250 метров бинарника или 280 текста
Точно весь кинуть?
Re: Анализ логов cnupm
Добавлено: 2008-07-25 13:37:37
manefesto
блин....давай не больше метра....аналайзер постараюсь наколупать из имеющегоса....
Или давай 1000 строк....думаю хватит
============================
И напиши как ты видишь интерфейс
Re: Анализ логов cnupm
Добавлено: 2008-07-25 14:05:42
Alex Keda
текст как вы привели - пожёмтся раз в 10
так что
искать ключик
Re: Анализ логов cnupm
Добавлено: 2008-07-25 14:09:40
different
http://ifolder.ru/7465736
1000 строк лога в текстовом формате, 11кб
Интерфейс: мне лично нужен список ТОП10 людей по количеству скачанного и по каждому из людей - топ10 хостов, откуда качали. В идеале.
Если никак - можно просто выгрузку в БД, а вывод в веб я сам нарисую

Re: Анализ логов cnupm
Добавлено: 2008-07-25 14:14:54
Alex Keda
Код: Выделить всё
# loading data from file into temporary table
${mysql_conn} --execute="LOAD DATA INFILE '${tmp_file}' INTO TABLE \`tmp_traffic_table\` FIELDS TERMINATED BY ' ' LINES TERMINATED BY '\n'"
подробности - в разделе шелл-скриптинга и скриптах настроганных на коленке.
хотя, идея должна быть и так ясна

))
Re: Анализ логов cnupm
Добавлено: 2008-07-25 18:09:25
manefesto
different писал(а):http://ifolder.ru/7465736
1000 строк лога в текстовом формате, 11кб
Интерфейс: мне лично нужен список ТОП10 людей по количеству скачанного и по каждому из людей - топ10 хостов, откуда качали. В идеале.
Если никак - можно просто выгрузку в БД, а вывод в веб я сам нарисую

выгрузку то как нефиг нафиг в бд, а вот топ10 на самом деле можешь через
sql сделать
Щас попробуем.
Re: Анализ логов cnupm
Добавлено: 2008-07-27 21:03:23
manefesto
короче написал часть скрипта. Но вот insert в мусуль у меня застопорился, ибо чото с мускулем у меня не очень лады. Постараюсь завтра закинуть черновой вариант.
Re: Анализ логов cnupm
Добавлено: 2008-07-28 7:48:08
manefesto
короче ниже код. Заносит все данные в базу.
Код: Выделить всё
#!/usr/bin/perl
use DBI;
#connect with database
my $dsn = 'DBI:mysql:cnupm:127.0.0.1';
my $db_user_name = 'root';
my $db_password = 'your_password';
my ($id, $password);
my $dbh = DBI->connect($dsn, $db_user_name, $db_password);
#read all data from logfile
open(LOG,$ARGV[0]);
@content=<LOG>;
close(LOG);
#split and insert into database
foreach $line(@content){
($stdate,$sttime,$enddate,$endtime,$srcadrport,$dstadrport,$proto,$port)=split(/\s/,$line);
($srcadr,$srcport)=split(/\:/,$srcadrport);
($dstadr,$dstport)=split(/\:/,$dstadrport);
$sth = $dbh->prepare("INSERT INTO logs VALUES('".$stdate."','".$sttime."','".$enddate."','".$endtime."',
'".$srcadr."','".$srcport."','".$dstadr."','".$dstport."','".$proto."','".$port."')");
$sth->execute;
$sth->finish;
}
я назвал его
parse.pl
запускается так:
Может кто-то и сделал бы всё это на
sh, но я сделал как умею.
Совсем забыл. Надо будет поставить
p5-DBI-mysql.
Потом попробую как нибудь web-морду прикрутить и сделать графики в
mrtg если народ скажет что это ООчень надо.
Re: Анализ логов cnupm
Добавлено: 2008-07-28 14:44:09
manefesto
короче я понял что я ничего не сделал.
Вечером посижу. Попробую написать чтобы top10 выводил из лога. Да и чтобы диапазон дат можно было указывать.
Напомни,а то забуду.
Re: Анализ логов cnupm
Добавлено: 2008-08-01 20:55:12
different
Мы свой вариант накатали - завтра выложу
Вроде работает.
Re: Анализ логов cnupm
Добавлено: 2008-08-09 19:26:13
_Andy
В Simple Traffic Billing такой скрипт есть, как раз на перле:
Код: Выделить всё
#!/usr/bin/perl
# STB - Simple Traffic Billing
# Version-0.1.1-beta
# Author: Boo (yolkapalka@bk.ru)
use Time::localtime;
use Fcntl ':flock';
$tm = localtime;
$y = $tm->year + 1900;
$m = $tm->mon + 1;
$d = $tm->mday;
$h = $tm->hour;
$dir = $0;
$dir =~ s/[^\/]{1,}$//;
require "$dir/readcfg.inc";
($mask) = ($localnet =~ /(\d+.\d+).\d+.\d+/);
$net = $mask;
system("/sbin/pfctl -q -Tl -f /etc/pf.conf");
foreach $int (@int_if) {
open(pid, "<$cnupm_path/cnupm-$int.pid");
while(<pid>) {
chomp;
kill "HUP", $_;
kill "INFO", $_;
}
sleep(10);
if(open(Dump ,"<$cnupm_path/cnupm-$int.dump")) {
while(1) {
if(flock(Dump, LOCK_EX)) {
@temp = `/usr/local/sbin/cnupmstat -B -E -P $int`;
unlink "$cnupm_path/cnupm-$int.dump";
flock(Dump, LOCK_UN);
last;
}
}
}
close(Dump);
foreach $string (@temp) {
push @dump, $string;
}
}
my @ip;
if (@dump) {
open(traffic, "+<$stb_path/etc/traffic.ip");
flock(traffic, LOCK_EX);
while(<traffic>) {
chomp;
next unless $_;
@t = split(':');
$tr_name{$t[1]} = $t[0];
push @ip, $t[1];
$tr_out{$t[1]} = $t[2];
$tr_in{$t[1]} = $t[3];
$tr_all_old{$t[1]} = $t[2] + $t[3];
$tr_last{$t[1]} = $t[4];
$last_update{$t[1]} = $t[5];
$last_traff{$t[1]} = $t[6];
$last_date{$t[1]} = $t[7];
$fio{$t[1]} = $t[8];
$adr{$t[1]} = $t[9];
$phone{$t[1]} = $t[10];
}
foreach $f (@ip) {
$startcurhour = 0;
$endcurhour = 0;
open(reports, "<$stb_path/reports/$y-$m-$d\_$f");
while (<reports>) {
chomp;
next unless $_;
if($_ eq "<h=$h>") {
$startcurhour = 1; next;
}
if(($startcurhour == 1)and($_ eq "</h>")) {
$endcurhour = 1; last;
}
if(($startcurhour == 1)and($endcurhour != 1)) {
@t = split(':');
$hosts_traff{$f}{$t[0]} = "$t[1]:$t[2]";
} else {
push @{$other_reports{$f}}, $_;
}
}
close(reports);
}
open(passip, "<$stb_path/etc/pass.ip");
while(<passip>) {
chomp;
next unless $_;
push @passip, $_;
}
close(passip);
chomp(@dump);
foreach $i (@dump) {
$i =~ /(\d+.\d+)(.\d+.\d+) (\d+.\d+)(.\d+.\d+) (\w+) (\d+)/;
if ($1 eq $net) {
$tr_out{"$1$2"} = $tr_out{"$1$2"} + $6;
@i = split(':', $hosts_traff{"$1$2"}{"$3$4"});
$hout = $i[0] + $6;
if ($hout eq "") { $hout = 0; }
if ($i[1] eq "") { $i[1] = 0; }
$hosts_traff{"$1$2"}{"$3$4"} = "$hout:$i[1]";
} elsif ($3 eq $net) {
$tr_in{"$3$4"} = $tr_in{"$3$4"} + $6;
@i = split(':', $hosts_traff{"$3$4"}{"$1$2"});
$hin = $i[1] + $6;
if ($i[0] eq "") { $i[0] = 0; }
if ($hin eq "") { $hin = 0; }
$hosts_traff{"$3$4"}{"$1$2"} = "$i[0]:$hin";
}
}
seek(traffic, 0, 0);
foreach $i (@ip) {
$tr_last{$i} = ($tr_last{$i} - (($tr_in{$i} + $tr_out{$i}) - $tr_all_old{$i}));
printf traffic "$tr_name{$i}:$i:$tr_out{$i}:$tr_in{$i}:$tr_last{$i}:$last_update{$i}:$last_traff{$i}:$last_date{$i}:$fio{$i}:$adr{$i}:$phone{$i}\n";
foreach $t (@passip) {
if ($t eq $i) {
$pass = $i;
}
}
if ($tr_last{$i} > 0) {
if ($pass eq $i) {
system("/sbin/pfctl -q -t passip -Ta $i");
} else {
system("/sbin/pfctl -q -t passip -Td $i");
system("/sbin/pfctl -q -k $i");
}
} else {
if ($pass eq $i) {
system("/sbin/pfctl -q -t passip -Td $i");
system("/sbin/pfctl -q -k $i");
open(passip, ">$stb_path/etc/pass.ip");
flock(passip, LOCK_EX);
foreach $t (@passip) {
if ($t ne $i) {
printf passip "$t\n";
}
}
flock(passip, LOCK_UN);
close(passip);
}
}
}
flock(traffic, LOCK_UN);
close(traffic);
foreach $f (@ip) {
%tr = %{$hosts_traff{$f}};
if((%tr != "")or($other_reports{$f}[0] ne "")) {
$no_rep = "0";
unless(-e "$stb_path/reports/$y-$m-$d\_$f") {
$no_rep = "1";
}
open(reports, ">$stb_path/reports/$y-$m-$d\_$f") or die "$!\n";
flock(reports, LOCK_EX);
if($other_reports{$f}[0] ne "") {
foreach $other_report (@{$other_reports{$f}}) {
printf reports "$other_report\n";
}
}
if(%tr != "") {
printf reports "<h=$h>\n";
}
foreach $l (sort {$tr{$a} <=> $tr{$b} } keys %tr) {
printf reports "$l:$tr{$l}\n";
}
if(%tr != "") {
printf reports "</h>\n";
}
flock(reports, LOCK_UN);
close(reports);
if($no_rep eq "1") {
my ($uid, $gid) = (getpwnam("$httpd_user"))[2,3];
chown($uid, $gid, "$stb_path/reports/$y-$m-$d\_$f");
}
}
}
}
Re: Анализ логов cnupm
Добавлено: 2008-08-19 16:00:28
sckif
да на самом деле просто кто нить взял да доделал STB хорошая софтина минус в том что там просто недоделаны отчеты по протоколам и нету тупо возможности указать чтобы считал по месяцам и все

Re: Анализ логов cnupm
Добавлено: 2008-09-15 20:10:37
~>cerber<~
manefesto, different,
что-то доделали, поделитесь? чтоб с 0-я не писать..
Re: Анализ логов cnupm
Добавлено: 2008-10-23 18:27:00
manefesto
я честно ничо не делал.
Меня никто не просил.
Я тока в базу писать начал.
Надо будет...напишу.
Re: Анализ логов cnupm
Добавлено: 2010-06-23 9:25:47
dynax60
Если это еще актуально. Я как-то давно делал на perl, если интересно:
http://dynax60.blogspot.com/2010/06/cnu ... msave.html