Анализ логов cnupm

Вопросы настройки и работы с этой ОС.
Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
different
проходил мимо

Анализ логов cnupm

Непрочитанное сообщение different » 2008-07-25 8:49:21

Здравствуйте.

Есть сервер под OpenBSD. Трафик на нем считается через cnupm.

Есть нужда анализировать .dupm спирта и составлять отчеты, кто и сколько трафика сожрал.

Чем?

Заранее спасибо.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
manefesto
Группенфюррер
Сообщения: 6934
Зарегистрирован: 2007-07-20 8:27:30
Откуда: Пермь
Контактная информация:

Re: Анализ логов cnupm

Непрочитанное сообщение manefesto » 2008-07-25 9:19:01

здесь народ писал http://osdir.com/ml/openbsd.misc.ru/200 ... 00191.html
Анализатора логов нету. Есть самописный.
Надо посмотреть ваш спирт, не зря же я перл учил
я такой яростный шо аж пиздеЦ
Изображение

different
проходил мимо

Re: Анализ логов cnupm

Непрочитанное сообщение different » 2008-07-25 11:14:02

Формат фалйа, после перегонки бинарного в текстовый:

<beg_date> <end_date> <src_addr> <dst_addr> <ip_proto> <nbytes>

Желательно енто разобрать и загнать в БД, суммируя трафик по IP. Чтобы потом привинтить отчеты по юзерам и Web-интерфейс.

different
проходил мимо

Re: Анализ логов cnupm

Непрочитанное сообщение different » 2008-07-25 11:15:58

Примеры записей с боевого сервера:

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

Аватара пользователя
manefesto
Группенфюррер
Сообщения: 6934
Зарегистрирован: 2007-07-20 8:27:30
Откуда: Пермь
Контактная информация:

Re: Анализ логов cnupm

Непрочитанное сообщение manefesto » 2008-07-25 12:51:10

давай кидай мне пример лог файла по почте. буду вечером смотреть
я такой яростный шо аж пиздеЦ
Изображение

different
проходил мимо

Re: Анализ логов cnupm

Непрочитанное сообщение different » 2008-07-25 13:23:42

Весь логфайл - это 250 метров бинарника или 280 текста :)

Точно весь кинуть?

Аватара пользователя
manefesto
Группенфюррер
Сообщения: 6934
Зарегистрирован: 2007-07-20 8:27:30
Откуда: Пермь
Контактная информация:

Re: Анализ логов cnupm

Непрочитанное сообщение manefesto » 2008-07-25 13:37:37

блин....давай не больше метра....аналайзер постараюсь наколупать из имеющегоса....
Или давай 1000 строк....думаю хватит
============================
И напиши как ты видишь интерфейс
я такой яростный шо аж пиздеЦ
Изображение

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35462
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Анализ логов cnupm

Непрочитанное сообщение Alex Keda » 2008-07-25 14:05:42

текст как вы привели - пожёмтся раз в 10
так что

Код: Выделить всё

man bzip2
искать ключик
Убей их всех! Бог потом рассортирует...

different
проходил мимо

Re: Анализ логов cnupm

Непрочитанное сообщение different » 2008-07-25 14:09:40

http://ifolder.ru/7465736

1000 строк лога в текстовом формате, 11кб

Интерфейс: мне лично нужен список ТОП10 людей по количеству скачанного и по каждому из людей - топ10 хостов, откуда качали. В идеале. :)

Если никак - можно просто выгрузку в БД, а вывод в веб я сам нарисую :)

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35462
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Анализ логов cnupm

Непрочитанное сообщение Alex Keda » 2008-07-25 14:14:54

Код: Выделить всё

# 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'"
подробности - в разделе шелл-скриптинга и скриптах настроганных на коленке.
хотя, идея должна быть и так ясна =)))
Убей их всех! Бог потом рассортирует...

Аватара пользователя
manefesto
Группенфюррер
Сообщения: 6934
Зарегистрирован: 2007-07-20 8:27:30
Откуда: Пермь
Контактная информация:

Re: Анализ логов cnupm

Непрочитанное сообщение manefesto » 2008-07-25 18:09:25

different писал(а):http://ifolder.ru/7465736

1000 строк лога в текстовом формате, 11кб

