rdrcollector/rdrcollector.pl

220 lines
6.6 KiB
Perl
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/usr/bin/perl
########################################################
# Сервис сбора RDR потока с CISCO SCE
# Принимает RDR-данные и формирует текстовые файлы
#
# Автор: Сергей Калинин e-mail: banzaj28@yandex.ru
# распространяется под лицензией GPL
# (c) 2015
#########################################################
use strict;
use RDR::Collector;
use IO::File;
use Switch;
use Getopt::Long;
use vars qw(%opts);
my $help = 0;
my $verbose = 0;
my $conf_file;
my $key;
my $value;
GetOptions(\%opts, 'conf=s', 'source-ip=s', 'source-port=s', 'out-dir=s', 'help', 'verbose');
if (defined($opts{'help'}))
{
print STDERR <<EOT;
Сервис сбора RDR потока с CISCO SCE
Принимает RDR-данные и формирует текстовые файлы
Автор: Сергей Калинин e-mail:banzaj28\@yandex.ru (c) 2015
Распространяется под GNU Public License
использование: rdrcollector.pl --conf ConfigFile
rdrcollector.pl --source-ip SourceIP --source-port SourcePort --out-dir OutDir
--conf - Файл конфигурации
или
--source-ip - Адрес интерфейса на котором требуется принимать поток данных
--source-port - номер порта для приёмки потока данных
--out-dir - каталог куда складывать файлы
--help - подсказка
--verbose - вывод полученных данных в консоль
EOT
exit 1;
}
my $opts_pair = IO::File->new("$opts{'conf'}") or
die "Can not open: $opts{'conf'} $!\n";
while (<$opts_pair>)
{
($key, $value) = split('=');
$value =~ s/^\s+|\s+$//g;
$opts{$key} = $value;
#print $opts{'source-port'};
}
$opts_pair->close();
print "ServerIP = $opts{'source-ip'} \nServerPort = $opts{'source-port'}\nOut dir = $opts{'out-dir'}\n";
my $rdr_client = new RDR::Collector(
[
ServerIP => $opts{'source-ip'},
ServerPort => $opts{'source-port'},
Timeout => 2,
DataHandler => \&display_data
]
);
# Setup the local RDR listener
my $status = $rdr_client->connect();
# If we could not listen tell us why.
if ( !$status )
{
print "Status was '".$rdr_client->return_status()."'\n";
print "Error was '".$rdr_client->return_error()."'\n";
exit(0);
}
# Now just wait for RDR data.
$rdr_client->check_data_available();
exit(0);
# This routine is called from DataHandler when the module
# instance is initialised.
# 4 parameters are returned, internal ref, remote IP, remote Port and
# the raw data
sub display_data
{
my ( $glob ) = shift;
my ( $remote_ip ) = shift;
my ( $remote_port ) = shift;
my ( $data ) = shift;
my $attribute_line;
my $data_line;
my @keys = keys %{$data};
# каталог для работы
my $workDir = "$opts{'out-dir'}";
#определяем текущую даты и время
my $date = ` /bin/date "+%Y %m %d %H %M %S"`;
my ($year,$month,$day,$hour,$min,$sec) = split('\s',$date);
#rint "$year,$month,$day,$hour,$min,$sec";
my $outString;
my $date_time;
my $subscriber_id;
my $client_ip;
my $client_port;
my $server_ip;
my $server_port;
my $up;
my $down;
my $info_string;
my $protocol_signature;
my $fileName;
# имя выходного файла, вида /home/svk/tmp/2015/2/26/201502260929
# my $fileName = $workDir."/".$year."".$month."".$day."".$hour."".$min;
# выводим название файла в консоль
# if ( $opts{'verbose'} ) { print "print $fileName;\n"; }
# выдёргиваем нужные нам поля и преобразуем по необходимости
foreach my $key_name ( @keys )
{
#print $key_name." - ".${$data}{$key_name};
$outString = "";
# преобразуем время из unixtime в нормальный вид
if ($key_name eq "report_time" || $key_name eq "end_time")
{
#if (${$data}{$key_name} eq "") {return; }
#print ${$data}{$key_name}."\n";
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime( ${$data}{$key_name} );
$year += 1900;
$mon += 1;
if ($mon < 10)
{
$mon = "0".$mon;
}
if ($mday < 10)
{
$mday = "0".$mday;
}
if ($hour < 10)
{
$hour = "0".$hour;
}
if ($min < 10)
{
$min = "0".$min;
}
if ($sec < 10)
{
$sec = "0".$sec
}
$date_time = "$hour:$min:$sec $mday.$mon.$year";
# имя выходного файла, вида /home/svk/tmp/2015/2/26/201502260929
$fileName = $workDir."/".$year."".$mon."".$mday."".$hour."".$min;
if ( $opts{'verbose'} ) { print "print $fileName;\n"; }
} else {
if ( $opts{'verbose'} ) { print "$key_name - ${$data}{$key_name}\n"; }
}
switch ($key_name) {
case "flavour_id" {
}
case "protocol_signature" {
$protocol_signature = ${$data}{$key_name};
}
case "subscriber_id" {
$subscriber_id = ${$data}{$key_name};
}
case "client_ip" {
$client_ip = ${$data}{$key_name};
}
case "client_port" {
$client_port = ${$data}{$key_name};
}
case "server_ip" {
$server_ip = ${$data}{$key_name};
}
case "server_port" {
$server_port = ${$data}{$key_name};
}
case "info_string" {
$info_string = ${$data}{$key_name};
}
case "session_downstream_volume" {
$down = ${$data}{$key_name};
}
case "session_upstream_volume" {
$up = ${$data}{$key_name};
}
}
}
# создаём файл и открываем его на запись
if ($fileName ne "") {
#print "$fileName\n";
open(fileOut,">> $fileName") or die "cannot open $fileName: $!";
# формируем результат и выводим в файл и в консоль если указана опция --verbose
$outString = $date_time."\t".$subscriber_id."\t".$client_ip.":".$client_port."\t".$server_ip.":".$server_port."\t".$up."/".$down."\t".$protocol_signature."\t".$info_string;
print fileOut $outString."\n";
if ( $opts{'verbose'} ) { print "\n"; }
close fileOut;
}
}