logstash-input-tcp 2.0.1 → 2.0.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9e352517c189ba1a2460edd52b98462fc357b71a
4
- data.tar.gz: 74dfb043adfd5d70b171668d053d5391fe6edf2a
3
+ metadata.gz: 736fd1ded495c11b6aa4f70150cd2779ea23617d
4
+ data.tar.gz: b609a4785013e0f39af136f1fb42b905003d4dea
5
5
  SHA512:
6
- metadata.gz: 64db2174f3750b2ab0968264f25843e3d791fe7e7439825a669c14a59a07b283472fb8a2fcda747159fac22770d637f65513314f3e94bda2d7b976dd74840249
7
- data.tar.gz: 71e3f67d9bf174aa6c38c3a9d30a54a05f395326ca0de6913653ae1d6938c221444d59126341b032c062cb36a77fc51b0f07de857c1de0650c445c06282a94c4
6
+ metadata.gz: 52e09a292d90e8fec2dba13ea2076fb69940398a6571a28004d5d6219ec0efeef0687e4cc570a8b23f528975b037cb98250a9620ead9c4a0addb52dd059b7ff6
7
+ data.tar.gz: f700ffc6f7c5290c4bbc48a0409d13703c7cc2570b9105474395ead15a9d4b35e44e0fc6e05487a9419f6dd53ddbd53f5cb2da1279e1197e61bf6373237d2ed8
@@ -1,5 +1,6 @@
1
1
  ## 2.0.0
2
- - Plugins were updated to follow the new shutdown semantic, this mainly allows Logstash to instruct input plugins to terminate gracefully,
2
+ - Plugins were updated to follow the new shutdown semantic, this mainly allows Logstash to instruct input plugins to terminate gracefully,
3
3
  instead of using Thread.raise on the plugins' threads. Ref: https://github.com/elastic/logstash/pull/3895
4
4
  - Dependency on logstash-core update to 2.0
5
-
5
+ ## 2.0.2
6
+ - refactored & cleaned up plugin structure, see https://github.com/logstash-plugins/logstash-input-tcp/pull/18
@@ -2,6 +2,9 @@
2
2
  require "logstash/inputs/base"
3
3
  require "logstash/util/socket_peer"
4
4
 
5
+ require "socket"
6
+ require "openssl"
7
+
5
8
  # Read events over a TCP socket.
6
9
  #
7
10
  # Like stdin and file inputs, each event is assumed to be one line of text.
@@ -49,57 +52,27 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
49
52
  def initialize(*args)
50
53
  super(*args)
51
54
 
55
+ # monkey patch TCPSocket and SSLSocket to include socket peer
56
+ TCPSocket.module_eval{include ::LogStash::Util::SocketPeer}
57
+ OpenSSL::SSL::SSLSocket.module_eval{include ::LogStash::Util::SocketPeer}
58
+
52
59
  # threadsafe socket bookkeeping
53
60
  @server_socket = nil
54
61
  @client_socket = nil
55
62
  @connection_sockets = {}
56
63
  @socket_mutex = Mutex.new
64
+
65
+ @ssl_context = nil
57
66
  end
58
67
 
59
68
  def register
60
- require "socket"
61
- require "timeout"
62
- require "openssl"
63
-
64
- # monkey patch TCPSocket and SSLSocket to include socket peer
65
- TCPSocket.module_eval{include ::LogStash::Util::SocketPeer}
66
- OpenSSL::SSL::SSLSocket.module_eval{include ::LogStash::Util::SocketPeer}
67
-
68
69
  fix_streaming_codecs
69
70
 
70
- if @ssl_enable
71
- @ssl_context = OpenSSL::SSL::SSLContext.new
72
- @ssl_context.cert = OpenSSL::X509::Certificate.new(File.read(@ssl_cert))
73
- @ssl_context.key = OpenSSL::PKey::RSA.new(File.read(@ssl_key),@ssl_key_passphrase)
74
- if @ssl_verify
75
- @cert_store = OpenSSL::X509::Store.new
76
- # Load the system default certificate path to the store
77
- @cert_store.set_default_paths
78
- if File.directory?(@ssl_cacert)
79
- @cert_store.add_path(@ssl_cacert)
80
- else
81
- @cert_store.add_file(@ssl_cacert)
82
- end
83
- @ssl_context.cert_store = @cert_store
84
- @ssl_context.verify_mode = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
85
- end
86
- end
87
-
88
71
  # note that since we are opening a socket in register, we must also make sure we close it
