logstash-output-csv 2.0.2 → 2.0.3

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: c90c7648823c390c1db7b69296f90b71b18a631f
4
- data.tar.gz: 94848d4486fce5fab419fe6f9228b756bb5cebce
3
+ metadata.gz: 05d5e4ca59e34c3669b05517154b5b5869d483c7
4
+ data.tar.gz: b27171ebca8cef47f85fa94dbe89aa5facb23c8e
5
5
  SHA512:
6
- metadata.gz: 8c5dd47ad581fdde9859f1fc0072374ca0f7138eca3ad936c71cbb71fe0be6511e5f1576f7045cc849007842061244c586920bbec55eaf376c5f9a203a933246
7
- data.tar.gz: 29b433bf08d08d639c9af348503b415a8ff5b233c75329d573914ab50cf74b342d1babff09f10d7be1953d08203ac4e604b42f9ea04eb89c2b98d81e5c3d436e
6
+ metadata.gz: b41a43e2c69186d9a4ccb1ec5557dc029ee5cad34b480cdf4fbe674823f4500336662ea47715a5e7de6e895f6982e75828c03377f6a23891c5f26e8dd69567f4
7
+ data.tar.gz: b88038d2a6a36646809d5ecf5a553755a92c6e2a4f06b5f9a6b9a6806995f25f6f719bd4f046419d2f6b2bfb4c79b9e878b75a57f6d231c0d3b241b1238311b3
data/CHANGELOG.md CHANGED
@@ -1,5 +1,7 @@
1
+ ## 2.0.3
2
+ - Escape rogue values by default, which can be interpreted by spreadsheet apps. Add option to turn it off
3
+
1
4
  ## 2.0.0
2
- - Plugins were updated to follow the new shutdown semantic, this mainly allows Logstash to instruct input plugins to terminate gracefully,
5
+ - Plugins were updated to follow the new shutdown semantic, this mainly allows Logstash to instruct input plugins to terminate gracefully,
3
6
  instead of using Thread.raise on the plugins' threads. Ref: https://github.com/elastic/logstash/pull/3895
4
7
  - Dependency on logstash-core update to 2.0
5
-
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Logstash Plugin
2
2
 
