evt-dns-resolve_host 0.0.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a7f2c109900a98a609793db9aa17c57a226d0622
4
+ data.tar.gz: e37d7580573e4e595a3dd1710af66d1d3b3dfb6e
5
+ SHA512:
6
+ metadata.gz: 958116b8dc08f84892e3847f93fd266908408df50916271b096af5b5e93e32b40dc8a6c72eea054d5c19ca649d024f8d83a00c6433ec9664bc78a3576a131504
7
+ data.tar.gz: dfbccae87305fdb7b11fdca2cb5883eb65f58a58a778d7ebc1646a6f7bf804b6505d8d39c3f1f833ff813d3e30cbbefe8414e2f85667cbf116cf76d6d59d9c3a
@@ -0,0 +1,13 @@
1
+ module DNS
2
+ class ResolveHost
3
+ module Controls
4
+ module Hostname
5
+ def self.example(prefix=nil)
6
+ prefix ||= "some-hostname"
7
+
8
+ "#{prefix}.example"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ module DNS
2
+ class ResolveHost
3
+ module Controls
4
+ module IPAddress
5
+ def self.example(i=nil)
6
+ i ||= 1
7
+
8
+ ip_address = IPAddr.new "127.0.0.#{i}"
9
+
10
+ ip_address.to_s
11
+ end
12
+
13
+ def self.list(count=nil)
14
+ count ||= 3
15
+
16
+ (1..count).map do |i|
17
+ example i
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,63 @@
1
+ module DNS
2
+ class ResolveHost
3
+ module Controls
4
+ module Server
5
+ def self.start(hostname: nil, ip_addresses: nil, &block)
6
+ hostname ||= Hostname.example
7
+ ip_addresses ||= [IPAddress.example]
8
+
9
+ bind_address = BindAddress.example
10
+ port = Port.example
11
+
12
+ interfaces = [[:udp, bind_address, port], [:tcp, bind_address, port]]
13
+
14
+ Celluloid.logger = Log.get self
15
+
16
+ dns_server = RubyDNS.run_server :listen => interfaces, :asynchronous => true do
17
+ match %r{\A#{Regexp.escape hostname}\z} do |request|
18
+ ip_addresses.each do |ip_address|
19
+ request.respond! ip_address
20
+ end
21
+ end
22
+ end
23
+
24
+ nameserver = Nameserver.new bind_address, port
25
+
26
+ block.(nameserver)
27
+
28
+ # The rubydns library does not properly unbind its server socket when
29
+ # the actor terminates. See the following github issue:
30
+ #
31
+ # https://github.com/ioquatix/rubydns/issues/60
32
+ #
33
+ # The workaround discovered by the person who filed the issue is
34
+ # pasted here. The proper way to stop the DNS server would be this:
35
+ #
36
+ # dns_server.terminate
37
+ #
38
+ # [Nathan Ladd, Fri 30 Dec 2016]
39
+ dns_server.actors.first.links.each(&:terminate)
40
+ end
41
+
42
+ class Log < ::Log
43
+ def tag!(tags)
44
+ tags << :celluloid
45
+ tags << :control_dns_server
46
+ end
47
+ end
48
+
49
+ module BindAddress
50
+ def self.example
51
+ '127.0.0.1'
52
+ end
53
+ end
54
+
55
+ module Port
56
+ def self.example
57
+ 10053
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,16 @@
1
+ require 'dns/resolve_host/controls/ip_address'
2
+ require 'dns/resolve_host/controls/hostname'
3
+
4
+ begin
5
+ require 'rubydns'
6
+ require 'dns/resolve_host/controls/server'
7
+ rescue LoadError
8
+ require 'pathname'
9
+
10
+ log_subject = Pathname.new(__FILE__).relative_path_from(Pathname.new(Dir.pwd))
11
+ logger = DNS::ResolveHost::Log.get log_subject.to_s
12
+
13
+ logger.warn <<~TEXT
14
+ rubydns is not present in the load path. As a result, the control server was not loaded. If the control server is needed, add `rubydns' to the current project.
15
+ TEXT
16
+ end
@@ -0,0 +1,9 @@
1
+ module DNS
2
+ class ResolveHost
3
+ module Defaults
4
+ def self.port
5
+ 53
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ module DNS
2
+ class ResolveHost
3
+ class Log < ::Log
4
+ def tag!(tags)
5
+ tags << :dns_resolve_host
6
+ tags << :dns
7
+ tags << :verbose
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
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
@@ -0,0 +1,47 @@
1
+ module DNS
2
+ class ResolveHost
3
+ include Log::Dependency
4
+
5
+ configure :resolve_host
6
+
7
+ attr_accessor :nameserver
8
+
9
+ def call(hostname, &block)
10
+ if nameserver
11
+ options = { :nameserver_port => [nameserver.to_a] }
12
+ else
13
+ options = nil
14
+ end
15
+
16
+ logger.trace { "Resolving host (#{LogAttributes.get self, hostname})" }
17
+
18
+ Resolv::DNS.open options do |dns|
19
+ block.(dns) if block
20
+
21
+ addresses = dns.getaddresses hostname
22
+
23
+ addresses.map! &:to_s
24
+
25
+ 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 * ', '})" }
29
+ end
30
+
31
+ return addresses
32
+ end
33
+ end
34
+
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}"
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,27 @@
1
+ module DNS
2
+ class ResolveHost
3
+ module Substitute
4
+ def self.build
5
+ ResolveHost.new
6
+ end
7
+
8
+ class ResolveHost
9
+ def call(hostname)
10
+ map[hostname]
11
+ end
12
+
13
+ def set(hostname, ip_addresses)
14
+ ip_addresses = Array(ip_addresses)
15
+
16
+ map[hostname] = ip_addresses
17
+
18
+ ip_addresses
19
+ end
20
+
21
+ def map
22
+ @map ||= Hash.new { [] }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,9 @@
1
+ require 'configure'; Configure.activate
2
+ require 'log'
3
+
4
+ require 'dns/resolve_host/log'
5
+
6
+ require 'dns/resolve_host/defaults'
7
+ require 'dns/resolve_host/nameserver'
8
+ require 'dns/resolve_host/resolve_host'
9
+ require 'dns/resolve_host/substitute'
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: evt-dns-resolve_host
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - The Eventide Project
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-12-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: evt-configure
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: evt-log
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: test_bench
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubydns
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: " "
70
+ email: opensource@eventide-project.org
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - lib/dns/resolve_host.rb
76
+ - lib/dns/resolve_host/controls.rb
77
+ - lib/dns/resolve_host/controls/hostname.rb
78
+ - lib/dns/resolve_host/controls/ip_address.rb
79
+ - lib/dns/resolve_host/controls/server.rb
80
+ - lib/dns/resolve_host/defaults.rb
81
+ - lib/dns/resolve_host/log.rb
82
+ - lib/dns/resolve_host/nameserver.rb
83
+ - lib/dns/resolve_host/resolve_host.rb
84
+ - lib/dns/resolve_host/substitute.rb
85
+ homepage: https://github.com/eventide-project/dns-resolve-host
86
+ licenses:
87
+ - MIT
88
+ metadata: {}
89
+ post_install_message:
90
+ rdoc_options: []
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 2.3.3
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ requirements: []
104
+ rubyforge_project:
105
+ rubygems_version: 2.6.8
106
+ signing_key:
107
+ specification_version: 4
108
+ summary: Resolve host names to IP addresses
109
+ test_files: []