vagrant-dns 2.3.0 → 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/.ruby-version +1 -0
- data/CHANGELOG.md +12 -5
- data/DEVELOPMENT.md +18 -2
- data/Gemfile +4 -1
- data/README.md +47 -6
- data/lib/vagrant-dns/config.rb +15 -10
- data/lib/vagrant-dns/configurator.rb +146 -82
- data/lib/vagrant-dns/server.rb +82 -0
- data/lib/vagrant-dns/service.rb +14 -33
- data/lib/vagrant-dns/version.rb +1 -1
- data/tasks/acceptance.rake +3 -1
- data/vagrant-dns.gemspec +9 -2
- data/vagrant-spec.config.rb +1 -3
- metadata +20 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b96bd995237133ab779883dc28ed8ac0ed8b2cb15b71c81c755bef68f93fc6bb
|
4
|
+
data.tar.gz: 9ddc6a521a68af235a6626672e6d7089e330bfcc0445b2126e01f8f45f4ebf32
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dee69e1a9fb66bdb817a310a2e2daf049bab4c032f907f7220825feffac480dbdeb4356c412c59dd7bd2369f40b030e8b21576e0c21d7bfd6dd6d3460fc69d74
|
7
|
+
data.tar.gz: d58f43351a8a12aa3f79e6bdb7c047f312b38714767a0c4d0e03c5e2e4a484c9bd11a57aec95d775f37e425ed6cda027af49b8c8cd66f38a84b5fb92bd8439bd
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-2.7.7
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
## 2.4.0 (2023-04-11)
|
2
|
+
|
3
|
+
* DHCP support. [GH-51]
|
4
|
+
* Non-A-queries (like IPv6 AAAA- or TXT records) matching a configured pattern will be answered with a `NOTIMP` error. [GH-76]
|
5
|
+
* Upstream / passthrough DNS servers are now configurable, defaulting to the system config (existing behavior). [GH-76]
|
6
|
+
* Passthrough behavior is now configurable (`true`/`false`/`:unknown`). [GH-77]
|
7
|
+
|
1
8
|
## 2.3.0 (2023-01-14)
|
2
9
|
|
3
10
|
* 🎉 Linux Support. Many thanks @mattiasb [GH-75]
|
@@ -23,7 +30,7 @@
|
|
23
30
|
|
24
31
|
## 2.2.0
|
25
32
|
|
26
|
-
### New
|
33
|
+
### New Features:
|
27
34
|
|
28
35
|
* Add global config for time-to-live via `VagrantDNS::Config.ttl`
|
29
36
|
|
@@ -34,16 +41,16 @@
|
|
34
41
|
|
35
42
|
### Breaking Changes:
|
36
43
|
|
37
|
-
* Removes the global and vm config `ipv4only`. It was
|
44
|
+
* Removes the global and vm config `ipv4only`. It was never used.
|
38
45
|
|
39
46
|
### Changes:
|
40
47
|
|
41
|
-
* Resources will now respond with a low TTL (time-to-live) of 5 minutes (300 seconds) instead of the old 24 hours by default. Use `VagrantDNS::Config.ttl = 86400` to reset to the old
|
48
|
+
* Resources will now respond with a low TTL (time-to-live) of 5 minutes (300 seconds) instead of the old 24 hours by default. Use `VagrantDNS::Config.ttl = 86400` to reset to the old behavior.
|
42
49
|
* Internal changes on how the dns pattern config is read and written. (Now using `YAML::Store`)
|
43
50
|
* Acceptance tests run against vagrant v2.1.4
|
44
51
|
* Acceptance tests run against Ubuntu 18.04
|
45
52
|
|
46
|
-
### New
|
53
|
+
### New Features:
|
47
54
|
|
48
55
|
* Adds a check for the VMs configured TLDs to not be included in the [Public Suffix List](https://publicsuffix.org/)
|
49
56
|
|
@@ -84,7 +91,7 @@
|
|
84
91
|
* Add support for boxes with `public_network` and static IP.
|
85
92
|
* Breaking: No longer falls back to `127.0.0.1` when no IP could be found.
|
86
93
|
* Log messages will now be tagged with the related box (vm) and `[vagrant-dns]`
|
87
|
-
*
|
94
|
+
* Development targets Vagrant 1.9.3
|
88
95
|
|
89
96
|
## 1.0.0
|
90
97
|
|
data/DEVELOPMENT.md
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
TODO: Expand this section :)
|
4
4
|
|
5
|
-
The `Gemfile` uses
|
5
|
+
The `Gemfile` uses the `TEST_VAGRANT_VERSION` environment variable to control which version of vagrant is used during local development.
|
6
|
+
To adjust the ruby version used, change the contents of the `.ruby-version` file, even if you don't use a ruby version manager.
|
6
7
|
|
7
8
|
## Running Acceptance Tests
|
8
9
|
|
@@ -19,5 +20,20 @@ bundle exec rake -D acceptance
|
|
19
20
|
bundle exec rake acceptance:setup:virtualbox
|
20
21
|
|
21
22
|
# Run tests
|
22
|
-
rake acceptance:virtualbox
|
23
|
+
bundle exec rake acceptance:virtualbox
|
24
|
+
```
|
25
|
+
|
26
|
+
### On other providers
|
27
|
+
|
28
|
+
1. If it's not a default provider, add it to to `Gemfile` as a dependency and re-run `bundle install`.
|
29
|
+
2. Add a box provider name to box URL mapping to the `TEST_BOXES` hash in `tasks/acceptance.rake`
|
30
|
+
3. Run the `acceptance` rake task like above, replacing `virtualbox` with your provider.
|
31
|
+
|
32
|
+
|
33
|
+
### VMware IPs
|
34
|
+
|
35
|
+
VMware uses IPs from its bridges for DHCP and static private networks. Check IP and net masks using:
|
36
|
+
|
37
|
+
```console
|
38
|
+
ifconfig -X bridge | grep 'inet ' | grep -v '127.0.0.1' | awk '{ print $2 "\t" $4 }'
|
23
39
|
```
|
data/Gemfile
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
|
-
ruby(
|
2
|
+
ruby(File.read(File.expand_path('.ruby-version', __dir__))[/\d+\.\d+\.\d+.*/])
|
3
3
|
|
4
4
|
ENV['TEST_VAGRANT_VERSION'] ||= 'v2.3.4'
|
5
5
|
|
@@ -7,6 +7,9 @@ ENV['TEST_VAGRANT_VERSION'] ||= 'v2.3.4'
|
|
7
7
|
# during acceptance tests.
|
8
8
|
group :plugins do
|
9
9
|
gemspec
|
10
|
+
# source "https://gems.hashicorp.com/" do
|
11
|
+
# gem "vagrant-vmware-desktop"
|
12
|
+
# end
|
10
13
|
end
|
11
14
|
|
12
15
|
group :test, :development do
|
data/README.md
CHANGED
@@ -12,11 +12,11 @@ Alternatively, you can install an older version of vagrant-dns like this: `vagra
|
|
12
12
|
|
13
13
|
## Usage
|
14
14
|
|
15
|
-
In addition to your networking config, configure a
|
15
|
+
In addition to your networking config, configure a top-level domain and a `hostname` for your machine. Optionally, configure a set of free matching patterns. Global configuration options can be given through the `VagrantDNS::Config` object:
|
16
16
|
|
17
17
|
```ruby
|
18
18
|
Vagrant.configure("2") do |config|
|
19
|
-
|
19
|
+
# ...
|
20
20
|
|
21
21
|
config.dns.tld = "test"
|
22
22
|
|
@@ -148,12 +148,20 @@ We can use [multivm](https://www.vagrantup.com/docs/multi-machine/) configuratio
|
|
148
148
|
* Execute : `vagrant dns --install`
|
149
149
|
* Test via: `ping worker2.mysite.box` or `worker1.mysite.box`
|
150
150
|
|
151
|
-
|
152
151
|
## VM options
|
153
152
|
|
154
153
|
* `vm.dns.tld`: Set the tld for the given virtual machine. No default.
|
155
|
-
* `vm.dns.tlds`: Set multiple
|
154
|
+
* `vm.dns.tlds`: Set multiple TLDs. Default: `[tld]`
|
156
155
|
* `vm.dns.patterns`: A list of domain patterns to match. Defaults to `[/^.*{host_name}.{tld}$/]`
|
156
|
+
* `vm.dns.ip`: Optional, overwrite of the default static IP detection. Valid values are:
|
157
|
+
- `Proc`: A Proc which return value will get used as IP. Eg: `proc { |vm, opts| }` (See DHCP section for full sample)
|
158
|
+
- `Symbol`: Forces the use of the named static network:
|
159
|
+
+ `:private_network`: Use static ip of a configured private network (`config.vm.network "private_network", ip: "192.168.50.4"`)
|
160
|
+
+ `:public_network`: Use static ip of a configured public network (`config.vm.network "public_network", ip: "192.168.0.17"`)
|
161
|
+
+ `:dynamic`, `:dhcp`: Force reading the guest IP using vagrants build-in `read_ip_address` capability.
|
162
|
+
- Default:
|
163
|
+
If there is no network with a statically defined IP, and no `ip` override is given, use the build-in `read_ip_address` capability.
|
164
|
+
Else, check `:private_network`, if none found check `:public_network`
|
157
165
|
|
158
166
|
## Global Options
|
159
167
|
|
@@ -162,9 +170,16 @@ We can use [multivm](https://www.vagrantup.com/docs/multi-machine/) configuratio
|
|
162
170
|
* `VagrantDNS::Config.auto_run`: (re)start and reconfigure the server every time a machine is started. On by default.
|
163
171
|
* `VagrantDNS::Config.check_public_suffix`: Check if you are going to configure a [Public Suffix](https://publicsuffix.org/) (like a Top Level Domain) in a VMs `tld(s)` config, which could mess up your local dev machines DNS config. Possible configuration values are:
|
164
172
|
- `false`: Disables the feature.
|
165
|
-
- `"warn"`: Check and print a warning. (Still creates a resolver config and
|
173
|
+
- `"warn"`: Check and print a warning. (Still creates a resolver config and potentially messes up your DNS) **At the moment, this is the default** because lots of projects used to use `"dev"` as a TLD, but this got registered by google and is now a public suffix.
|
166
174
|
- `"error"`: Check and prevent the box from starting. (Does not create the resolver config, it will also prevent the box from starting.)
|
167
|
-
|
175
|
+
* `VagrantDNS::Config.passthrough`: Configure how to deal with non-matching DNS queries. Will be set to `false` if no `passthrough_resolver` could be detected, or none is set.
|
176
|
+
- `true`: (default) Every non-matching query is passed through to the upstream DNS server (see `passthrough_resolver`)
|
177
|
+
- `false`: Disable passthrough. Every non-A-query to a matching pattern fails with `NotImp`. Every other query fails with `NXDomain`.
|
178
|
+
- `:unknown`: Only forward queries for which there's no matching pattern. Every non-A-query to a matching pattern fails with `NotImp`. Every other query will be passed through.
|
179
|
+
* `VagrantDNS::Config.passthrough_resolver`: By default, DNS queries not matching any patterns will be passed to an upstream DNS server.
|
180
|
+
- `:system`: (Default) pass through to the system configured default DNS server
|
181
|
+
- `[[:udp, "1.1.1.1", 53], [:tcp, "1.1.1.1", 53]]`: an Array of Arrays describing the DNS server(s) to use. (Protocol, IP, Port)
|
182
|
+
|
168
183
|
## Using custom domains from inside the VM (VirtualBox only)
|
169
184
|
|
170
185
|
If you need to be able to resolve custom domains managed by this plugin from inside your virtual machine (and you're using VirtualBox), add the following
|
@@ -189,6 +204,32 @@ setting, however, the NAT engine will act as a DNS proxy
|
|
189
204
|
(see [Virtualbox docs](https://www.virtualbox.org/manual/ch09.html#nat-adv-dns)). That way, queries for your custom domains
|
190
205
|
from inside the guest will also be handled by the DNS server run by the plugin.
|
191
206
|
|
207
|
+
## DHCP / Dynamic IP
|
208
|
+
|
209
|
+
When configuring your VM with a DHCP network, vagrant-dns tries to identify the guest IP using vagrants build-in `read_ip_address` capability.
|
210
|
+
|
211
|
+
For more fine-grained control use the `ip` config.
|
212
|
+
Here is an example using the VM's default way of communication and using the `hostname` command on it:
|
213
|
+
|
214
|
+
```ruby
|
215
|
+
Vagrant.configure("2") do |config|
|
216
|
+
# ...
|
217
|
+
|
218
|
+
# - `vm` is the vagrant virtual machine instance and can be used to communicate with it
|
219
|
+
# - `opts` is the vagrant-dns options hash (everything configured via `config.dns.*`)
|
220
|
+
config.dns.ip = -> (vm, opts) do
|
221
|
+
# note: the block handed to `execute` might get called multiple times, hence this closure
|
222
|
+
ip = nil
|
223
|
+
vm.communicate.execute("hostname -I | cut -d ' ' -f 1") do |type, data|
|
224
|
+
ip = data.strip if type == :stdout
|
225
|
+
end
|
226
|
+
ip
|
227
|
+
end
|
228
|
+
end
|
229
|
+
```
|
230
|
+
|
231
|
+
__NOTES__: In order to obtain the IP in this way, the vagrant box needs to be up and running. You will get a log output (`Postponing running user provided IP script until box has started.`) when you try to run `vagrant dns` on a non-running box.
|
232
|
+
|
192
233
|
## Issues
|
193
234
|
|
194
235
|
* macOS and systemd-resolved enabled Linux only (please read: [Platform Support](https://github.com/BerlinVagrant/vagrant-dns/blob/master/PLATFORM_SUPPORT.md) before ranting about this).
|
data/lib/vagrant-dns/config.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require "logger"
|
2
2
|
|
3
3
|
module VagrantDNS
|
4
4
|
class Config < Vagrant.plugin(2, :config)
|
5
5
|
class << self
|
6
|
-
|
6
|
+
attr_writer :listen, :ttl, :passthrough, :passthrough_resolver
|
7
|
+
attr_accessor :logger, :auto_run, :check_public_suffix
|
7
8
|
|
8
9
|
def listen
|
9
10
|
@listen ||= [[:udp, "127.0.0.1", 5300]]
|
@@ -13,6 +14,15 @@ module VagrantDNS
|
|
13
14
|
@ttl ||= 300
|
14
15
|
end
|
15
16
|
|
17
|
+
def passthrough
|
18
|
+
return true if @passthrough.nil?
|
19
|
+
@passthrough
|
20
|
+
end
|
21
|
+
|
22
|
+
def passthrough_resolver
|
23
|
+
@passthrough_resolver ||= :system
|
24
|
+
end
|
25
|
+
|
16
26
|
def auto_run
|
17
27
|
return true if @auto_run.nil?
|
18
28
|
@auto_run
|
@@ -37,7 +47,7 @@ module VagrantDNS
|
|
37
47
|
failed_tlds = vm.config.dns.tlds.select { |tld| list.find(tld, default: false) }
|
38
48
|
|
39
49
|
err = if failed_tlds.any?
|
40
|
-
"tlds include a public suffix: #{failed_tlds.join(
|
50
|
+
"tlds include a public suffix: #{failed_tlds.join(", ")}"
|
41
51
|
end
|
42
52
|
|
43
53
|
if err && check_public_suffix.to_s == "error"
|
@@ -50,7 +60,7 @@ module VagrantDNS
|
|
50
60
|
end
|
51
61
|
end
|
52
62
|
|
53
|
-
attr_accessor :records
|
63
|
+
attr_accessor :records, :ip
|
54
64
|
attr_reader :tlds, :patterns
|
55
65
|
|
56
66
|
def pattern=(pattern)
|
@@ -68,11 +78,7 @@ module VagrantDNS
|
|
68
78
|
|
69
79
|
# explicit hash, to get symbols in hash keys
|
70
80
|
def to_hash
|
71
|
-
{
|
72
|
-
:patterns => patterns,
|
73
|
-
:records => records,
|
74
|
-
:tlds => tlds
|
75
|
-
}
|
81
|
+
{ patterns: patterns, records: records, tlds: tlds, ip: ip }
|
76
82
|
end
|
77
83
|
|
78
84
|
def validate(machine)
|
@@ -96,4 +102,3 @@ module VagrantDNS
|
|
96
102
|
end
|
97
103
|
end
|
98
104
|
end
|
99
|
-
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "fileutils"
|
2
2
|
|
3
3
|
module VagrantDNS
|
4
4
|
class Configurator
|
@@ -20,124 +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
|
-
|
36
|
-
|
37
|
-
|
33
|
+
private def regenerate_resolvers!
|
34
|
+
resolver_folder = self.resolver_folder
|
35
|
+
_proto, ip, port = VagrantDNS::Config.listen.first
|
36
|
+
tlds = register_tlds!
|
38
37
|
|
39
|
-
|
40
|
-
|
41
|
-
end
|
38
|
+
resolver_files(ip, port, tlds) do |filename, contents|
|
39
|
+
File.write(File.join(resolver_folder, filename), contents)
|
42
40
|
end
|
41
|
+
end
|
43
42
|
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
private def register_tlds!
|
44
|
+
add_tlds = dns_options(vm)[:tlds]
|
45
|
+
VagrantDNS::TldRegistry
|
46
|
+
.new(tmp_path)
|
47
|
+
.transaction do |store|
|
47
48
|
store["tlds"] ||= []
|
48
49
|
store["tlds"] |= add_tlds
|
49
50
|
store["tlds"]
|
50
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
|
51
61
|
end
|
52
62
|
|
53
|
-
|
54
|
-
|
63
|
+
ip = vm_ip(opts)
|
64
|
+
unless ip
|
65
|
+
vm.ui.detail "[vagrant-dns] No patterns will be configured."
|
66
|
+
return
|
67
|
+
end
|
55
68
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
69
|
+
registry = Registry.new(tmp_path)
|
70
|
+
registry.transaction do
|
71
|
+
patterns.each { |pattern| registry[pattern] = ip }
|
72
|
+
end
|
73
|
+
end
|
61
74
|
|
62
|
-
|
63
|
-
|
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
|
64
91
|
end
|
65
92
|
|
66
|
-
|
67
|
-
|
68
|
-
|
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."
|
69
98
|
end
|
70
99
|
end
|
100
|
+
end
|
101
|
+
end
|
71
102
|
|
72
|
-
|
73
|
-
|
74
|
-
return
|
75
|
-
end
|
103
|
+
private def dns_options(vm)
|
104
|
+
return @dns_options if @dns_options
|
76
105
|
|
77
|
-
|
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
|
78
111
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
end
|
112
|
+
private def default_patterns(opts)
|
113
|
+
if opts[:host_name]
|
114
|
+
opts[:tlds].map { |tld| /^.*#{opts[:host_name]}.#{tld}$/ }
|
115
|
+
else
|
116
|
+
[]
|
85
117
|
end
|
118
|
+
end
|
86
119
|
|
87
|
-
|
88
|
-
|
120
|
+
private def vm_ip(opts)
|
121
|
+
user_ip = opts[:ip]
|
89
122
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
return
|
94
|
-
end
|
123
|
+
if !user_ip && dynamic_ip_network?(opts) || [:dynamic, :dhcp].include?(user_ip)
|
124
|
+
user_ip = DYNAMIC_VM_IP
|
125
|
+
end
|
95
126
|
|
96
|
-
|
97
|
-
|
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)
|
98
138
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
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
|
103
142
|
end
|
104
143
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
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
|
111
152
|
end
|
153
|
+
|
154
|
+
_ip
|
112
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)
|
113
162
|
end
|
114
163
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
:networks => vm.config.vm.networks
|
119
|
-
)
|
164
|
+
if !ip || ip.empty?
|
165
|
+
vm.ui.warn "[vagrant-dns] Failed to identify IP."
|
166
|
+
return
|
120
167
|
end
|
121
168
|
|
122
|
-
|
123
|
-
|
124
|
-
|
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}'."
|
125
187
|
else
|
126
|
-
[]
|
188
|
+
vm.ui.warn "[vagrant-dns] Could not identify DHCP IP."
|
127
189
|
end
|
128
|
-
|
190
|
+
}
|
191
|
+
}
|
192
|
+
private_constant :DYNAMIC_VM_IP
|
129
193
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
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
|
134
198
|
|
135
|
-
|
136
|
-
|
137
|
-
|
199
|
+
private def resolver_folder
|
200
|
+
File.join(tmp_path, "resolver").tap { |dir| FileUtils.mkdir_p(dir) }
|
201
|
+
end
|
138
202
|
|
139
|
-
|
140
|
-
|
141
|
-
|
203
|
+
private def ensure_deamon_env!
|
204
|
+
FileUtils.mkdir_p(File.join(tmp_path, "daemon"))
|
205
|
+
end
|
142
206
|
end
|
143
207
|
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
|
|
@@ -92,9 +75,7 @@ module VagrantDNS
|
|
92
75
|
end
|
93
76
|
end
|
94
77
|
|
95
|
-
private
|
96
|
-
|
97
|
-
def run_options(cmd, extra = {})
|
78
|
+
private def run_options(cmd, extra = {})
|
98
79
|
daemon_dir = File.join(tmp_path, "daemon")
|
99
80
|
{
|
100
81
|
ARGV: [cmd],
|
@@ -103,7 +84,7 @@ module VagrantDNS
|
|
103
84
|
log_output: true,
|
104
85
|
log_dir: daemon_dir,
|
105
86
|
**extra
|
106
|
-
|
87
|
+
}
|
107
88
|
end
|
108
89
|
end
|
109
90
|
end
|
data/lib/vagrant-dns/version.rb
CHANGED
data/tasks/acceptance.rake
CHANGED
@@ -11,7 +11,9 @@ namespace :acceptance do
|
|
11
11
|
# Ubuntu 16.04 https://app.vagrantup.com/ubuntu/boxes/xenial64.json
|
12
12
|
# :virtualbox => "https://vagrantcloud.com/ubuntu/boxes/xenial64/versions/20180511.0.0/providers/virtualbox.box"
|
13
13
|
# Ubuntu 18.04 https://app.vagrantup.com/ubuntu/boxes/bionic64.json
|
14
|
-
:
|
14
|
+
virtualbox: "https://vagrantcloud.com/ubuntu/boxes/bionic64/versions/20180709.0.0/providers/virtualbox.box",
|
15
|
+
# Ubuntu 22.10 https://app.vagrantup.com/bento/boxes/ubuntu-22.10
|
16
|
+
vmware_desktop: "https://app.vagrantup.com/bento/boxes/ubuntu-22.10/versions/202303.13.0/providers/vmware_desktop.box"
|
15
17
|
}
|
16
18
|
|
17
19
|
TEST_BOXES.each do |provider, box_url|
|
data/vagrant-dns.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.email = ["florian.gilcher@asquera.de", "robert@dotless.de"]
|
7
7
|
gem.description = %q{vagrant-dns is a vagrant plugin that manages DNS records associated with local machines.}
|
8
8
|
gem.summary = %q{vagrant-dns manages DNS records of vagrant machines}
|
9
|
-
gem.homepage = ""
|
9
|
+
gem.homepage = "https://github.com/BerlinVagrant/vagrant-dns"
|
10
10
|
gem.license = "MIT"
|
11
11
|
|
12
12
|
gem.files = `git ls-files`.split($\).reject { |f| f.match(%r{^(test|testdrive)/}) }
|
@@ -16,6 +16,13 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.require_paths = ["lib"]
|
17
17
|
gem.version = VagrantDNS::VERSION
|
18
18
|
|
19
|
+
gem.metadata = {
|
20
|
+
"bug_tracker_uri" => "https://github.com/BerlinVagrant/vagrant-dns/issues",
|
21
|
+
"changelog_uri" => "https://github.com/BerlinVagrant/vagrant-dns/blob/master/CHANGELOG.md",
|
22
|
+
"source_code_uri" => "https://github.com/BerlinVagrant/vagrant-dns",
|
23
|
+
"wiki_uri" => "https://github.com/BerlinVagrant/vagrant-dns/wiki"
|
24
|
+
}
|
25
|
+
|
19
26
|
gem.required_ruby_version = '>= 2.2.6'
|
20
27
|
|
21
28
|
gem.add_dependency "daemons"
|
@@ -25,7 +32,7 @@ Gem::Specification.new do |gem|
|
|
25
32
|
# Pinning async gem to work around an issue in vagrant, where it does not
|
26
33
|
# honor "required_ruby_version" while resolving sub-dependencies.
|
27
34
|
# see: https://github.com/hashicorp/vagrant/issues/12640
|
28
|
-
gem.add_dependency 'async', '
|
35
|
+
gem.add_dependency 'async', '~> 1.30', '>= 1.30.3'
|
29
36
|
|
30
37
|
gem.add_development_dependency 'rspec'
|
31
38
|
end
|
data/vagrant-spec.config.rb
CHANGED
@@ -7,9 +7,7 @@ Vagrant::Spec::Acceptance.configure do |c|
|
|
7
7
|
c.component_paths = [acceptance_dir.to_s]
|
8
8
|
c.skeleton_paths = [(acceptance_dir + 'skeletons').to_s]
|
9
9
|
|
10
|
-
c.provider ENV['VS_PROVIDER'],
|
11
|
-
box: ENV['VS_BOX_PATH'],
|
12
|
-
skeleton_path: c.skeleton_paths
|
10
|
+
c.provider ENV['VS_PROVIDER'], box: ENV['VS_BOX_PATH'], skeleton_path: c.skeleton_paths
|
13
11
|
|
14
12
|
# there seems no other way to set additional environment variables
|
15
13
|
# see: https://github.com/mitchellh/vagrant-spec/pull/17
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-dns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Gilcher
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-
|
12
|
+
date: 2023-04-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: daemons
|
@@ -57,16 +57,22 @@ dependencies:
|
|
57
57
|
name: async
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- - "
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '1.30'
|
63
|
+
- - ">="
|
61
64
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
65
|
+
version: 1.30.3
|
63
66
|
type: :runtime
|
64
67
|
prerelease: false
|
65
68
|
version_requirements: !ruby/object:Gem::Requirement
|
66
69
|
requirements:
|
67
|
-
- - "
|
70
|
+
- - "~>"
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '1.30'
|
73
|
+
- - ">="
|
68
74
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
75
|
+
version: 1.30.3
|
70
76
|
- !ruby/object:Gem::Dependency
|
71
77
|
name: rspec
|
72
78
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,6 +98,7 @@ extra_rdoc_files: []
|
|
92
98
|
files:
|
93
99
|
- ".editorconfig"
|
94
100
|
- ".gitignore"
|
101
|
+
- ".ruby-version"
|
95
102
|
- CHANGELOG.md
|
96
103
|
- DEVELOPMENT.md
|
97
104
|
- Gemfile
|
@@ -110,6 +117,7 @@ files:
|
|
110
117
|
- lib/vagrant-dns/middlewares/config_up.rb
|
111
118
|
- lib/vagrant-dns/middlewares/restart.rb
|
112
119
|
- lib/vagrant-dns/registry.rb
|
120
|
+
- lib/vagrant-dns/server.rb
|
113
121
|
- lib/vagrant-dns/service.rb
|
114
122
|
- lib/vagrant-dns/store.rb
|
115
123
|
- lib/vagrant-dns/tld_registry.rb
|
@@ -117,10 +125,14 @@ files:
|
|
117
125
|
- tasks/acceptance.rake
|
118
126
|
- vagrant-dns.gemspec
|
119
127
|
- vagrant-spec.config.rb
|
120
|
-
homepage:
|
128
|
+
homepage: https://github.com/BerlinVagrant/vagrant-dns
|
121
129
|
licenses:
|
122
130
|
- MIT
|
123
|
-
metadata:
|
131
|
+
metadata:
|
132
|
+
bug_tracker_uri: https://github.com/BerlinVagrant/vagrant-dns/issues
|
133
|
+
changelog_uri: https://github.com/BerlinVagrant/vagrant-dns/blob/master/CHANGELOG.md
|
134
|
+
source_code_uri: https://github.com/BerlinVagrant/vagrant-dns
|
135
|
+
wiki_uri: https://github.com/BerlinVagrant/vagrant-dns/wiki
|
124
136
|
post_install_message:
|
125
137
|
rdoc_options: []
|
126
138
|
require_paths:
|