Интерфейс: мне лично нужен список ТОП10 людей по количеству скачанного и по каждому из людей - топ10 хостов, откуда качали. В идеале. :)

Если никак - можно просто выгрузку в БД, а вывод в веб я сам нарисую :)
выгрузку то как нефиг нафиг в бд, а вот топ10 на самом деле можешь через sql сделать
Щас попробуем.
я такой яростный шо аж пиздеЦ
Изображение

Аватара пользователя
manefesto
Группенфюррер
Сообщения: 6934
Зарегистрирован: 2007-07-20 8:27:30
Откуда: Пермь
Контактная информация:

Re: Анализ логов cnupm

Непрочитанное сообщение manefesto » 2008-07-27 21:03:23

короче написал часть скрипта. Но вот insert в мусуль у меня застопорился, ибо чото с мускулем у меня не очень лады. Постараюсь завтра закинуть черновой вариант.
я такой яростный шо аж пиздеЦ
Изображение

Аватара пользователя
manefesto
Группенфюррер
Сообщения: 6934
Зарегистрирован: 2007-07-20 8:27:30
Откуда: Пермь
Контактная информация:

Re: Анализ логов cnupm

Непрочитанное сообщение manefesto » 2008-07-28 7:48:08

короче ниже код. Заносит все данные в базу.

Код: Выделить всё

#!/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
запускается так:

Код: Выделить всё

parse.pl log1k.log
Может кто-то и сделал бы всё это на sh, но я сделал как умею.
Совсем забыл. Надо будет поставить p5-DBI-mysql.
Потом попробую как нибудь web-морду прикрутить и сделать графики в mrtg если народ скажет что это ООчень надо.
я такой яростный шо аж пиздеЦ
Изображение

Аватара пользователя
manefesto
Группенфюррер
Сообщения: 6934
Зарегистрирован: 2007-07-20 8:27:30
Откуда: Пермь
Контактная информация:

Re: Анализ логов cnupm

Непрочитанное сообщение manefesto » 2008-07-28 14:44:09

короче я понял что я ничего не сделал.
Вечером посижу. Попробую написать чтобы top10 выводил из лога. Да и чтобы диапазон дат можно было указывать.
Напомни,а то забуду.
я такой яростный шо аж пиздеЦ
Изображение

different
проходил мимо

Re: Анализ логов cnupm

Непрочитанное сообщение different » 2008-08-01 20:55:12

Мы свой вариант накатали - завтра выложу :)
Вроде работает.

_Andy
проходил мимо

Re: Анализ логов cnupm

Непрочитанное сообщение _Andy » 2008-08-09 19:26:13

В 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");
	    }
	}
    }
}

sckif
мл. сержант
Сообщения: 116
Зарегистрирован: 2007-07-16 11:28:42

Re: Анализ логов cnupm

Непрочитанное сообщение sckif » 2008-08-19 16:00:28

да на самом деле просто кто нить взял да доделал STB хорошая софтина минус в том что там просто недоделаны отчеты по протоколам и нету тупо возможности указать чтобы считал по месяцам и все :)

Аватара пользователя
~>cerber<~
мл. сержант
Сообщения: 112
Зарегистрирован: 2007-06-23 0:58:32
Откуда: [UKRAINE]
Контактная информация:

Re: Анализ логов cnupm

Непрочитанное сообщение ~>cerber<~ » 2008-09-15 20:10:37

manefesto, different,
что-то доделали, поделитесь? чтоб с 0-я не писать..
;aka coolchevy
live free or die;

Аватара пользователя
manefesto
Группенфюррер
Сообщения: 6934
Зарегистрирован: 2007-07-20 8:27:30
Откуда: Пермь
Контактная информация:

Re: Анализ логов cnupm

Непрочитанное сообщение manefesto » 2008-10-23 18:27:00

я честно ничо не делал.
Меня никто не просил.
Я тока в базу писать начал.
Надо будет...напишу.
я такой яростный шо аж пиздеЦ
Изображение

Аватара пользователя
dynax60
проходил мимо
Сообщения: 4
Зарегистрирован: 2010-06-23 9:21:18

Re: Анализ логов cnupm

Непрочитанное сообщение dynax60 » 2010-06-23 9:25:47

Если это еще актуально. Я как-то давно делал на perl, если интересно:
http://dynax60.blogspot.com/2010/06/cnu ... msave.html