89
72
  # in the close method even if we also close it in the stop method since we could have
90
73
  # a situation where register is called but not run & stop.
91
74
 
92
- if server?
93
- @logger.info("Starting tcp input listener", :address => "#{@host}:#{@port}")
94
- begin
95
- set_server_socket(TCPServer.new(@host, @port))
96
- rescue Errno::EADDRINUSE
97
- @logger.error("Could not start TCP server: Address in use", :host => @host, :port => @port)
98
- raise
99
- end
100
-
101
- set_server_socket(OpenSSL::SSL::SSLServer.new(server_socket, @ssl_context)) if @ssl_enable
102
- end
75
+ self.server_socket = new_server_socket if server?
103
76
  end
104
77
 
105
78
  def run(output_queue)
@@ -136,11 +109,13 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
136
109
  # start a new thread for each connection.
137
110
  server_connection_thread(output_queue, socket)
138
111
  rescue OpenSSL::SSL::SSLError => e
112
+ # log error, close socket, accept next connection
139
113
  @logger.error("SSL Error", :exception => e, :backtrace => e.backtrace)
140
- rescue
114
+ socket.close rescue nil
115
+ rescue => e
141
116
  # if this exception occured while the plugin is stopping
142
117
  # just ignore and exit
143
- raise unless stop?
118
+ raise e unless stop?
144
119
  end
145
120
  end
146
121
  ensure
@@ -150,24 +125,7 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
150
125
 
151
126
  def run_client(output_queue)
152
127
  while !stop?
153
- set_client_socket(TCPSocket.new(@host, @port))
154
-
155
- if @ssl_enable
156
- set_client_socket(OpenSSL::SSL::SSLSocket.new(client_socket, @ssl_context))
157
- begin
158
- client_socket.connect
159
- rescue OpenSSL::SSL::SSLError => e
160
- @logger.error("SSL Error", :exception => e, :backtrace => e.backtrace)
161
- sleep(1) # prevent hammering peer
162
- next
163
- rescue
164
- # if this exception occured while the plugin is stopping
165
- # just ignore and exit
166
- raise unless stop?
167
- end
168
- end
169
-
170
- @logger.debug? && @logger.debug("Opened connection", :client => "#{client_socket.peer}")
128
+ self.client_socket = new_client_socket
171
129
  handle_socket(client_socket, client_socket.peeraddr[3], output_queue, @codec.clone)
172
130
  end
173
131
  ensure
@@ -201,7 +159,7 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
201
159
  @logger.debug? && @logger.debug("Connection reset by peer", :client => socket.peer)
202
160
  rescue => e
203
161
  # if plugin is stopping, don't bother logging it as an error
204
- @logger.error("An error occurred. Closing connection", :client => socket.peer, :exception => e, :backtrace => e.backtrace) unless stop?
162
+ !stop? && @logger.error("An error occurred. Closing connection", :client => socket.peer, :exception => e, :backtrace => e.backtrace)
205
163
  ensure
206
164
  # catch all rescue nil on close to discard any close errors or invalid socket
207
165
  socket.close rescue nil
@@ -222,9 +180,72 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
222
180
  socket.sysread(16384)
223
181
  end
224
182
 
