2023-11-08 14:23:03 +03:00
|
|
|
# импорт базовых библиотек
|
|
|
|
use strict;
|
|
|
|
use warnings;
|
|
|
|
use utf8;
|
|
|
|
use v5.28;
|
|
|
|
|
|
|
|
# настройка модулей библиотек
|
|
|
|
use open qw( :std :encoding(UTF-8) );
|
|
|
|
|
|
|
|
# импорт внешних библиотек
|
|
|
|
use DBI;
|
|
|
|
|
|
|
|
# импорт конкрентых модулей внешних библиотек
|
|
|
|
use Data::Dumper;
|
|
|
|
|
|
|
|
# ------------------- Общие параметры ---------------------------
|
|
|
|
|
|
|
|
my $dbi_info = 'dbi:Pg:dbname=postgres;host=localhost;port=5432';
|
|
|
|
my $db_username = 'postgres';
|
|
|
|
my $db_password = '0000';
|
|
|
|
|
|
|
|
my $insert_log_template =
|
|
|
|
'INSERT INTO log (created,int_id,str,address) values (?,?,?,?)';
|
|
|
|
my $insert_message_template =
|
|
|
|
'INSERT INTO message (created,id,int_id,str) values (?,?,?,?)';
|
|
|
|
my $regex_for_get_id = qr( id=(\S*) ?);
|
2023-11-09 14:49:14 +03:00
|
|
|
my $regex_get_address_for_log_with_blackhole = qr( \<(.*\@.*)\> );
|
|
|
|
my $regex_get_address_for_log_without_blackhole = qr( (\S*\@\S*) );
|
2023-11-08 14:23:03 +03:00
|
|
|
my $file_path = "log/out";
|
|
|
|
|
|
|
|
# ------------------- ------------- ---------------------------
|
|
|
|
|
|
|
|
sub _get_id {
|
|
|
|
my $str = shift;
|
|
|
|
|
|
|
|
if ( $str =~ /$regex_for_get_id/ ) {
|
|
|
|
return $1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub _get_address {
|
|
|
|
my $str = shift;
|
|
|
|
|
|
|
|
if ( $str =~ /:blackhole:/ ) {
|
2023-11-09 14:49:14 +03:00
|
|
|
$str =~ /$regex_get_address_for_log_with_blackhole/;
|
2023-11-08 14:23:03 +03:00
|
|
|
return $1;
|
|
|
|
}
|
|
|
|
else {
|
2023-11-09 14:49:14 +03:00
|
|
|
$str =~ /$regex_get_address_for_log_without_blackhole/;
|
2023-11-08 14:23:03 +03:00
|
|
|
return $1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub _parce_row_log {
|
|
|
|
my $row = shift;
|
|
|
|
|
|
|
|
chomp($row);
|
|
|
|
|
|
|
|
my @s_row = split( " ", $row );
|
|
|
|
my $created = join( " ", @s_row[ 0, 1 ] );
|
|
|
|
my $int_id = $s_row[2];
|
|
|
|
my $str = join( " ", @s_row[ 2 ... $#s_row ] );
|
|
|
|
my $flag = $s_row[3];
|
|
|
|
|
|
|
|
return $created, $int_id, $str, $flag;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-11-09 14:49:14 +03:00
|
|
|
sub save_log {
|
2023-11-08 14:23:03 +03:00
|
|
|
my ( $dbh, $created, $int_id, $str ) = @_;
|
|
|
|
|
2023-11-09 14:49:14 +03:00
|
|
|
my $address = _get_address($str) || '';
|
2023-11-08 14:23:03 +03:00
|
|
|
|
|
|
|
$dbh->do( $insert_log_template, undef,
|
|
|
|
( $created, $int_id, $str, $address ) );
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-11-09 14:49:14 +03:00
|
|
|
sub save_message {
|
2023-11-08 14:23:03 +03:00
|
|
|
my ( $dbh, $created, $int_id, $str ) = @_;
|
|
|
|
|
2023-11-09 14:49:14 +03:00
|
|
|
my $id = _get_id($str) || '';
|
2023-11-08 14:23:03 +03:00
|
|
|
|
|
|
|
if ($id) {
|
|
|
|
$dbh->do( $insert_message_template, undef,
|
|
|
|
( $created, $id, $int_id, $str ) );
|
|
|
|
}
|
|
|
|
else {
|
2023-11-09 14:49:14 +03:00
|
|
|
my $address = _get_address($str) || '';
|
2023-11-08 14:23:03 +03:00
|
|
|
|
|
|
|
$dbh->do( $insert_log_template, undef,
|
|
|
|
( $created, $int_id, $str, $address ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub process_log {
|
|
|
|
my ( $dbh, $path_to_log ) = @_;
|
|
|
|
|
|
|
|
open( my $fh, "<:encoding(UTF-8)", $path_to_log )
|
|
|
|
or die "We can't open file: ", $!;
|
|
|
|
|
|
|
|
while ( my $row = <$fh> ) {
|
|
|
|
my ( $created, $int_id, $str, $flag ) = _parce_row_log($row);
|
|
|
|
|
|
|
|
if ( $flag eq "<=" ) {
|
2023-11-09 14:49:14 +03:00
|
|
|
save_message( $dbh, $created, $int_id, $str );
|
2023-11-08 14:23:03 +03:00
|
|
|
}
|
|
|
|
else {
|
2023-11-09 14:49:14 +03:00
|
|
|
save_log( $dbh, $created, $int_id, $str );
|
2023-11-08 14:23:03 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
my $dbh = DBI->connect( $dbi_info, $db_username, $db_password,
|
|
|
|
{ postgres_enable_utf8 => 1, RaiseError => 1 } );
|
|
|
|
|
2023-11-09 14:49:14 +03:00
|
|
|
process_log( $dbh, $file_path );
|
2023-11-08 14:23:03 +03:00
|
|
|
|