logstash-input-tcp 4.0.3 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b1e8027d90d562b5c9f977037e3476f52e3ecc14
4
- data.tar.gz: 3cc047b2b02c5ffa6c232a5b43ad27228f529cad
3
+ metadata.gz: 3e9170fef8955f298473d6ab8d0fb0a5301f915c
4
+ data.tar.gz: e82dbe475f4d1c4928da2fd73a5e1e82009a038c
5
5
  SHA512:
6
- metadata.gz: 916ddf537f41f57da7fe153a38f47c3f9d5ae6a80510f2f55f665a01ccdf49e0c58d6bc198b20bcb9cd9a145e089d45e0686ea1a85e0a7ee3cfe724749694703
7
- data.tar.gz: 8b19ab43567e46209d6ea42b7d9f9898a902171cb4a9b0ccfacb85a97b0fd778e4c0a5b9d763536b5244192329ed79fae8a361e45610617bd1c301c9b8a56814
6
+ metadata.gz: 202ff3f0feeb6017794bcfd1f9cdc6775066560fffc658fc3429b6064bf2ee5d1cd02f60087d4ce46149e2e52642e7cfe20439a5d1a905a2f09dab1f4e4387c3
7
+ data.tar.gz: 7491b4f37c8b2b2ff90e8d11922143ae75da7c4cb35d78e487f906219829f941bee949f7b3fc666c1cd06cfd80c88a4eb88bda167df9534e3f3b67635860b389
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 4.1.0
2
+ - Add support for proxy protocol
3
+
1
4
  ## 4.0.3
2
5
  - Relax constraint on logstash-core-plugin-api to >= 1.60 <= 2.99
3
6
 
@@ -30,6 +30,10 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
30
30
  # `client` connects to a server.
31
31
  config :mode, :validate => ["server", "client"], :default => "server"
32
32
 
33
+ # Proxy protocol support, only v1 is supported at this time
34
+ # http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt
35
+ config :proxy_protocol, :validate => :boolean, :default => false
36
+
33
37
  # Enable SSL (must be set for other `ssl_` options to take effect).
34
38
  config :ssl_enable, :validate => :boolean, :default => false
35
39
 
@@ -55,6 +59,8 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
55
59
 
56
60
  HOST_FIELD = "host".freeze
57
61
  PORT_FIELD = "port".freeze
62
+ PROXY_HOST_FIELD = "proxy_host".freeze
63
+ PROXY_PORT_FIELD = "proxy_port".freeze
58
64
  SSLSUBJECT_FIELD = "sslsubject".freeze
59
65
 
60
66
  def initialize(*args)
@@ -153,8 +159,31 @@ class LogStash::Inputs::Tcp < LogStash::Inputs::Base
153
159
 
154
160
  def handle_socket(socket, client_address, client_port, output_queue, codec)
155
161
  peer = "#{client_address}:#{client_port}"
162
+ first_read = true
156
163
  while !stop?
157
- codec.decode(read(socket)) do |event|
164
+ tbuf = read(socket)
165
+ if @proxy_protocol && first_read
166
+ first_read = false
167
+ orig_buf = tbuf
168
+ pp_hdr, tbuf = tbuf.split("\r\n", 2)
169
+
170
+ pp_info = pp_hdr.split(/\s/)
171
+ # PROXY proto clientip proxyip clientport proxyport
172
+ if pp_info[0] != "PROXY"
173
+ @logger.error("invalid proxy protocol header label", :hdr => pp_hdr)
174
+ raise IOError
175
+ else
176
+ proxy_address = pp_info[3]
177
+ proxy_port = pp_info[5]
178
+ client_address = pp_info[2]
179
+ client_port = pp_info[4]
180
+ end
181
+ end
182
+ codec.decode(tbuf) do |event|
183
+ if @proxy_protocol
184
+ event.set(PROXY_HOST_FIELD, proxy_address) unless event.get(PROXY_HOST_FIELD)
185
+ event.set(PROXY_PORT_FIELD, proxy_port) unless event.get(PROXY_PORT_FIELD)
186
+ end
158
187
  event.set(HOST_FIELD, client_address) unless event.get(HOST_FIELD)
159
188
  event.set(PORT_FIELD, client_port) unless event.get(PORT_FIELD)
160
189
  event.set(SSLSUBJECT_FIELD, socket.peer_cert.subject.to_s) if @ssl_enable && @ssl_verify && event.get(SSLSUBJECT_FIELD).nil?
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-input-tcp'
3
- s.version = '4.0.3'
3
+ s.version = '4.1.0'
4
4
  s.licenses = ['Apache License (2.0)']
5
5
  s.summary = "Read events over a TCP socket."
6
6
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -63,6 +63,42 @@ describe LogStash::Inputs::Tcp do
63
63
  end
64
64
  end
65
65
 
66
+ it "should handle PROXY protocol v1 connections" do
67
+ event_count = 10
68
+ port = rand(1024..65535)
69
+ conf = <<-CONFIG
70
+ input {
71
+ tcp {
72
+ port => #{port}
73
+ proxy_protocol => true
74
+ }
75
+ }
76
+ CONFIG
77
+
78
+ events = input(conf) do |pipeline, queue|
79
+ socket = Stud::try(5.times) { TCPSocket.new("127.0.0.1", port) }
80
+ socket.puts("PROXY TCP4 1.2.3.4 5.6.7.8 1234 5678\r");
81
+ socket.flush
82
+ event_count.times do |i|
83
+ # unicode smiley for testing unicode support!
84
+ socket.puts("#{i} ☹")
85
+ socket.flush
86
+ end
87
+ socket.close
88
+
89
+ event_count.times.collect {queue.pop}
90
+ end
91
+
92
+ insist { events.length } == event_count
93
+ event_count.times do |i|
94
+ insist { events[i].get("message") } == "#{i} ☹"
95
+ insist { events[i].get("host") } == "1.2.3.4"
96
+ insist { events[i].get("port") } == "1234"
97
+ insist { events[i].get("proxy_host") } == "5.6.7.8"
98
+ insist { events[i].get("proxy_port") } == "5678"
99
+ end
100
+ end
101
+
66
102
  it "should read events with plain codec and ISO-8859-1 charset" do
67
103
  port = rand(1024..65535)
68
104
  charset = "ISO-8859-1"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-tcp
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.3
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-14 00:00:00.000000000 Z
11
+ date: 2016-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -166,7 +166,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
166
  version: '0'
167
167
  requirements: []
168
168
  rubyforge_project:
169
- rubygems_version: 2.6.3
169
+ rubygems_version: 2.4.8
170
170
  signing_key:
171
171
  specification_version: 4
172
172
  summary: Read events over a TCP socket.