App-Spoor

 view release on metacpan or  search on metacpan

bin/spoor_log_follower  view on Meta::CPAN


my $file = File::Tail->new(
	name=> $follower_config->{name},
	tail=> $follower_config->{tail},
	maxinterval=> $follower_config->{maxinterval},
	debug=> $follower_config->{debug}
);

while (defined(my $entry=$file->read)) {
  print("$entry\n");
  # TODO This is tainted
  if ($log_type eq 'login') {
    $parsed_entry_ref = App::Spoor::LoginEntryParser::parse($entry);
  } elsif ($log_type eq 'access') {
    $parsed_entry_ref = App::Spoor::AccessEntryParser::parse($entry);
  } elsif ($log_type eq 'error') {
    $parsed_entry_ref = App::Spoor::ErrorEntryParser::parse($entry);
  }

  App::Spoor::ParsedEntryWriter::write_parsed_entry(
    $parsed_entry_ref,

lib/App/Spoor/ParsedFileManager.pm  view on Meta::CPAN

  my $config = shift;
  my $file_security_check = shift;
  my $transmitter = shift;

  my ($source_file_path, $file_contents);
  opendir my $parsed_entries_dir, $config->{parsed_entries_path};

  my @file_names = grep { /\A((error|access|login)\.\d+\.\d+\.json)\z/ } readdir $parsed_entries_dir;

  foreach my $file_name (@file_names) {
    # Untaint 
    if ($file_name =~ /\A((error|access|login)\.\d+\.\d+\.json)\z/) {
      my $sanitised_file_name = $1;
      $source_file_path = File::Spec->catfile($config->{parsed_entries_path}, $sanitised_file_name);
      if ($file_security_check->($source_file_path)) {
        $file_contents = from_json(path($source_file_path)->slurp_utf8());

        if ($transmitter->($file_contents)) {
          move($source_file_path, $config->{transmitted_entries_path});
        } else {
          move($source_file_path, $config->{transmission_failed_entries_path});



( run in 1.250 second using v1.01-cache-2.11-cpan-d6f9594c0a5 )