183
+ def ssl_context
184
+ return @ssl_context if @ssl_context
185
+
186
+ begin
187
+ @ssl_context = OpenSSL::SSL::SSLContext.new
188
+ @ssl_context.cert = OpenSSL::X509::Certificate.new(File.read(@ssl_cert))
189
+ @ssl_context.key = OpenSSL::PKey::RSA.new(File.read(@ssl_key),@ssl_key_passphrase)
190
+ if @ssl_verify
191
+ @cert_store = OpenSSL::X509::Store.new
192
+ # Load the system default certificate path to the store
193
+ @cert_store.set_default_paths
194
+ if File.directory?(@ssl_cacert)
195
+ @cert_store.add_path(@ssl_cacert)
196
+ else
197
+ @cert_store.add_file(@ssl_cacert)
198
+ end
199
+ @ssl_context.cert_store = @cert_store
200
+ @ssl_context.verify_mode = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
201
+ end
202
+ rescue => e
203
+ @logger.error("Could not inititalize SSL context", :exception => e, :backtrace => e.backtrace)
204
+ raise e
205
+ end
206
+
207
+ @ssl_context
208
+ end
209
+
210
+ def new_server_socket
211
+ @logger.info("Starting tcp input listener", :address => "#{@host}:#{@port}")
212
+
213
+ begin
214
+ socket = TCPServer.new(@host, @port)
215
+ rescue Errno::EADDRINUSE
216
+ @logger.error("Could not start TCP server: Address in use", :host => @host, :port => @port)
217
+ raise
218
+ end
219
+
220
+ @ssl_enable ? OpenSSL::SSL::SSLServer.new(socket, ssl_context) : socket
221
+ end
222
+
223
+ def new_client_socket
224
+ socket = TCPSocket.new(@host, @port)
225
+
226
+ if @ssl_enable
227
+ socket = OpenSSL::SSL::SSLSocket.new(socket, ssl_context)
228
+ socket.connect
229
+ end
230
+
231
+ @logger.debug? && @logger.debug("Opened connection", :client => "#{socket.peer}")
232
+
233
+ socket
234
+ rescue OpenSSL::SSL::SSLError => e
235
+ @logger.error("SSL Error", :exception => e, :backtrace => e.backtrace)
236
+ # catch all rescue nil on close to discard any close errors or invalid socket
237
+ socket.close rescue nil
238
+ sleep(1) # prevent hammering peer
239
+ retry
240
+ rescue
241
+ # if this exception occured while the plugin is stopping
242
+ # just ignore and exit
243
+ raise unless stop?
244
+ end
245
+
225
246
  # threadsafe sockets bookkeeping
226
247
 
227
- def set_client_socket(socket)
248
+ def client_socket=(socket)
228
249
  @socket_mutex.synchronize{@client_socket = socket}
229
250
  end
230
251
 
@@ -232,7 +253,7 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
232
253
  @socket_mutex.synchronize{@client_socket}
233
254
  end
234
255
 
235
- def set_server_socket(socket)
256
+ def server_socket=(socket)
236
257
  @socket_mutex.synchronize{@server_socket = socket}
237
258
  end
238
259
 
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-input-tcp'
4
- s.version = '2.0.1'
4
+ s.version = '2.0.2'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Read events over a TCP socket."
7
7
  s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-tcp
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
@@ -11,7 +11,8 @@ cert_chain: []
11
11
  date: 2015-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- requirement: !ruby/object:Gem::Requirement
14
+ name: logstash-core
15
+ version_requirements: !ruby/object:Gem::Requirement
15
16
  requirements:
16
17
  - - '>='
17
18
  - !ruby/object:Gem::Version
@@ -19,10 +20,7 @@ dependencies:
19
20
  - - <
20
21
  - !ruby/object:Gem::Version
21
22
  version: 3.0.0
22
- name: logstash-core
23
- prerelease: false
24
- type: :runtime
25
- version_requirements: !ruby/object:Gem::Requirement
23
+ requirement: !ruby/object:Gem::Requirement
26
24
  requirements:
27
25
  - - '>='
28
26
  - !ruby/object:Gem::Version
@@ -30,92 +28,94 @@ dependencies:
30
28
  - - <
31
29
  - !ruby/object:Gem::Version
32
30
  version: 3.0.0
31
+ prerelease: false
32
+ type: :runtime
33
33
  - !ruby/object:Gem::Dependency
34
+ name: logstash-codec-plain
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
34
40
  requirement: !ruby/object:Gem::Requirement
35
41
  requirements:
36
42
  - - '>='
37
43
  - !ruby/object:Gem::Version
38
44
  version: '0'
39
- name: logstash-codec-plain
40
45
  prerelease: false
41
46
  type: :runtime
