evt-dns-resolve_host 0.0.0.0 → 0.1.0.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: 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