vagrant-dns 2.2.3 → 2.4.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 +4 -4
- data/.editorconfig +16 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +17 -5
- data/DEVELOPMENT.md +18 -2
- data/Gemfile +4 -1
- data/PLATFORM_SUPPORT.md +20 -9
- data/README.md +76 -15
- data/lib/vagrant-dns/command.rb +19 -15
- data/lib/vagrant-dns/config.rb +15 -10
- data/lib/vagrant-dns/configurator.rb +151 -80
- data/lib/vagrant-dns/installers/linux.rb +73 -0
- data/lib/vagrant-dns/installers/mac.rb +16 -2
- data/lib/vagrant-dns/installers.rb +16 -0
- data/lib/vagrant-dns/registry.rb +7 -48
- data/lib/vagrant-dns/server.rb +82 -0
- data/lib/vagrant-dns/service.rb +31 -36
- data/lib/vagrant-dns/store.rb +59 -0
- data/lib/vagrant-dns/tld_registry.rb +19 -0
- data/lib/vagrant-dns/version.rb +1 -1
- data/lib/vagrant-dns.rb +3 -1
- data/tasks/acceptance.rake +3 -1
- data/vagrant-dns.gemspec +9 -2
- data/vagrant-spec.config.rb +1 -3
- metadata +26 -9
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "fileutils"
|
2
2
|
|
3
3
|
module VagrantDNS
|
4
4
|
class Configurator
|
@@ -20,117 +20,188 @@ module VagrantDNS
|
|
20
20
|
unregister_patterns!
|
21
21
|
end
|
22
22
|
|
23
|
-
private
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
vm.ui.warn(err)
|
30
|
-
end
|
31
|
-
valid
|
23
|
+
private def validate_tlds
|
24
|
+
valid, err = VagrantDNS::Config.validate_tlds(vm)
|
25
|
+
if !valid
|
26
|
+
vm.ui.error(err)
|
27
|
+
elsif err
|
28
|
+
vm.ui.warn(err)
|
32
29
|
end
|
30
|
+
valid
|
31
|
+
end
|
33
32
|
|
34
|
-
|
35
|
-
|
33
|
+
private def regenerate_resolvers!
|
34
|
+
resolver_folder = self.resolver_folder
|
35
|
+
_proto, ip, port = VagrantDNS::Config.listen.first
|
36
|
+
tlds = register_tlds!
|
36
37
|
|
37
|
-
|
38
|
-
|
38
|
+
resolver_files(ip, port, tlds) do |filename, contents|
|
39
|
+
File.write(File.join(resolver_folder, filename), contents)
|
40
|
+
end
|
41
|
+
end
|
39
42
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
43
|
+
private def register_tlds!
|
44
|
+
add_tlds = dns_options(vm)[:tlds]
|
45
|
+
VagrantDNS::TldRegistry
|
46
|
+
.new(tmp_path)
|
47
|
+
.transaction do |store|
|
48
|
+
store["tlds"] ||= []
|
49
|
+
store["tlds"] |= add_tlds
|
50
|
+
store["tlds"]
|
44
51
|
end
|
52
|
+
end
|
53
|
+
|
54
|
+
private def register_patterns!
|
55
|
+
opts = dns_options(vm)
|
56
|
+
|
57
|
+
patterns = opts[:patterns] || default_patterns(opts)
|
58
|
+
if patterns.empty?
|
59
|
+
vm.ui.warn "[vagrant-dns] TLD but no host_name given. No patterns will be configured."
|
60
|
+
return
|
45
61
|
end
|
46
62
|
|
47
|
-
|
48
|
-
|
63
|
+
ip = vm_ip(opts)
|
64
|
+
unless ip
|
65
|
+
vm.ui.detail "[vagrant-dns] No patterns will be configured."
|
66
|
+
return
|
67
|
+
end
|
49
68
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
69
|
+
registry = Registry.new(tmp_path)
|
70
|
+
registry.transaction do
|
71
|
+
patterns.each { |pattern| registry[pattern] = ip }
|
72
|
+
end
|
73
|
+
end
|
55
74
|
|
56
|
-
|
57
|
-
|
75
|
+
private def unregister_patterns!
|
76
|
+
opts = dns_options(vm)
|
77
|
+
|
78
|
+
patterns = opts[:patterns] || default_patterns(opts)
|
79
|
+
if patterns.empty?
|
80
|
+
vm.ui.warn "[vagrant-dns] TLD but no host_name given. No patterns will be removed."
|
81
|
+
return
|
82
|
+
end
|
83
|
+
|
84
|
+
registry = Registry.open(tmp_path)
|
85
|
+
return unless registry
|
86
|
+
|
87
|
+
registry.transaction do
|
88
|
+
unless registry.any?
|
89
|
+
vm.ui.warn "[vagrant-dns] Configuration missing or empty. No patterns will be removed."
|
90
|
+
registry.abort
|
58
91
|
end
|
59
92
|
|
60
|
-
|
61
|
-
|
62
|
-
|
93
|
+
patterns.each do |pattern|
|
94
|
+
if (ip = registry.delete(pattern))
|
95
|
+
vm.ui.info "[vagrant-dns] Removing pattern: #{pattern} for ip: #{ip}"
|
96
|
+
else
|
97
|
+
vm.ui.info "[vagrant-dns] Pattern: #{pattern} was not in config."
|
63
98
|
end
|
64
99
|
end
|
100
|
+
end
|
101
|
+
end
|
65
102
|
|
66
|
-
|
67
|
-
|
68
|
-
return
|
69
|
-
end
|
103
|
+
private def dns_options(vm)
|
104
|
+
return @dns_options if @dns_options
|
70
105
|
|
71
|
-
|
106
|
+
@dns_options = vm.config.dns.to_hash
|
107
|
+
@dns_options[:host_name] = vm.config.vm.hostname
|
108
|
+
@dns_options[:networks] = vm.config.vm.networks
|
109
|
+
@dns_options
|
110
|
+
end
|
72
111
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
end
|
112
|
+
private def default_patterns(opts)
|
113
|
+
if opts[:host_name]
|
114
|
+
opts[:tlds].map { |tld| /^.*#{opts[:host_name]}.#{tld}$/ }
|
115
|
+
else
|
116
|
+
[]
|
79
117
|
end
|
118
|
+
end
|
80
119
|
|
81
|
-
|
82
|
-
|
120
|
+
private def vm_ip(opts)
|
121
|
+
user_ip = opts[:ip]
|
83
122
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
123
|
+
if !user_ip && dynamic_ip_network?(opts) || [:dynamic, :dhcp].include?(user_ip)
|
124
|
+
user_ip = DYNAMIC_VM_IP
|
125
|
+
end
|
126
|
+
|
127
|
+
ip =
|
128
|
+
case user_ip
|
129
|
+
when Proc
|
130
|
+
if vm.communicate.ready?
|
131
|
+
user_ip.call(vm, opts.dup.freeze)
|
132
|
+
else
|
133
|
+
vm.ui.info "[vagrant-dns] Postponing running user provided IP script until box has started."
|
134
|
+
return
|
135
|
+
end
|
136
|
+
when Symbol
|
137
|
+
_ip = static_vm_ip(user_ip, opts)
|
89
138
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
vm.ui.warn '[vagrant-dns] Configuration missing or empty. No patterns will be removed.'
|
94
|
-
registry.abort
|
139
|
+
unless _ip
|
140
|
+
vm.ui.warn "[vagrant-dns] Could not find any static network IP in network type `#{user_ip}'."
|
141
|
+
return
|
95
142
|
end
|
96
143
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
144
|
+
_ip
|
145
|
+
else
|
146
|
+
_ip = static_vm_ip(:private_network, opts)
|
147
|
+
_ip ||= static_vm_ip(:public_network, opts)
|
148
|
+
|
149
|
+
unless _ip
|
150
|
+
vm.ui.warn "[vagrant-dns] Could not find any static network IP."
|
151
|
+
return
|
103
152
|
end
|
153
|
+
|
154
|
+
_ip
|
104
155
|
end
|
156
|
+
|
157
|
+
# we where unable to find an IP, and there's no user-supplied callback
|
158
|
+
# falling back to dynamic/dhcp style detection
|
159
|
+
if !ip && !user_ip
|
160
|
+
vm.ui.info "[vagrant-dns] Falling back to dynamic IP detection."
|
161
|
+
ip = DYNAMIC_VM_IP.call(vm, opts.dup.freeze)
|
105
162
|
end
|
106
163
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
dns_options[:networks] = vm.config.vm.networks
|
111
|
-
dns_options
|
164
|
+
if !ip || ip.empty?
|
165
|
+
vm.ui.warn "[vagrant-dns] Failed to identify IP."
|
166
|
+
return
|
112
167
|
end
|
113
168
|
|
114
|
-
|
115
|
-
|
116
|
-
|
169
|
+
ip
|
170
|
+
end
|
171
|
+
|
172
|
+
private def dynamic_ip_network?(opts)
|
173
|
+
opts[:networks].none? { |(_nw_type, nw_config)| nw_config[:ip] }
|
174
|
+
end
|
175
|
+
|
176
|
+
# tries to find an IP in the configured +type+ networks
|
177
|
+
private def static_vm_ip(type, opts)
|
178
|
+
network = opts[:networks].find { |(nw_type, nw_config)| nw_config[:ip] && nw_type == type }
|
179
|
+
|
180
|
+
network.last[:ip] if network
|
181
|
+
end
|
182
|
+
|
183
|
+
DYNAMIC_VM_IP = proc { |vm|
|
184
|
+
vm.guest.capability(:read_ip_address).tap { |ip|
|
185
|
+
if ip
|
186
|
+
vm.ui.info "[vagrant-dns] Identified DHCP IP as '#{ip}'."
|
117
187
|
else
|
118
|
-
[]
|
188
|
+
vm.ui.warn "[vagrant-dns] Could not identify DHCP IP."
|
119
189
|
end
|
120
|
-
|
190
|
+
}
|
191
|
+
}
|
192
|
+
private_constant :DYNAMIC_VM_IP
|
121
193
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
end
|
194
|
+
private def resolver_files(ip, port, tlds, &block)
|
195
|
+
installer_class = VagrantDNS::Installers.resolve
|
196
|
+
installer_class.resolver_files(ip, port, tlds, &block)
|
197
|
+
end
|
127
198
|
|
128
|
-
|
129
|
-
|
130
|
-
|
199
|
+
private def resolver_folder
|
200
|
+
File.join(tmp_path, "resolver").tap { |dir| FileUtils.mkdir_p(dir) }
|
201
|
+
end
|
131
202
|
|
132
|
-
|
133
|
-
|
134
|
-
|
203
|
+
private def ensure_deamon_env!
|
204
|
+
FileUtils.mkdir_p(File.join(tmp_path, "daemon"))
|
205
|
+
end
|
135
206
|
end
|
136
207
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module VagrantDNS
|
2
|
+
module Installers
|
3
|
+
class Linux
|
4
|
+
EXEC_STYLES = %i{sudo}
|
5
|
+
RESOLVED_CONFIG = "vagrant-dns.conf"
|
6
|
+
|
7
|
+
attr_accessor :tmp_path, :install_path, :exec_style
|
8
|
+
|
9
|
+
def initialize(tmp_path, options = {})
|
10
|
+
self.tmp_path = tmp_path
|
11
|
+
self.install_path = options.fetch(:install_path, "/etc/systemd/resolved.conf.d")
|
12
|
+
self.exec_style = options.fetch(:exec_style, :sudo)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Generate the resolved config.
|
16
|
+
#
|
17
|
+
# @yield [filename, content]
|
18
|
+
# @yieldparam filename [String] The filename to use for the resolved config file (relative to +install_path+)
|
19
|
+
# @yieldparam content [String] The content for +filename+
|
20
|
+
def self.resolver_files(ip, port, tlds)
|
21
|
+
contents =
|
22
|
+
"# This file is generated by vagrant-dns\n" \
|
23
|
+
"[Resolve]\n" \
|
24
|
+
"DNS=#{ip}:#{port}\n" \
|
25
|
+
"Domains=~#{tlds.join(' ~')}\n"
|
26
|
+
|
27
|
+
yield "vagrant-dns.conf", contents
|
28
|
+
end
|
29
|
+
|
30
|
+
def install!
|
31
|
+
require 'fileutils'
|
32
|
+
|
33
|
+
src = File.join(tmp_path, "resolver", RESOLVED_CONFIG)
|
34
|
+
dest = File.join(install_path, RESOLVED_CONFIG)
|
35
|
+
|
36
|
+
commands = [
|
37
|
+
['install', '-D', '-m', '0644', '-T', src.shellescape, dest.shellescape],
|
38
|
+
['systemctl', 'reload-or-restart', 'systemd-resolved.service']
|
39
|
+
]
|
40
|
+
|
41
|
+
exec(*commands)
|
42
|
+
end
|
43
|
+
|
44
|
+
def uninstall!
|
45
|
+
commands = [
|
46
|
+
['rm', File.join(install_path, RESOLVED_CONFIG)],
|
47
|
+
['systemctl', 'reload-or-restart', 'systemd-resolved.service']
|
48
|
+
]
|
49
|
+
|
50
|
+
exec(*commands)
|
51
|
+
end
|
52
|
+
|
53
|
+
def purge!
|
54
|
+
require 'fileutils'
|
55
|
+
uninstall!
|
56
|
+
FileUtils.rm_r(tmp_path)
|
57
|
+
end
|
58
|
+
|
59
|
+
def exec(*commands)
|
60
|
+
return if !commands || commands.empty?
|
61
|
+
|
62
|
+
case exec_style
|
63
|
+
when :sudo
|
64
|
+
commands.each do |c|
|
65
|
+
system 'sudo', *c
|
66
|
+
end
|
67
|
+
else
|
68
|
+
raise ArgumentError, "Unsupported execution style: #{exec_style}. Use one of #{EXEC_STYLES.map(&:inspect).join(' ')}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -11,6 +11,22 @@ module VagrantDNS
|
|
11
11
|
self.exec_style = options.fetch(:exec_style, :osa)
|
12
12
|
end
|
13
13
|
|
14
|
+
# Generate the resolved config.
|
15
|
+
#
|
16
|
+
# @yield [filename, content]
|
17
|
+
# @yieldparam filename [String] The filename to use for the resolved config file (relative to +install_path+)
|
18
|
+
# @yieldparam content [String] The content for +filename+
|
19
|
+
def self.resolver_files(ip, port, tlds)
|
20
|
+
tlds.each do |tld|
|
21
|
+
contents =
|
22
|
+
"# This file is generated by vagrant-dns\n" \
|
23
|
+
"nameserver #{ip}\n" \
|
24
|
+
"port #{port}"
|
25
|
+
|
26
|
+
yield tld, contents
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
14
30
|
def install!
|
15
31
|
require 'fileutils'
|
16
32
|
|
@@ -26,8 +42,6 @@ module VagrantDNS
|
|
26
42
|
end
|
27
43
|
|
28
44
|
def uninstall!
|
29
|
-
require 'fileutils'
|
30
|
-
|
31
45
|
commands = registered_resolvers.map do |r|
|
32
46
|
installed_resolver = File.join(install_path, File.basename(r))
|
33
47
|
['rm', '-rf', installed_resolver]
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module VagrantDNS
|
2
|
+
module Installers
|
3
|
+
def self.resolve
|
4
|
+
if Vagrant::Util::Platform.darwin?
|
5
|
+
VagrantDNS::Installers::Mac
|
6
|
+
elsif Vagrant::Util::Platform.linux?
|
7
|
+
VagrantDNS::Installers::Linux
|
8
|
+
else
|
9
|
+
raise 'installing and uninstalling is only supported on Linux and macOS at the moment.'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
require "vagrant-dns/installers/mac"
|
16
|
+
require "vagrant-dns/installers/linux"
|
data/lib/vagrant-dns/registry.rb
CHANGED
@@ -1,60 +1,19 @@
|
|
1
|
-
require 'yaml/store'
|
2
|
-
require 'forwardable'
|
3
|
-
|
4
1
|
module VagrantDNS
|
5
2
|
# This is the dns pattern registry (aka "config")
|
6
3
|
# It basically delegates everything to a YAML::Store but handles the conversion
|
7
4
|
# of Regexp dns-patterns into YAML string keys and reverse.
|
8
5
|
class Registry
|
9
|
-
|
10
|
-
|
11
|
-
def initialize(tmp_path)
|
12
|
-
@store = YAML::Store.new(File.join(tmp_path, "config"), true)
|
13
|
-
end
|
6
|
+
include VagrantDNS::Store
|
14
7
|
|
15
|
-
|
16
|
-
|
17
|
-
# This method is only valid in a #transaction and it cannot be read-only. It will raise PStore::Error if called at any other time.
|
18
|
-
def [](name)
|
19
|
-
name = name.source if name.respond_to? :source
|
20
|
-
@store[name]
|
21
|
-
end
|
22
|
-
|
23
|
-
# This method is only valid in a #transaction and it cannot be read-only. It will raise PStore::Error if called at any other time.
|
24
|
-
def []=(name, value)
|
25
|
-
name = name.source if name.respond_to? :source
|
26
|
-
@store[name] = value
|
27
|
-
end
|
8
|
+
NAME = "config"
|
28
9
|
|
29
|
-
def
|
30
|
-
|
31
|
-
@store.delete(name)
|
32
|
-
end
|
33
|
-
|
34
|
-
# This method is only valid in a #transaction and it cannot be read-only. It will raise PStore::Error if called at any other time.
|
35
|
-
def root?(name)
|
36
|
-
name = name.source if name.respond_to? :source
|
37
|
-
@store.root?(name)
|
38
|
-
end
|
39
|
-
alias_method :key?, :root?
|
40
|
-
|
41
|
-
# This method is only valid in a #transaction and it cannot be read-only. It will raise PStore::Error if called at any other time.
|
42
|
-
def roots
|
43
|
-
@store.roots.map { |name| Regexp.new(name) }
|
44
|
-
end
|
45
|
-
alias_method :keys, :roots
|
46
|
-
|
47
|
-
# This method is only valid in a #transaction and it cannot be read-only. It will raise PStore::Error if called at any other time.
|
48
|
-
def any?
|
49
|
-
@store.roots.any?
|
10
|
+
def initialize(tmp_path)
|
11
|
+
@store = YAML::Store.new(File.join(tmp_path, NAME), true)
|
50
12
|
end
|
51
13
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
a[Regexp.new(name)] = @store[name]
|
56
|
-
end
|
57
|
-
end
|
14
|
+
# @return [VagrantDNS::Registry,nil] Eitehr an instance or +nil+ if cofig file does not exist.
|
15
|
+
def self.open(tmp_path)
|
16
|
+
new(tmp_path) if File.exist?(File.join(tmp_path, NAME))
|
58
17
|
end
|
59
18
|
end
|
60
19
|
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'pp'
|
2
|
+
require 'rubydns'
|
3
|
+
require 'async/dns/system'
|
4
|
+
|
5
|
+
module VagrantDNS
|
6
|
+
class Server
|
7
|
+
attr_reader :registry, :listen, :ttl, :resolver, :passthrough
|
8
|
+
|
9
|
+
def initialize(registry, listen:, ttl:, resolver:, passthrough:)
|
10
|
+
@registry = registry.to_hash
|
11
|
+
@listen = listen
|
12
|
+
@ttl = ttl
|
13
|
+
|
14
|
+
@resolver = if resolver.nil? || resolver == :system
|
15
|
+
RubyDNS::Resolver.new(Async::DNS::System.nameservers)
|
16
|
+
elsif !resolver || resolver.empty?
|
17
|
+
nil
|
18
|
+
else
|
19
|
+
RubyDNS::Resolver.new(resolver)
|
20
|
+
end
|
21
|
+
|
22
|
+
if passthrough && !resolver
|
23
|
+
puts "[Warning] 'passthrough' config has no effect, sice no passthrough resolver is set."
|
24
|
+
end
|
25
|
+
|
26
|
+
@passthrough = !!@resolver && passthrough
|
27
|
+
end
|
28
|
+
|
29
|
+
def run
|
30
|
+
# need those clusures for the +RubyDNS::run_server+ block
|
31
|
+
passthrough = self.passthrough
|
32
|
+
registry = self.registry
|
33
|
+
resolver = self.resolver
|
34
|
+
ttl = self.ttl
|
35
|
+
|
36
|
+
_passthrough = if passthrough
|
37
|
+
proc do |transaction|
|
38
|
+
transaction.passthrough!(resolver) do |response|
|
39
|
+
puts "Passthrough response: #{response.inspect}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
RubyDNS::run_server(listen) do
|
45
|
+
# match all known patterns first
|
46
|
+
registry.each do |pattern, ip|
|
47
|
+
match(pattern, Resolv::DNS::Resource::IN::A) do |transaction, match_data|
|
48
|
+
transaction.respond!(ip, ttl: ttl)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
case passthrough
|
53
|
+
when true
|
54
|
+
# forward everything
|
55
|
+
otherwise(&_passthrough)
|
56
|
+
when false
|
57
|
+
# fail known patterns for non-A queries as NotImp
|
58
|
+
registry.each do |pattern, ip|
|
59
|
+
match(pattern) do |transaction, match_data|
|
60
|
+
transaction.fail!(:NotImp)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# unknown pattern end up as NXDomain
|
65
|
+
otherwise do |transaction|
|
66
|
+
transaction.fail!(:NXDomain)
|
67
|
+
end
|
68
|
+
when :unknown
|
69
|
+
# fail known patterns for non-A queries as NotImp
|
70
|
+
registry.each do |pattern, ip|
|
71
|
+
match(pattern) do |transaction, match_data|
|
72
|
+
transaction.fail!(:NotImp)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# forward only unknown patterns
|
77
|
+
otherwise(&_passthrough)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
data/lib/vagrant-dns/service.rb
CHANGED
@@ -20,44 +20,27 @@ module VagrantDNS
|
|
20
20
|
run!("status")
|
21
21
|
end
|
22
22
|
|
23
|
-
SERVER = Proc.new do |tmp_path, skip_require_dependencies|
|
24
|
-
unless skip_require_dependencies
|
25
|
-
require 'rubydns'
|
26
|
-
require 'async/dns/system'
|
27
|
-
end
|
28
|
-
|
29
|
-
registry = Registry.new(tmp_path).to_hash
|
30
|
-
std_resolver = RubyDNS::Resolver.new(Async::DNS::System.nameservers)
|
31
|
-
ttl = VagrantDNS::Config.ttl
|
32
|
-
|
33
|
-
RubyDNS::run_server(VagrantDNS::Config.listen) do
|
34
|
-
registry.each do |pattern, ip|
|
35
|
-
match(pattern, Resolv::DNS::Resource::IN::A) do |transaction, match_data|
|
36
|
-
transaction.respond!(ip, ttl: ttl)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
otherwise do |transaction|
|
41
|
-
transaction.passthrough!(std_resolver) do |reply, reply_name|
|
42
|
-
puts reply
|
43
|
-
puts reply_name
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
23
|
def run!(cmd, opts = {})
|
50
24
|
# On darwin, when the running Ruby is not compiled for the running OS
|
51
25
|
# @see: https://github.com/BerlinVagrant/vagrant-dns/issues/72
|
52
26
|
use_issue_72_workround = RUBY_PLATFORM.match?(/darwin/) && !RUBY_PLATFORM.end_with?(`uname -r`[0, 2])
|
53
27
|
|
54
28
|
if cmd == "start" && use_issue_72_workround
|
55
|
-
|
56
|
-
require 'async/dns/system'
|
29
|
+
require_relative "./server"
|
57
30
|
end
|
58
31
|
|
59
32
|
Daemons.run_proc("vagrant-dns", run_options(cmd, opts)) do
|
60
|
-
|
33
|
+
unless use_issue_72_workround
|
34
|
+
require_relative "./server"
|
35
|
+
end
|
36
|
+
|
37
|
+
VagrantDNS::Server.new(
|
38
|
+
Registry.new(tmp_path),
|
39
|
+
listen: VagrantDNS::Config.listen,
|
40
|
+
ttl: VagrantDNS::Config.ttl,
|
41
|
+
passthrough: VagrantDNS::Config.passthrough,
|
42
|
+
resolver: VagrantDNS::Config.passthrough_resolver
|
43
|
+
).run
|
61
44
|
end
|
62
45
|
end
|
63
46
|
|
@@ -67,20 +50,32 @@ module VagrantDNS
|
|
67
50
|
end
|
68
51
|
|
69
52
|
def show_config
|
70
|
-
registry = Registry.
|
53
|
+
registry = Registry.open(tmp_path)
|
54
|
+
return unless registry
|
71
55
|
|
72
|
-
|
73
|
-
|
56
|
+
config = registry.to_hash
|
57
|
+
if config.any?
|
58
|
+
config.each do |pattern, ip|
|
74
59
|
puts format("%s => %s", pattern.inspect, ip)
|
75
60
|
end
|
76
61
|
else
|
77
|
-
puts "
|
62
|
+
puts "Pattern configuration missing or empty."
|
78
63
|
end
|
79
64
|
end
|
80
65
|
|
81
|
-
|
66
|
+
def show_tld_config
|
67
|
+
tld_registry = VagrantDNS::TldRegistry.open(tmp_path)
|
68
|
+
return unless tld_registry
|
69
|
+
|
70
|
+
tlds = tld_registry.transaction { |store| store.fetch("tlds", []) }
|
71
|
+
if !tlds || tlds.empty?
|
72
|
+
puts "No TLDs configured."
|
73
|
+
else
|
74
|
+
puts tlds
|
75
|
+
end
|
76
|
+
end
|
82
77
|
|
83
|
-
def run_options(cmd, extra = {})
|
78
|
+
private def run_options(cmd, extra = {})
|
84
79
|
daemon_dir = File.join(tmp_path, "daemon")
|
85
80
|
{
|
86
81
|
ARGV: [cmd],
|
@@ -89,7 +84,7 @@ module VagrantDNS
|
|
89
84
|
log_output: true,
|
90
85
|
log_dir: daemon_dir,
|
91
86
|
**extra
|
92
|
-
|
87
|
+
}
|
93
88
|
end
|
94
89
|
end
|
95
90
|
end
|