47
+ - !ruby/object:Gem::Dependency
48
+ name: logstash-codec-line
42
49
  version_requirements: !ruby/object:Gem::Requirement
43
50
  requirements:
44
51
  - - '>='
45
52
  - !ruby/object:Gem::Version
46
53
  version: '0'
47
- - !ruby/object:Gem::Dependency
48
54
  requirement: !ruby/object:Gem::Requirement
49
55
  requirements:
50
56
  - - '>='
51
57
  - !ruby/object:Gem::Version
52
58
  version: '0'
53
- name: logstash-codec-line
54
59
  prerelease: false
55
60
  type: :runtime
61
+ - !ruby/object:Gem::Dependency
62
+ name: logstash-codec-json
56
63
  version_requirements: !ruby/object:Gem::Requirement
57
64
  requirements:
58
65
  - - '>='
59
66
  - !ruby/object:Gem::Version
60
67
  version: '0'
61
- - !ruby/object:Gem::Dependency
62
68
  requirement: !ruby/object:Gem::Requirement
63
69
  requirements:
64
70
  - - '>='
65
71
  - !ruby/object:Gem::Version
66
72
  version: '0'
67
- name: logstash-codec-json
68
73
  prerelease: false
69
74
  type: :runtime
75
+ - !ruby/object:Gem::Dependency
76
+ name: logstash-codec-json_lines
70
77
  version_requirements: !ruby/object:Gem::Requirement
71
78
  requirements:
72
79
  - - '>='
73
80
  - !ruby/object:Gem::Version
74
81
  version: '0'
75
- - !ruby/object:Gem::Dependency
76
82
  requirement: !ruby/object:Gem::Requirement
77
83
  requirements:
78
84
  - - '>='
79
85
  - !ruby/object:Gem::Version
80
86
  version: '0'
81
- name: logstash-codec-json_lines
82
87
  prerelease: false
83
88
  type: :runtime
89
+ - !ruby/object:Gem::Dependency
90
+ name: logstash-devutils
84
91
  version_requirements: !ruby/object:Gem::Requirement
85
92
  requirements:
86
93
  - - '>='
87
94
  - !ruby/object:Gem::Version
88
95
  version: '0'
89
- - !ruby/object:Gem::Dependency
90
96
  requirement: !ruby/object:Gem::Requirement
91
97
  requirements:
92
98
  - - '>='
93
99
  - !ruby/object:Gem::Version
94
100
  version: '0'
95
- name: logstash-devutils
96
101
  prerelease: false
97
102
  type: :development
98
- version_requirements: !ruby/object:Gem::Requirement
99
- requirements:
100
- - - '>='
101
- - !ruby/object:Gem::Version
102
- version: '0'
103
103
  description: This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program
104
104
  email: info@elastic.co
105
105
  executables: []
106
106
  extensions: []
107
107
  extra_rdoc_files: []
108
108
  files:
109
+ - lib/logstash/inputs/tcp.rb
110
+ - spec/spec_helper.rb
111
+ - spec/inputs/tcp_spec.rb
112
+ - logstash-input-tcp.gemspec
109
113
  - CHANGELOG.md
114
+ - README.md
110
115
  - CONTRIBUTORS
111
116
  - Gemfile
112
117
  - LICENSE
113
118
  - NOTICE.TXT
114
- - README.md
115
- - lib/logstash/inputs/tcp.rb
116
- - logstash-input-tcp.gemspec
117
- - spec/inputs/tcp_spec.rb
118
- - spec/spec_helper.rb
119
119
  homepage: http://www.elastic.co/guide/en/logstash/current/index.html
120
120
  licenses:
121
121
  - Apache License (2.0)
@@ -138,10 +138,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
138
  version: '0'
139
139
  requirements: []
140
140
  rubyforge_project:
141
- rubygems_version: 2.4.8
141
+ rubygems_version: 2.1.9
142
142
  signing_key:
143
143
  specification_version: 4
144
144
  summary: Read events over a TCP socket.
145
145
  test_files:
146
- - spec/inputs/tcp_spec.rb
147
146
  - spec/spec_helper.rb
147
+ - spec/inputs/tcp_spec.rb