logstash-filter-dns 3.0.14 → 3.1.0

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
  SHA256:
3
- metadata.gz: 341ced782cd6b185f99d4f4bee0fd087730be5778d5047db4bdffe8b120078c5
4
- data.tar.gz: 497917e8f50a780a61b8ce9d868ed160639373bc0ff2effee9d3d201a9d1cd67
3
+ metadata.gz: 72c7e403d0237346a3b975607b580a4becc8c8fb58307837787672aedd8c1e39
4
+ data.tar.gz: 362fda06ed74282ccb9601d8edd520de61feb04da36dd4faf37242ddabfe334e
5
5
  SHA512:
6
- metadata.gz: 7551c9b77b2502b20054a84e9ea708d3fd2ff2b861058748e2f7b5f4b4036157cdf939cf37a92c967afd08a6b00ca437ebc28b44ea8a7bda914d2c164bb1176e
7
- data.tar.gz: d94d30376359478c31b85a98a6b27facdcb21f295094a5e5dc10e3d59b075ba8c4800e50cebd4098c14964aae4746dfe41df17d6de2d15649b4a2ccaefe229a2
6
+ metadata.gz: 63b668e2338a8b0a7d2135bcc54fb6325cad0a1cce60a5a6aadd6a9328c14e8a187248d2211cff189c6bbddea185b1150fe46af2b816a29f735498fbf35d0033
7
+ data.tar.gz: 7ebd10080f2bd78bc325a566f5b31031d20bb8c3e35ee8481bb6943ab8bc07587883f61270b32116500455053a9641f8191cca13f85a25ee5101fab6c513b97c
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 3.1.0
2
+ - Added search domains to the `nameserver` option [#56](https://github.com/logstash-plugins/logstash-filter-dns/pull/56)
3
+
1
4
  ## 3.0.14
2
5
  - Added documentation on the `nameserver` option for relying on `/etc/resolv.conf` to configure the resolver
3
6
 
data/docs/index.asciidoc CHANGED
@@ -55,7 +55,7 @@ This plugin supports the following configuration options plus the <<plugins-{typ
55
55
  | <<plugins-{type}s-{plugin}-hit_cache_ttl>> |<<number,number>>|No
56
56
  | <<plugins-{type}s-{plugin}-hostsfile>> |<<array,array>>|No
57
57
  | <<plugins-{type}s-{plugin}-max_retries>> |<<number,number>>|No
58
- | <<plugins-{type}s-{plugin}-nameserver>> |<<array,array>>|No
58
+ | <<plugins-{type}s-{plugin}-nameserver>> |<<hash,hash>>|No
59
59
  | <<plugins-{type}s-{plugin}-resolve>> |<<array,array>>|No
60
60
  | <<plugins-{type}s-{plugin}-reverse>> |<<array,array>>|No
61
61
  | <<plugins-{type}s-{plugin}-timeout>> |<<number,number>>|No
@@ -126,18 +126,29 @@ number of times to retry a failed resolve/reverse
126
126
  [id="plugins-{type}s-{plugin}-nameserver"]
127
127
  ===== `nameserver`
128
128
 
129
- * Value type is <<array,array>>
129
+ * Value type is <<hash,hash>>, and is composed of:
130
+ * a required `address` key, whose value is either a <<string,string>> or an <<array,array>>, representing one or more nameserver ip addresses
131
+ * an optional `search` key, whose value is either a <<string,string>> or an <<array,array>>, representing between one and six search domains (e.g., with search domain `com`, a query for `example` will match DNS entries for `example.com`)
132
+ * an optional `ndots` key, used in conjunction with `search`, whose value is a <<number,number>>, representing the minimum number of dots in a domain name being resolved that will _prevent_ the search domains from being used (default `1`; this option is rarely needed)
133
+ * For backward-compatibility, values of <<string,string>> and <<array,array>> are also accepted, representing one or more nameserver ip addresses _without_ search domains.
130
134
  * There is no default value for this setting.
131
135
 
132
- Use custom nameserver(s). For example: `["8.8.8.8", "8.8.4.4"]`.
136
+ Use custom nameserver(s). For example:
137
+
138
+ [source]
139
+ filter {
140
+ dns {
141
+ nameserver => {
142
+ address => ["8.8.8.8", "8.8.4.4"]
143
+ search => ["internal.net"]
144
+ }
145
+ }
146
+ }
147
+
133
148
  If `nameserver` is not specified then `/etc/resolv.conf` will be read to
134
149
  configure the resolver using the `nameserver`, `domain`,
135
150
  `search` and `ndots` directives in `/etc/resolv.conf`.
136
151
 
137
- Note that nameservers normally resolve fully qualified domain names (FQDN)
138
- and relying on `/etc/resolv.conf` can be useful to provide a domains search
139
- list to resolve underqualified host names for example.
140
-
141
152
  [id="plugins-{type}s-{plugin}-resolve"]
142
153
  ===== `resolve`
143
154
 
@@ -46,14 +46,25 @@ class LogStash::Filters::DNS < LogStash::Filters::Base
46
46
  # specified under `reverse` and `resolve`.
47
47
  config :action, :validate => [ "append", "replace" ], :default => "append"
48
48
 
49
- # Use custom nameserver(s). For example: `["8.8.8.8", "8.8.4.4"]`.
49
+ # Use custom nameserver(s). For example:
50
+ # filter {
51
+ # dns {
52
+ # nameserver => {
53
+ # address => ["8.8.8.8", "8.8.4.4"]
54
+ # search => ["internal.net"]
55
+ # }
56
+ # }
57
+ # }
58
+ #
59
+ # nameserver is a hash with the following key:
60
+ # * a required `address` key, whose value is either a <<string,string>> or an <<array,array>>, representing one or more nameserver ip addresses
61
+ # * an optional `search` key, whose value is either a <<string,string>> or an <<array,array>>, representing between one and six search domains (e.g., with search domain `com`, a query for `example` will match DNS entries for `example.com`)
62
+ # * an optional `ndots` key, used in conjunction with `search`, whose value is a <<number,number>>, representing the minimum number of dots in a domain name being resolved that will _prevent_ the search domains from being used (default `1`; this option is rarely needed)
63
+ # * For backward-compatibility, string ans arrays values are also accepted, representing one or more nameserver ip addresses _without_ search domains.
64
+ #
50
65
  # If `nameserver` is not specified then `/etc/resolv.conf` will be read to
51
66
  # configure the resolver using the `nameserver`, `domain`,
52
67
  # `search` and `ndots` directives in `/etc/resolv.conf`.
53
- #
54
- # Note that nameservers normally resolve fully qualified domain names (FQDN)
55
- # and relying on `/etc/resolv.conf` can be useful to provide a domains search
56
- # list to resolve underqualified host names for example.
57
68
  config :nameserver, :validate => :array
58
69
 
59
70
  # `resolv` calls will be wrapped in a timeout instance
@@ -125,7 +136,32 @@ class LogStash::Filters::DNS < LogStash::Filters::Base
125
136
 
126
137
  def build_user_dns_resolver
127
138
  return [] if @nameserver.nil? || @nameserver.empty?
128
- [::Resolv::DNS.new(:nameserver => @nameserver, :search => [], :ndots => 1)]
139
+
140
+ [::Resolv::DNS.new(normalised_nameserver)]
141
+ end
142
+
143
+ def normalised_nameserver
144
+ nameserver_hash = @nameserver.kind_of?(Hash) ? @nameserver.dup : { 'address' => @nameserver }
145
+
146
+ nameserver = nameserver_hash.delete('address') || fail(LogStash::ConfigurationError, "DNS Filter: `nameserver` hash must include `address` (got `#{@nameserver}`)")
147
+ nameserver = Array(nameserver).map(&:to_s)
148
+ nameserver.empty? && fail(LogStash::ConfigurationError, "DNS Filter: `nameserver` addresses, when specified, cannot be empty (got `#{@nameserver}`)")
149
+
150
+ search = nameserver_hash.delete('search') || []
151
+ search = Array(search).map(&:to_s)
152
+ search.size > 6 && fail(LogStash::ConfigurationError, "DNS Filter: A maximum of 6 `search` domains are accepted (got `#{@nameserver}`)")
153
+
154
+ ndots = nameserver_hash.delete('ndots') || 1
155
+ ndots = Integer(ndots)
156
+ ndots <= 0 && fail(LogStash::ConfigurationError, "DNS Filter: `ndots` must be positive (got `#{@nameserver}`)")
157
+
158
+ fail(LogStash::ConfigurationError, "Unknown `nameserver` argument(s): #{nameserver_hash}") unless nameserver_hash.empty?
159
+
160
+ {
161
+ :nameserver => nameserver,
162
+ :search => search,
163
+ :ndots => ndots
164
+ }
129
165
  end
130
166
 
131
167
  def resolve(event)
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-filter-dns'
4
- s.version = '3.0.14'
4
+ s.version = '3.1.0'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Performs a standard or reverse DNS lookup"
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/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -418,7 +418,119 @@ describe LogStash::Filters::DNS do
418
418
  end
419
419
  end
420
420
 
421
- describe "with nameserver integration" do
421
+ describe "with search configuration" do
422
+ subject(:dns_filter_plugin) { LogStash::Filters::DNS.new(config) }
423
+
424
+ before(:each) do
425
+ subject.register
426
+ end
427
+
428
+ context "search domain specified" do
429
+ let(:config) { { "resolve" => ["domain"], "action" => "replace", "nameserver" => { "address" => ["1.2.3.4"], "search" => "elastic.co" } } }
430
+ let(:event) { LogStash::Event.new("domain" => "training") }
431
+
432
+ it "will expand training to training.elastic.co" do
433
+ allow(Resolv::DNS::Name).to receive(:new).and_call_original
434
+
435
+ # This is implementation specific but the only way I found to verify that the "search" option was working.
436
+ expect(Resolv::DNS::Name).to receive(:new).with([Resolv::DNS::Label::Str.new("training"), Resolv::DNS::Label::Str.new("elastic"), Resolv::DNS::Label::Str.new("co")]).and_call_original
437
+
438
+ subject.filter(event)
439
+ end
440
+ end
441
+ end
442
+
443
+ describe "with nameserver configuration" do
444
+ subject(:dns_filter_plugin) { LogStash::Filters::DNS.new(config) }
445
+
446
+ before(:each) do
447
+ allow(Resolv::DNS).to receive(:new).and_call_original
448
+ end
449
+
450
+ context 'nameserver specified as a string' do
451
+ let(:config) { { "nameserver" => "8.8.8.8" } }
452
+
453
+ it 'sets up the expected Resolv::DNS' do
454
+ dns_filter_plugin.register
455
+
456
+ expect(Resolv::DNS).to have_received(:new).with(:nameserver => ["8.8.8.8"], :search => [], :ndots => 1)
457
+ end
458
+ end
459
+
460
+ context 'nameserver specified as an array of strings' do
461
+ let(:config) { { "nameserver" => ["8.8.8.8", "8.8.4.4"] } }
462
+
463
+ it 'sets up the expected Resolv::DNS' do
464
+ dns_filter_plugin.register
465
+
466
+ expect(Resolv::DNS).to have_received(:new).with(:nameserver => ["8.8.8.8", "8.8.4.4"], :search => [], :ndots => 1)
467
+ end
468
+ end
469
+
470
+ context 'nameserver specified as a hash' do
471
+ context 'with only string address' do
472
+ let(:config) { { "nameserver" => { "address" => "8.8.8.8" } } }
473
+
474
+ it 'sets up the expected Resolv::DNS' do
475
+ dns_filter_plugin.register
476
+
477
+ expect(Resolv::DNS).to have_received(:new).with(:nameserver => ["8.8.8.8"], :search => [], :ndots => 1)
478
+ end
479
+ end
480
+ context 'with only array address' do
481
+ let(:config) { { "nameserver" => { "address" => ["8.8.8.8", "8.8.4.4"] } } }
482
+
483
+ it 'sets up the expected Resolv::DNS' do
484
+ dns_filter_plugin.register
485
+
486
+ expect(Resolv::DNS).to have_received(:new).with(:nameserver => ["8.8.8.8", "8.8.4.4"], :search => [], :ndots => 1)
487
+ end
488
+ end
489
+ context 'with search domains' do
490
+ let(:config) do
491
+ {
492
+ "nameserver" => {
493
+ "address" => ["127.0.0.1"],
494
+ "search" => search_domains
495
+ }
496
+ }
497
+ end
498
+
499
+ {
500
+ "string" => "internal.net",
501
+ "array of strings" => ["internal.net", "internal1.com"]
502
+ }.each do |desc, search_domains_arg|
503
+ let(:search_domains) { search_domains_arg }
504
+ context "as #{desc}" do
505
+ it 'sets up the expected Resolv::DNS' do
506
+ dns_filter_plugin.register
507
+
508
+ expect(Resolv::DNS).to have_received(:new).with(:nameserver => ["127.0.0.1"], :search => Array(search_domains), :ndots => 1)
509
+ end
510
+ end
511
+ end
512
+ end
513
+ end
514
+ end
515
+
516
+ describe "without nameserver configuration" do
517
+ subject(:dns_filter_plugin) { LogStash::Filters::DNS.new(config) }
518
+
519
+ context 'nameserver not specified' do
520
+ let(:config) { { "resolve" => ["domain"], "action" => "replace" } }
521
+
522
+ it 'sets up the expected Resolv::DNS without arguments' do
523
+ # We expect that when no nameserver option is specified
524
+ # Resolv::DNS.new will be called without arguments thus reading /etc/resolv.conf
525
+ # for its configuration which is the desired behaviour for backward compatibility
526
+
527
+ expect(Resolv::DNS).to receive(:new).once.with(no_args)
528
+ dns_filter_plugin.register
529
+ end
530
+ end
531
+ end
532
+
533
+ describe "with hostsfile integration" do
422
534
  describe "lookup using fixture hosts file" do
423
535
  let(:subject) { LogStash::Filters::DNS.new(config) }
424
536
  let(:hostsfile) { File.join(File.dirname(__FILE__), "..", "fixtures", "hosts") }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-filter-dns
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.14
4
+ version: 3.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: 2019-10-18 00:00:00.000000000 Z
11
+ date: 2019-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement