le 2.0 → 2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LE.gemspec +1 -1
- data/lib/le.rb +7 -18
- data/lib/le/host.rb +18 -31
- data/lib/le/host/http.rb +103 -0
- metadata +3 -4
- data/lib/le/host/https.rb +0 -42
- data/lib/le/host/https/tcp.rb +0 -64
data/LE.gemspec
CHANGED
data/lib/le.rb
CHANGED
@@ -1,12 +1,3 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# coding: utf-8
|
3
|
-
|
4
|
-
#
|
5
|
-
# Logentries Ruby monitoring agent
|
6
|
-
# Copyright 2010,2011 Logentries, Jlizard
|
7
|
-
# Mark Lacomber <marklacomber@gmail.com>
|
8
|
-
#
|
9
|
-
|
10
1
|
require File.join(File.dirname(__FILE__), 'le', 'host')
|
11
2
|
|
12
3
|
require 'logger'
|
@@ -20,19 +11,17 @@ module Le
|
|
20
11
|
host = Le::Host.new(token, local)
|
21
12
|
logger = Logger.new(host)
|
22
13
|
|
23
|
-
|
14
|
+
if host.respond_to?(:formatter)
|
15
|
+
logger.formatter = host.formatter
|
16
|
+
end
|
24
17
|
|
25
18
|
logger
|
26
19
|
end
|
27
20
|
|
28
21
|
def self.checkParams(token)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
# Check if the key is valid UUID format
|
34
|
-
if (token =~ /\A(urn:uuid:)?[\da-f]{8}-([\da-f]{4}-){3}[\da-f]{12}\z/i) == nil
|
35
|
-
puts "\nLE: It appears the LOGENTRIES_TOKEN you entered is invalid!\n"
|
36
|
-
end
|
22
|
+
# Check if the key is valid UUID format
|
23
|
+
if (token =~ /\A(urn:uuid:)?[\da-f]{8}-([\da-f]{4}-){3}[\da-f]{12}\z/i) == nil
|
24
|
+
puts "\nLE: It appears the LOGENTRIES_TOKEN you entered is invalid!\n"
|
25
|
+
end
|
37
26
|
end
|
38
27
|
end
|
data/lib/le/host.rb
CHANGED
@@ -1,48 +1,35 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# coding: utf-8
|
3
|
-
|
4
|
-
#
|
5
|
-
# Logentries Ruby monitoring agent
|
6
|
-
# Copyright 2010,2011 Logentries, Jlizard
|
7
|
-
# Mark Lacomber <marklacomber@gmail.com>
|
8
|
-
#
|
9
|
-
|
10
1
|
module Le
|
11
2
|
module Host
|
12
|
-
|
13
|
-
# Creates a new Logentries host, based on a user-key and location of destination file on logentries,
|
14
|
-
# both must be provided correctly for a connection to be made.
|
15
3
|
|
16
4
|
def self.new(token, local)
|
17
5
|
|
18
|
-
Le::Host::
|
6
|
+
Le::Host::HTTP.new(token, local)
|
19
7
|
|
20
8
|
end
|
21
9
|
|
22
|
-
module
|
23
|
-
|
10
|
+
module InstanceMethods
|
24
11
|
def formatter
|
25
12
|
proc do |severity, datetime, progname, msg|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
13
|
+
message = "#{datetime} "
|
14
|
+
message << format_message(msg, severity)
|
15
|
+
end
|
16
|
+
end
|
30
17
|
|
31
|
-
def format_message(
|
32
|
-
|
33
|
-
msg_out = ""
|
34
|
-
msg_out << "severity=#{severity}, "
|
18
|
+
def format_message(message_in, severity)
|
19
|
+
message_in = message_in.lstrip
|
35
20
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
21
|
+
message_out = ""
|
22
|
+
message_out = "severity=#{severity}, "
|
23
|
+
case message_in
|
24
|
+
when String
|
25
|
+
message_out << message_in
|
26
|
+
else
|
27
|
+
message_out << message_in.inspect
|
28
|
+
end
|
29
|
+
message_out
|
43
30
|
end
|
44
31
|
end
|
45
32
|
end
|
46
33
|
end
|
47
34
|
|
48
|
-
require File.join(File.dirname(__FILE__), 'host', '
|
35
|
+
require File.join(File.dirname(__FILE__), 'host', 'http')
|
data/lib/le/host/http.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'socket'
|
2
|
+
require 'openssl'
|
3
|
+
require 'thread'
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
module Le
|
7
|
+
module Host
|
8
|
+
class HTTP
|
9
|
+
include Le::Host::InstanceMethods
|
10
|
+
attr_accessor :token, :queue, :started, :thread, :conn, :local
|
11
|
+
|
12
|
+
def initialize(token, local)
|
13
|
+
@token = token
|
14
|
+
@local = local
|
15
|
+
@queue = Queue.new
|
16
|
+
@started = false
|
17
|
+
end
|
18
|
+
|
19
|
+
def write(message)
|
20
|
+
if @local then
|
21
|
+
puts message
|
22
|
+
return
|
23
|
+
end
|
24
|
+
|
25
|
+
@queue << "#{@token}#{message}\n"
|
26
|
+
|
27
|
+
if not @started then
|
28
|
+
puts "LE: Starting asynchronous socket writer"
|
29
|
+
@thread = Thread.new{run()}
|
30
|
+
@started = true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def close
|
35
|
+
puts "LE: Closing asynchronous socket writer"
|
36
|
+
@thread.raise Interrupt
|
37
|
+
end
|
38
|
+
|
39
|
+
def openConnection
|
40
|
+
puts "LE: Reopening connection to Logentries API server"
|
41
|
+
@conn = TCPSocket.new('api.logentries.com', 10000)
|
42
|
+
|
43
|
+
#@conn = OpenSSL::SSL::SSLSocket.new(@sock, OpenSSL::SSL::SSLContext.new())
|
44
|
+
#@conn.connect
|
45
|
+
|
46
|
+
puts "LE: Connection established"
|
47
|
+
end
|
48
|
+
|
49
|
+
def reopenConnection
|
50
|
+
closeConnection
|
51
|
+
root_delay = 0.1
|
52
|
+
while true
|
53
|
+
begin
|
54
|
+
openConnection
|
55
|
+
break
|
56
|
+
rescue OpenSSL::SSL::SSLError, TimeoutError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::ETIMEDOUT, EOFError => e
|
57
|
+
puts "LE: Unable to connect to Logentries"
|
58
|
+
end
|
59
|
+
root_delay *= 2
|
60
|
+
if root_delay >= 10 then
|
61
|
+
root_delay = 10
|
62
|
+
end
|
63
|
+
wait_for = (root_delay + rand(root_delay)).to_i
|
64
|
+
puts "LE: Waiting for " + wait_for.to_s + "ms"
|
65
|
+
sleep(wait_for)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def closeConnection
|
70
|
+
if @conn != nil
|
71
|
+
@conn.sysclose
|
72
|
+
@conn = nil
|
73
|
+
end
|
74
|
+
#if @sock != nil
|
75
|
+
# @sock.close
|
76
|
+
# @sock = nil
|
77
|
+
#end
|
78
|
+
end
|
79
|
+
|
80
|
+
def run
|
81
|
+
begin
|
82
|
+
reopenConnection
|
83
|
+
|
84
|
+
while true
|
85
|
+
data = @queue.pop
|
86
|
+
while true
|
87
|
+
begin
|
88
|
+
@conn.write(data)
|
89
|
+
rescue OpenSSL::SSL::SSLError, TimeoutError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::ETIMEOUT, EOFError => e
|
90
|
+
reopenConnection
|
91
|
+
next
|
92
|
+
end
|
93
|
+
break
|
94
|
+
end
|
95
|
+
end
|
96
|
+
rescue Interrupt
|
97
|
+
puts "LE: Asynchronous socket writer interrupted"
|
98
|
+
end
|
99
|
+
closeConnection
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: le
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '2.
|
4
|
+
version: '2.1'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-15 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! '
|
15
15
|
|
@@ -22,8 +22,7 @@ files:
|
|
22
22
|
- LE.gemspec
|
23
23
|
- ./lib/le.rb
|
24
24
|
- ./lib/le/host.rb
|
25
|
-
- ./lib/le/host/
|
26
|
-
- ./lib/le/host/https/tcp.rb
|
25
|
+
- ./lib/le/host/http.rb
|
27
26
|
homepage:
|
28
27
|
licenses: []
|
29
28
|
post_install_message:
|
data/lib/le/host/https.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# coding: utf-8
|
3
|
-
|
4
|
-
#
|
5
|
-
# Logentries Ruby monitoring agent
|
6
|
-
# Copyright 2010,2011 Logentries, Jlizard
|
7
|
-
# Mark Lacomber <marklacomber@gmail.com>
|
8
|
-
#
|
9
|
-
|
10
|
-
require File.join(File.dirname(__FILE__), 'https', 'tcp')
|
11
|
-
|
12
|
-
module Le
|
13
|
-
module Host
|
14
|
-
class HTTPS
|
15
|
-
include Le::Host::HelperMethods
|
16
|
-
|
17
|
-
attr_reader :deliverer, :local_bool
|
18
|
-
|
19
|
-
def initialize(token, local)
|
20
|
-
@local_bool = local
|
21
|
-
if not local
|
22
|
-
@deliverer = Le::Host::HTTPS::TCPSOCKET.new(token)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def write(message)
|
27
|
-
|
28
|
-
if @local_bool
|
29
|
-
puts message
|
30
|
-
else
|
31
|
-
# Deliver the message to logentries via TCP
|
32
|
-
@deliverer.deliver(message)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def close
|
37
|
-
nil
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
data/lib/le/host/https/tcp.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# coding: utf-8
|
3
|
-
|
4
|
-
#
|
5
|
-
# Logentries Ruby monitoring agent
|
6
|
-
# Copyright 2010,2011 Logentries, Jlizard
|
7
|
-
# Mark Lacomber <marklacomber@gmail.com>
|
8
|
-
#
|
9
|
-
|
10
|
-
require 'socket'
|
11
|
-
require 'openssl'
|
12
|
-
|
13
|
-
module Le
|
14
|
-
module Host
|
15
|
-
class HTTPS
|
16
|
-
|
17
|
-
class TCPSOCKET
|
18
|
-
|
19
|
-
attr_accessor :conn, :token
|
20
|
-
def initialize(token)
|
21
|
-
|
22
|
-
@token = token
|
23
|
-
begin
|
24
|
-
createSocket()
|
25
|
-
rescue TimeoutError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::ETIMEDOUT, EOFError => e
|
26
|
-
$stderr.puts "WARNING: #{e.class} Could not create the connection to Logentries. #{e.message}"
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def createSocket()
|
31
|
-
|
32
|
-
# Open the TCP connection to the Logentries Server
|
33
|
-
@conn = TCPSocket.new('api.logentries.com', 10000)
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
def deliver(message)
|
38
|
-
|
39
|
-
if @conn == nil
|
40
|
-
begin
|
41
|
-
createSocket()
|
42
|
-
rescue TimeoutError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::ETIMEDOUT, EOFError => e
|
43
|
-
$stderr.puts "WARNING: #{e.class} Could not write log. No connection to Logentries #{e.message}"
|
44
|
-
return
|
45
|
-
end
|
46
|
-
end
|
47
|
-
# Sends the log to the Logentries Server
|
48
|
-
begin
|
49
|
-
@conn.puts(@token + message)
|
50
|
-
rescue TimeoutError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED, Errno::ENOTCONN, Errno::ECONNRESET, Errno::ETIMEDOUT, EOFError => e
|
51
|
-
$stderr.puts "WARNING: #{e.class} Could not send log to Logentries #{e.message}"
|
52
|
-
begin
|
53
|
-
createSocket()
|
54
|
-
rescue TimeoutError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::ETIMEDOUT, EOFError => e
|
55
|
-
$stderr.puts "WARNING: #{e.class} Could not create the connection to Logentries. #{e.message}"
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|