evt-dns-resolve_host 0.0.0.0 → 0.1.0.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
  SHA1:
3
- metadata.gz: a7f2c109900a98a609793db9aa17c57a226d0622
4
- data.tar.gz: e37d7580573e4e595a3dd1710af66d1d3b3dfb6e
3
+ metadata.gz: ae6e00ea579cee629e25ccd99a53b4c317c626fe
4
+ data.tar.gz: b128cc7ae8cbf445fa7d7cfc44e450b8a34b51cf
5
5
  SHA512:
6
- metadata.gz: 958116b8dc08f84892e3847f93fd266908408df50916271b096af5b5e93e32b40dc8a6c72eea054d5c19ca649d024f8d83a00c6433ec9664bc78a3576a131504
7
- data.tar.gz: dfbccae87305fdb7b11fdca2cb5883eb65f58a58a778d7ebc1646a6f7bf804b6505d8d39c3f1f833ff813d3e30cbbefe8414e2f85667cbf116cf76d6d59d9c3a
6
+ metadata.gz: a69ac9ab686e8f9164f63383a192c150a6e806c05bc03abd57fe42df6ea60dce69da04b6e612460002d74186ebd6a9bfeea83bcc887ae8d298f7efb9e4badb29
7
+ data.tar.gz: 740b17b05105e2246b250bd84c957d94bf6d496568c43d1e338ac686df302524c5211ab838d45c1760ff7e8e4806389ceb2538f618d6b4394bb84d7eb451c363
@@ -1,9 +1,14 @@
1
+ require 'ipaddr'
2
+ require 'resolv'
3
+
1
4
  require 'configure'; Configure.activate
2
- require 'log'
5
+ require 'settings'; Settings.activate
3
6
 
4
7
  require 'dns/resolve_host/log'
5
8
 
6
9
  require 'dns/resolve_host/defaults'
7
- require 'dns/resolve_host/nameserver'
10
+ require 'dns/resolve_host/log_attributes'
8
11
  require 'dns/resolve_host/resolve_host'
12
+ require 'dns/resolve_host/resolution_error'
9
13
  require 'dns/resolve_host/substitute'
14
+ require 'dns/resolve_host/static_resolver'
@@ -21,9 +21,7 @@ module DNS
21
21
  end
22
22
  end
23
23
 
24
- nameserver = Nameserver.new bind_address, port
25
-
26
- block.(nameserver)
24
+ block.(bind_address, port)
27
25
 
28
26
  # The rubydns library does not properly unbind its server socket when
29
27
  # the actor terminates. See the following github issue:
@@ -0,0 +1,15 @@
1
+ module DNS
2
+ class ResolveHost
3
+ module LogAttributes
4
+ def self.get(resolve_host, hostname)
5
+ if resolve_host.nameserver_address
6
+ nameserver = "#{resolve_host.nameserver_address}:#{resolve_host.nameserver_port}"
7
+ else
8
+ nameserver = "(system)"
9
+ end
10
+
11
+ "Hostname: #{hostname}, Nameserver: #{nameserver}"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ module DNS
2
+ class ResolveHost
3
+ ResolutionError = Class.new StandardError
4
+ end
5
+ end
@@ -4,44 +4,71 @@ module DNS
4
4
 
5
5
  configure :resolve_host
6
6
 
7
- attr_accessor :nameserver
7
+ attr_accessor :nameserver_address
8
+ attr_writer :nameserver_port
8
9
 
9
- def call(hostname, &block)
10
- if nameserver
11
- options = { :nameserver_port => [nameserver.to_a] }
12
- else
13
- options = nil
10
+ dependency :hosts_resolver, Resolv::Hosts
11
+
12
+ def self.build(address: nil, port: nil, hosts_file: nil)
13
+ if address.nil? and not port.nil?
14
+ raise ArgumentError, "Cannot specify port without address"
14
15
  end
15
16
 
17
+ instance = new
18
+
19
+ StaticResolver.configure instance, hosts_file, attr_name: :hosts_resolver
20
+
21
+ instance.nameserver_address = address if address
22
+ instance.nameserver_port = port if port
23
+
24
+ instance
25
+ end
26
+
27
+ def self.call(hostname, &block)
28
+ instance = new
29
+ instance.(hostname, &block)
30
+ end
31
+
32
+ def call(hostname, &block)
16
33
  logger.trace { "Resolving host (#{LogAttributes.get self, hostname})" }
17
34
 
18
- Resolv::DNS.open options do |dns|
19
- block.(dns) if block
35
+ Resolv::DNS.open dns_resolver_options do |dns_resolver|
36
+ resolver = Resolv.new [hosts_resolver, dns_resolver]
37
+
38
+ block.(dns_resolver) if block
20
39
 
21
- addresses = dns.getaddresses hostname
40
+ addresses = resolver.getaddresses hostname
22
41
 
23
42
  addresses.map! &:to_s
24
43
 
