rdrcollector/rdrcollector.pl

220 lines
6.6 KiB
Perl
Raw Normal View History

2024-08-21 09:27:24 +03:00
#!/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;
}
}