App-Spoor

 view release on metacpan or  search on metacpan

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

package App::Spoor::ErrorEntryParser;

use v5.10;
use strict;
use warnings;

=head1 NAME

App::Spoor::ErrorEntryParser

=head1 VERSION

Version 0.01

=cut

our $VERSION = '0.01';

=head1 SYNOPSIS

This package contains the necessary functionality to parse CPanel error log entries.

=head1 SUBROUTINES/METHODS

=head2 parse

This subroutine accepts a single line from a CPanel error log (as a string) and returns a reference to a hash 
representation of that entry.

The hash representation contains the following elements:

=over 2

=item * type: This is hardcoded to 'error'

=item * event: A description of the event that the entry refers to - can be one of forward_added_partial_recipient, unrecognised.

=item * log_time: A DateTime instance representing the time of the log entry. It is not set if the event is 'unrecognised'.

=item * context: The context within which the operation is being performed can be either 'mailbox' or 'domain'. It is not set if the event is 'unrecognised'.

=item * forward_type: Can be one of 'system_user', 'pipe' or 'email'. It is not set if the event is 'unrecognised'.

=item * forward_to: The recipient of the forwarded email. It is not set if the event is 'unrecognised'.

=item * email: The mailbox that the forward is being applied to. It is not set if the event is 'unrecognised'.

=item * status: The status of the request is hardcoded to success. It is not set if the event is 'unrecognised'.

=back

=cut

sub parse {
  use DateTime::Format::Strptime;
  use JSON;

  my $log_entry = shift;
  my $date_parser = DateTime::Format::Strptime->new(pattern => '%Y-%m-%d %H:%M:%S %z', on_error => 'croak');
  my %response;
  my $data_ref;
  my $timestamp;
  my $forward_type;

  if ($log_entry =~ /
    \A
    \[(?<timestamp>[^\]]+)\]\s
    info\s
    \[spoor_forward_added\]\s
    (?<data>{.+})
    \Z
  /x) {
    $data_ref = from_json($+{data});
    $timestamp = $date_parser->parse_datetime($+{timestamp})->epoch();

    if ($data_ref->{args}{fwdopt} eq 'system') {
      $forward_type = 'system_user';
    } elsif ($data_ref->{args}{fwdopt} eq 'pipe') {
      $forward_type = 'pipe';
    } else {
      $forward_type = 'email';
    }
    %response = (
      type => 'error',
      event => 'forward_added_partial_recipient',
      context => ($data_ref->{args}{domain} eq '' ? 'mailbox' : 'domain'),
      forward_type =>$forward_type,
      forward_to => $data_ref->{result}[0]{forward},
      email => $data_ref->{result}[0]{email},
      log_time => $timestamp,
      status => 'success'
    );
  } else {
    %response = (
      type => 'error',
      event => 'unrecognised',
    );
  }

  return \%response;
}

=head1 AUTHOR

Rory McKinley, C<< <rorymckinley at capefox.co> >>

=head1 BUGS

Please report any bugs or feature requests to C<bug-. at rt.cpan.org>, or through
the web interface at L<https://rt.cpan.org/NoAuth/ReportBug.html?Queue=.>.  I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.


=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc App::Spoor::ErrorEntryParser



( run in 1.330 second using v1.01-cache-2.11-cpan-d8267643d1d )