25
44
  if addresses.empty?
26
- logger.warn { "Could not resolve host (#{LogAttributes.get self, hostname})" }
27
- else
28
- logger.info { "Resolved host (#{LogAttributes.get self, hostname}, Address#{'es' unless addresses.count == 1}: #{addresses * ', '})" }
45
+ error_message = "Could not resolve host (#{LogAttributes.get self, hostname})"
46
+ logger.error { error_message }
47
+ raise ResolutionError, error_message
29
48
  end
30
49
 
50
+ logger.info { "Resolved host (#{LogAttributes.get self, hostname}, Address#{'es' unless addresses.count == 1}: #{addresses * ', '})" }
51
+
31
52
  return addresses
32
53
  end
33
54
  end
34
55
 
35
- module LogAttributes
36
- def self.get(resolve_host, hostname)
37
- if resolve_host.nameserver
38
- nameserver = resolve_host.nameserver.to_a * ':'
39
- else
40
- nameserver = "(system)"
41
- end
42
-
43
- "Hostname: #{hostname}, Nameserver: #{nameserver}"
56
+ def dns_resolver_options
57
+ if nameserver_address
58
+ { :nameserver_port => [nameserver] }
59
+ else
60
+ # Resolv::DNS.new expects the options argument to be *nil* when the
61
+ # system nameservers are meant to be used [Nathan Ladd, Mon 2 Jan 2017]
62
+ nil
44
63
  end
45
64
  end
65
+
66
+ def nameserver
67
+ [nameserver_address, nameserver_port]
68
+ end
69
+
70
+ def nameserver_port
71
+ @nameserver_port ||= Defaults.port
72
+ end
46
73
  end
47
74
  end
@@ -0,0 +1,39 @@
1
+ module DNS
2
+ class ResolveHost
3
+ module StaticResolver
4
+ def self.get(hosts_file=nil)
5
+ logger.trace { "Constructing static resolver (HostsFile: #{hosts_file.inspect})" }
6
+
7
+ if hosts_file.nil?
8
+ hosts_file = Resolv::Hosts::DefaultFileName
9
+ elsif !File.exist?(hosts_file)
10
+ File.open(hosts_file) { }
11
+ end
12
+
13
+ static_resolver = Resolv::Hosts.new hosts_file
14
+
15
+ logger.trace { "Static resolver constructed (HostsFile: #{hosts_file})" }
16
+
17
+ static_resolver
18
+ end
19
+
20
+ def self.configure(receiver, hosts_file=nil, attr_name: nil)
21
+ attr_name ||= :static_resolver
22
+
23
+ instance = get hosts_file
24
+ receiver.public_send "#{attr_name}=", instance
25
+ instance
26
+ end
27
+
28
+ def self.logger
29
+ @logger ||= Log.get self
30
+ end
31
+
32
+ module Assertions
33
+ def file?(file)
34
+ @filename == file
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -7,7 +7,20 @@ module DNS
7
7
 
8
8
  class ResolveHost
9
9
  def call(hostname)
10
- map[hostname]
10
+ if map.key? hostname
11
+ map[hostname]
12
+ elsif ip_address? hostname
13
+ [hostname]
14
+ else
15
+ raise ResolutionError
16
+ end
17
+ end
18
+
19
+ def ip_address?(string)
20
+ IPAddr.new string
21
+ true
22
+ rescue IPAddr::InvalidAddressError
23
+ false
11
24
  end
12
25
 
13
26
  def set(hostname, ip_addresses)
@@ -19,7 +32,7 @@ module DNS
19
32
  end
20
33
 
21
34
  def map
22
- @map ||= Hash.new { [] }
35
+ @map ||= {}
23
36
  end
24
37
  end
25
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evt-dns-resolve_host
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0.0
4
+ version: 0.1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - The Eventide Project
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-30 00:00:00.000000000 Z
11
+ date: 2017-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: evt-configure
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: evt-log
28
+ name: evt-settings
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -79,8 +79,10 @@ files:
79
79
  - lib/dns/resolve_host/controls/server.rb
80
80
  - lib/dns/resolve_host/defaults.rb
81
81
  - lib/dns/resolve_host/log.rb
82
- - lib/dns/resolve_host/nameserver.rb
82
+ - lib/dns/resolve_host/log_attributes.rb
83
+ - lib/dns/resolve_host/resolution_error.rb
83
84
  - lib/dns/resolve_host/resolve_host.rb
85
+ - lib/dns/resolve_host/static_resolver.rb
84
86
  - lib/dns/resolve_host/substitute.rb
85
87
  homepage: https://github.com/eventide-project/dns-resolve-host
86
88
  licenses:
@@ -1,9 +0,0 @@
1
- module DNS
2
- class ResolveHost
3
- Nameserver = Struct.new :ip_address, :port do
4
- def to_a
5
- [ip_address, port]
6
- end
7
- end
8
- end
9
- end