diff --git a/pandora_server/util/pandora_migrate_logs.pl b/pandora_server/util/pandora_migrate_logs.pl new file mode 100644 index 0000000000..253b240b51 --- /dev/null +++ b/pandora_server/util/pandora_migrate_logs.pl @@ -0,0 +1,146 @@ +use strict; +use warnings; + +use lib '/usr/lib/perl5'; + +use PandoraFMS::Config; +use PandoraFMS::DB; +use JSON; +use IO::Socket::INET; +use File::Copy; + + +######################################################################## +# Migrate log data +######################################################################## +sub migrate_log { + my ($pa_config, $dbh, $item) = @_; + + if (!defined($item) || ($item eq "")) { + logger($pa_config, "Migration tool: Empty item detected", 1); + return undef; + } + + my ($agent_id, $id_agent_module_log, $utimestamp) = $item =~ /(\d+?)_(\d+?)_(\d+?).log$/; + my $fh; + + if ( (! defined($agent_id)) || + (! defined($id_agent_module_log)) || + (! defined($utimestamp)) || + (! -f $item) ) { + logger($pa_config, "Migration tool: Cannot retrieve log information from [$item]", 1); + return undef; + } + + # Get the log module + my $source_id = get_db_value ($dbh, + 'SELECT source + FROM tagent_module_log + WHERE id_agent = ? AND id_agent_module_log = ?', $agent_id, $id_agent_module_log); + if (! defined ($source_id)) { + logger($pa_config, "Migration tool: Failed to retrieve source_id [" . $agent_id ."/" . $id_agent_module_log . "]", 1); + return undef; + } + + + my $data; + # Read data + { + local $/ = undef; + open($fh, $item) or die ("Cannot open file [$item]"); + binmode $fh; + $data = <$fh>; + close $fh; + }; + + my $datagram = { + "utimestamp" => $utimestamp, + "logcontent" => $data, + "agent_id" => $agent_id, + "source_id" => $source_id, + }; + + my $sock = $pa_config->{'migration_socket'}; + print $sock encode_json($datagram) . "\n"; + + move ($item, $item . ".migrated"); +} + + + +######################################################################## +# Recursive file read +######################################################################## +sub recursive_file_apply; +sub recursive_file_apply { + my ($pa_config, $dbh, $psub, $item) = @_; + + if (-d $item) { + my $dh; + opendir($dh,$item) or die ("Cannot open directory [$item]"); + + my @sorted_dirs = sort {(stat $a)[10] <=> (stat $b)[10]} readdir($dh); + + foreach my $object (@sorted_dirs) { + next if ($object =~ /^\./); + recursive_file_apply($pa_config, $dbh, $psub, $item . "/" . $object) + } + closedir($dh); + } + elsif(-f $item) { + $psub->($pa_config, $dbh, $item); + + } + else { + print STDERR "[W] Unknown item [$item]\n"; + logger($pa_config, "Migration tool: Unknown item [$item]", 3); + } +} + +############################################################# +# MAIN +############################################################# + +my %pa_config; + +pandora_init(\%pa_config, 'Pandora FMS log migration tool'); +pandora_load_config (\%pa_config); + +# Start logging +pandora_start_log (\%pa_config); + +# Connect to the DB +my $dbh = db_connect ($pa_config{'dbengine'}, $pa_config{'dbname'}, $pa_config{'dbhost'}, $pa_config{'dbport'}, + $pa_config{'dbuser'}, $pa_config{'dbpass'}); + +# Grab config tokens shared with the console and not in the .conf +pandora_get_sharedconfig (\%pa_config, $dbh); + + +if ( (defined($pa_config{'logstash_host'}) && $pa_config{'logstash_host'} ne '') + && (defined($pa_config{'logstash_port'}) && $pa_config{'logstash_port'} != 0)) { + + + if (-d $pa_config{'log_dir'}) { + $pa_config{'migration_socket'} = new IO::Socket::INET(PeerAddr => $pa_config{'logstash_host'}, + PeerPort => $pa_config{'logstash_port'}, + Proto => 'tcp', Timeout => 1); + + if(! defined($pa_config{'migration_socket'})) { + logger(\%pa_config, "Failed to connect to LogStash server at " . $pa_config{'logstash_host'}, 1); + return; + } + + recursive_file_apply(\%pa_config, $dbh, \&migrate_log,$pa_config{'log_dir'}); + + $pa_config{'migration_socket'}->close(); + } + +} + + +$dbh->disconnect(); + +logger(\%pa_config,"Migration completed", 1); + +