3
+ [![Build
4
+ Status](http://build-eu-00.elastic.co/view/LS%20Plugins/view/LS%20Outputs/job/logstash-plugin-output-csv-unit/badge/icon)](http://build-eu-00.elastic.co/view/LS%20Plugins/view/LS%20Outputs/job/logstash-plugin-output-csv-unit/)
5
+
3
6
  This is a plugin for [Logstash](https://github.com/elastic/logstash).
4
7
 
5
8
  It is fully free and fully open source. The license is Apache 2.0, meaning you are pretty much free to use it however you want in whatever way.
@@ -22,6 +22,9 @@ class LogStash::Outputs::CSV < LogStash::Outputs::File
22
22
  # Full documentation is available on the http://ruby-doc.org/stdlib-2.0.0/libdoc/csv/rdoc/index.html[Ruby CSV documentation page].
23
23
  # A typical use case would be to use alternative column or row seperators eg: `csv_options => {"col_sep" => "\t" "row_sep" => "\r\n"}` gives tab seperated data with windows line endings
24
24
  config :csv_options, :validate => :hash, :required => false, :default => Hash.new
25
+ # Option to not escape/munge string values. Please note turning off this option
26
+ # may not make the values safe in your spreadsheet application
27
+ config :spreadsheet_safe, :validate => :boolean, :default => true
25
28
 
26
29
  public
27
30
  def register
@@ -31,7 +34,7 @@ class LogStash::Outputs::CSV < LogStash::Outputs::File
31
34
 
32
35
  public
33
36
  def receive(event)
34
-
37
+
35
38
  path = event.sprintf(@path)
36
39
  fd = open(path)
37
40
  csv_values = @fields.map {|name| get_value(name, event)}
@@ -44,7 +47,11 @@ class LogStash::Outputs::CSV < LogStash::Outputs::File
44
47
  private
45
48
  def get_value(name, event)
46
49
  val = event[name]
47
- val.is_a?(Hash) ? LogStash::Json.dump(val) : val
50
+ val.is_a?(Hash) ? LogStash::Json.dump(val) : escape_csv(val)
48
51
  end
49
- end # class LogStash::Outputs::CSV
50
52
 
53
+ private
54
+ def escape_csv(val)
55
+ (spreadsheet_safe && val.is_a?(String) && val.start_with?("=")) ? "'#{val}" : val
56
+ end
57
+ end # class LogStash::Outputs::CSV
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-output-csv'
4
- s.version = '2.0.2'
4
+ s.version = '2.0.3'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Write events to disk in CSV or other delimited format"
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"
@@ -22,8 +22,8 @@ Gem::Specification.new do |s|
22
22
  # Gem dependencies
23
23
  s.add_runtime_dependency "logstash-core", ">= 2.0.0.beta2", "< 3.0.0"
24
24
 
25
+ s.add_runtime_dependency 'logstash-input-generator'
25
26
  s.add_runtime_dependency 'logstash-output-file'
26
27
  s.add_runtime_dependency 'logstash-filter-json'
27
28
  s.add_development_dependency 'logstash-devutils'
28
29
  end
29
-
@@ -4,7 +4,7 @@ require "logstash/devutils/rspec/spec_helper"
4
4
  require "logstash/outputs/csv"
5
5
 
6
6
  describe LogStash::Outputs::CSV do
7
-
7
+
8
8
 
9
9
  describe "Write a single field to a csv file" do
10
10
  tmpfile = Tempfile.new('logstash-spec-output-csv')
@@ -263,4 +263,56 @@ describe LogStash::Outputs::CSV do
263
263
  insist {lines[0]} == "one|two\tone|two\t"
264
264
  end
265
265
  end
266
+
267
+ describe "can escape rogue values" do
268
+ tmpfile = Tempfile.new('logstash-spec-output-csv')
269
+ config <<-CONFIG
270
+ input {
271
+ generator {
272
+ add_field => ["foo","1+1", "baz", "=1+1"]
273
+ count => 1
274
+ }
275
+ }
276
+ output {
277
+ csv {
278
+ path => "#{tmpfile.path}"
279
+ fields => ["foo", "baz"]
280
+ }
281
+ }
282
+ CONFIG
283
+
284
+ agent do
285
+ lines = CSV.read(tmpfile.path)
286
+ insist {lines.count} == 1
287
+ insist {lines[0][0]} == "1+1"
288
+ insist {lines[0][1]} == "'=1+1"
289
+ end
290
+ end
291
+
292
+ describe "can turn off escaping rogue values" do
293
+ tmpfile = Tempfile.new('logstash-spec-output-csv')
294
+ config <<-CONFIG
295
+ input {
296
+ generator {
297
+ add_field => ["foo","1+1", "baz", "=1+1"]
298
+ count => 1
299
+ }
300
+ }
301
+ output {
302
+ csv {
303
+ path => "#{tmpfile.path}"
304
+ spreadsheet_safe => false
305
+ fields => ["foo", "baz"]
306
+ }
307
+ }
308
+ CONFIG
309
+
310
+ agent do
311
+ lines = CSV.read(tmpfile.path)
312
+ insist {lines.count} == 1
313
+ insist {lines[0][0]} == "1+1"
314
+ insist {lines[0][1]} == "=1+1"
315
+ end
316
+ end
317
+
266
318
  end
metadata CHANGED
@@ -1,17 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-csv
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-14 00:00:00.000000000 Z
11
+ date: 2016-01-16 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,48 +28,64 @@ 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-input-generator
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-output-file
40
45
  prerelease: false
41
46
  type: :runtime
47
+ - !ruby/object:Gem::Dependency
48
+ name: logstash-output-file
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-filter-json
54
59
  prerelease: false
55
60
  type: :runtime
61
+ - !ruby/object:Gem::Dependency
62
+ name: logstash-filter-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-devutils
68
73
  prerelease: false
69
- type: :development
74
+ type: :runtime
75
+ - !ruby/object:Gem::Dependency
76
+ name: logstash-devutils
70
77
  version_requirements: !ruby/object:Gem::Requirement
71
78
  requirements:
72
79
  - - '>='
73
80
  - !ruby/object:Gem::Version
74
81
  version: '0'
82
+ requirement: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ prerelease: false
88
+ type: :development
75
89
  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
76
90
  email: info@elastic.co
77
91
  executables: []