-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathClient.pm
executable file
·110 lines (86 loc) · 2.95 KB
/
Client.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package Net::Sentry::Client;
=head1 NAME
Net::Sentry::Client - a client for a Sentry server.
=head1 VERSION
version 0.001
=head1 SEE ALSO
http://sentry.readthedocs.org/en/latest/index.html
=cut
use strict;
use warnings;
use HTTP::Request::Common;
use LWP::UserAgent;
use JSON ();
use Data::UUID::MT ();
use MIME::Base64 'encode_base64';
use Compress::Zlib;
use Time::HiRes (qw(gettimeofday));
use DateTime;
use Digest::HMAC_SHA1 qw( hmac_sha1_hex );
use Carp;
use Sys::Hostname;
# Constructor
sub new {
my ( $class, %options ) = @_;
if (! exists $options{sentry_key}) {
die "Mandatory paramter 'sentry_key' not defined";
}
if (! exists $options{remote_url}) {
die "Mandatory paramter 'remote_url' not defined";
}
my $self = {
sentry_version => 0,
ua => LWP::UserAgent->new(),
%options,
};
bless $self, $class;
}
# Send our message to the sentry server/servers
sub send {
my ( $self, $params ) = @_;
my $ua = $self->{ua};
my $uri = $self->{remote_url};
my $message = $self->_getMessage( $params );
my $stamp = gettimeofday();
$stamp = sprintf ( "%.12g", $stamp );
my %header = $self->_getAuthHeader( $stamp, $message );
my $request = $ua->post( $uri, %header, Content => $message );
return $request;
}
# From outside message, we make a json message for server.
sub _getMessage {
my ( $self, $params ) = @_;
my $data = {
message => $params->{message},
timestamp => time(),
level => $params->{level}||20,
message_id => Data::UUID::MT->new->create_hex(),
logger => $params->{logger}||'root',
view => $params->{view}||undef,
server_name => $params->{server_name}||hostname,
url => $params->{url}||undef,
site => $params->{site}||undef,
data => $params->{data}||undef,
traceback => $params->{traceback}||undef,
};
my $json = JSON->new->utf8(1)->pretty(1)->allow_nonref(1)->encode( $data );
return encode_base64(compress( $json ));
}
# Make signature which is required for the sentry server
sub _getSignature {
my ( $self, $stamp, $message ) = @_;
return hmac_sha1_hex( "$stamp $message", $self->{sentry_key} );
}
# Make the specific header
sub _getAuthHeader {
my ( $self, $stamp, $message ) = @_;
my $header_format = sprintf (
"Sentry sentry_signature=%s ,sentry_timestamp=%s ,sentry_client=%s",
$self->_getSignature( $stamp, $message ),
$stamp,
$self->{sentry_version}
);
my %header = ( 'Authorization' => $header_format, 'Content-Type' => 'application/octet-stream' );
return %header;
}
1;