vagrant-dns 2.0.0 → 2.2.2

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
- SHA1:
3
- metadata.gz: b99205f3d200b610ee3b9c0fd3e3f3c84e99377a
4
- data.tar.gz: e1677768a2c0117a10f8f5caf58ab9359124643b
2
+ SHA256:
3
+ metadata.gz: db8e26c490508c47ab65d7a9065e491cac6d97a00a5c6134198acd258445b72c
4
+ data.tar.gz: 61651738cc69c6d9992e13e61ee8d21c6f2c2a5018ab32adbc338e6bc2d3e10d
5
5
  SHA512:
6
- metadata.gz: 43bcb3a01c66b768ab75003f4add646658e7fb6e4c15e552a22ce6ddf85ce034c8738f96a8c3093e603f0dd963151a8fc578ff16ef73e81c5e471125d645df3a
7
- data.tar.gz: 4492147711e59b16309206707b3eabcad0d92ca3b94392344e5bed70ce7703e37b705c4e7df5e896f7e494d86446db57545adacc962eb0a9d90b324cf8594082
6
+ metadata.gz: 7e2d081d253222942c755e9c8a65798d9225e2a6220a6317a092b37526cc354617e956c3255d0af078173fd458e1eb5826ac3769b1dfc20f2c77179b05359e53
7
+ data.tar.gz: 7b804c925ad00243d5643a6b9fe531dac654ded33456fb873bf6644f9e119faf99560838fb54a0285e7fe7e95e189688c2f67a0a3d5dff23f1101885464b0739
data/.gitignore CHANGED
@@ -17,3 +17,4 @@ test/version_tmp
17
17
  test/acceptance/artifacts
18
18
  tmp
19
19
  testdrive/.vagrant
20
+ Gemfile.local
data/CHANGELOG.md CHANGED
@@ -1,14 +1,73 @@
1
- # 2.0.0
1
+ ## 2.2.2
2
+
3
+ ### Fixes:
4
+
5
+ * Installation issue due to updated sub-dependency. [GH-69]
6
+
7
+ ## 2.2.1
8
+
9
+ ### Fixes:
10
+
11
+ * Prevent action hooks (restarting dns server) from running multiple times [GH-67]
12
+
13
+ ## 2.2.0
14
+
15
+ ### New Feautres:
16
+
17
+ * Add global config for time-to-live via `VagrantDNS::Config.ttl`
18
+
19
+ ### Fixes:
20
+
21
+ * Fixes acceptance tests for macOS High Sierra (10.13) to cope with `scutil`s new output format
22
+ * Adds the log-time missing `license` gem config
23
+
24
+ ### Breaking Changes:
25
+
26
+ * Removes the global and vm config `ipv4only`. It was nver been used.
27
+
28
+ ### Changes:
29
+
30
+ * 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 behaviour.
31
+ * Internal changes on how the dns pattern config is read and written. (Now using `YAML::Store`)
32
+ * Acceptance tests run against vagrant v2.1.4
33
+ * Acceptance tests run against Ubuntu 18.04
34
+
35
+ ### New Feautres:
36
+
37
+ * Adds a check for the VMs configured TLDs to not be included in the [Public Suffix List](https://publicsuffix.org/)
38
+
39
+ ## 2.1.0
40
+
41
+ ### Breaking, internal changes:
42
+
43
+ * The version moved from `Vagrant::DNS::VERSION` to `VagrantDNS::VERSION`, removing an accidental highjack of the `Vagrant` namespace.
44
+ * The `VagrantDNS::RestartMiddleware` got split up into `VagrantDNS::Middlewares::ConfigUp`, `VagrantDNS::Middlewares::ConfigDown` and `VagrantDNS::Middlewares::Restart`
45
+
46
+ ### Fixes:
47
+
48
+ * Fixes cli short argument `-S` for `--stop` (collided with `--start`'s `-s`)
49
+
50
+ ### New Feautres:
51
+
52
+ * Adds new cli command `--status` to display process running status and PID
53
+ * Adds new cli command `--list` to display current (persisted) config
54
+ * Adds auto-cleanup: Removes registered dns pattern from config when destroying the box. It will, however, be re-created when some box in the project gets re/started or one of vagrant dns `--install`, `--start` or `--restart` is executed.
55
+
56
+ ### Changes:
57
+
58
+ * The cli command `--stop` no longer re-builds configuration.
59
+
60
+ ## 2.0.0
2
61
 
3
62
  * Upgrades RubyDNS to `2.0` release
4
63
 
5
- # 2.0.0.rc1
64
+ ## 2.0.0.rc1
6
65
 
7
66
  * Upgrades RubyDNS to `2.0.0.pre.rc2`, which removes it's dependency on `celluloid`/`celluloid-dns` 🎉
8
67
  * Requires Vagrant >= 1.9.6 which ships with ruby 2.3.4 (RubyDNS requires ruby >= 2.2.6)
9
68
  * Development note: Upgraded to vagrant-share HEAD (d558861f)
10
69
 
11
- # 1.1.0
70
+ ## 1.1.0
12
71
 
13
72
  * Fixes handling of networks without static IP, such as DHCP. [GH-37], [GH-39], [GH-50]
14
73
  * Add support for boxes with `public_network` and static IP.
@@ -16,12 +75,12 @@
16
75
  * Log messages will now be tagged with the related box (vm) and `[vagrant-dns]`
17
76
  * Develepment targets Vagrant 1.9.3
18
77
 
19
- # 1.0.0
78
+ ## 1.0.0
20
79
 
21
80
  * 🎉Release as 1.0 [GH-34]
22
81
  * Fixes compatibility to Vagrant 1.7.4 by using RubyDNS ~> 1.0.2 [GH-38]
23
82
 
24
- # 0.6.0
83
+ ## 0.6.0
25
84
 
26
85
  This is a intermediate release towards v1.0.0
27
86
 
@@ -32,16 +91,16 @@ This is a intermediate release towards v1.0.0
32
91
  * Add acceptance test using vagrant-spec
33
92
  * Moved sample `Vagrantfile` into `/testdrive` which also contains a small wrapper script `bin/vagrant` to move "vagrant home" into a sandbox.
34
93
 
35
- # 0.5.0
94
+ ## 0.5.0
36
95
 
37
96
  * Use `osascript` to install system files, which require root privileges. [GH-18], [GH-22]
38
97
  * internal cleanups (@ringods)
39
98
 
40
- # v0.4.1
99
+ ## v0.4.1
41
100
 
42
101
  * Fixes an issue with not configured private networks [GH-21], [GH-19]
43
102
 
44
- # v0.4.0
103
+ ## v0.4.0
45
104
 
46
105
  **This version is not compatible to vagrant < 1.2**
47
106
 
@@ -50,33 +109,33 @@ This is a intermediate release towards v1.0.0
50
109
  * Fixes an issue where user-space files got created as root [GH-12]
51
110
  * Adds command line option `--purge` which deletes the created config file (not only the system symlink to it) [GH-3]
52
111
 
53
- # v0.3.0
112
+ ## v0.3.0
54
113
 
55
114
  * Using RubyDNS ~> 0.5.3
56
115
 
57
- # v0.2.5
116
+ ## v0.2.5
58
117
 
59
118
  * Using RubyDNS 0.4.x
60
119
 
61
- # v0.2.4
120
+ ## v0.2.4
62
121
 
63
122
  * Enable passthrough in DNS service. Helpful if you insist to hook a standard tld like .io.
64
123
 
65
- # v0.2.3
124
+ ## v0.2.3
66
125
 
67
126
  * Remove unneeded iteraton in installers/mac.rb. (thanks to JonathanTron for reporting)
68
127
  * Fix crash when no tld option was given.
69
128
 
70
- # v0.2.2
129
+ ## v0.2.2
71
130
 
72
131
  * Default to 127.0.0.1 when no network option is given
73
132
  * Warn if no default pattern is configured because TLD is given, but no host_name
74
133
 
75
- # v0.2.1
134
+ ## v0.2.1
76
135
 
77
136
  * Fix a crash when /etc/resolver is not present
78
137
 
79
- # v0.2.0
138
+ ## v0.2.0
80
139
 
81
140
  * Deactivate ipv6 support (was broken anyways)
82
141
  * Add multiple patterns support
@@ -86,7 +145,7 @@ This is a intermediate release towards v1.0.0
86
145
  * Uses one central server now
87
146
  * The DNS server is now reconfigured on every run
88
147
 
89
- # v0.1.0
148
+ ## v0.1.0
90
149
 
91
150
  * Initial Release
92
151
  * Support for A and AAAA configuration
data/DEVELOPMENT.md CHANGED
@@ -0,0 +1,23 @@
1
+ # Development Guidelines
2
+
3
+ TODO: Expand this section :)
4
+
5
+ The `Gemfile` uses two environment variables, `TEST_RUBY_VERSION` and `TEST_VAGRANT_VERSION` to control which version of ruby and vagrant are used during local development.
6
+
7
+ ## Running Acceptance Tests
8
+
9
+ This project uses `vagrant-spec` to run acceptance tests.
10
+ See `test/acceptance/dns` for spec files and `test/acceptance/skeletons/*` for Vagrantfiles.
11
+ See `tasks/acceptance.rake` for the basic setup of vagrant-spec. This file also defines which base box is used.
12
+ Specs will take quite some time and run in GUI mode (due to some weirdness either in vagrant-spec and/or VirtualBox) which will render your machine basically unusable.
13
+
14
+ ```bash
15
+ # List available tasks:
16
+ bundle exec rake -D acceptance
17
+
18
+ # Setup specs (download box artifacts)
19
+ bundle exec rake acceptance:setup:virtualbox
20
+
21
+ # Run tests
22
+ rake acceptance:virtualbox
23
+ ```
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source 'https://rubygems.org'
2
- ruby(ENV['TEST_RUBY_VERSION'] || '~> 2.3.4')
2
+ ruby(ENV['TEST_RUBY_VERSION'] || '~> 2.4.4')
3
3
 
4
- ENV['TEST_VAGRANT_VERSION'] ||= 'v1.9.6'
4
+ ENV['TEST_VAGRANT_VERSION'] ||= 'v2.1.4'
5
5
 
6
6
  # Using the :plugins group causes Vagrant to automagially load auto_network
7
7
  # during acceptance tests.
@@ -11,7 +11,7 @@ end
11
11
 
12
12
  group :test, :development do
13
13
  if ENV['TEST_VAGRANT_VERSION'] == 'HEAD'
14
- gem 'vagrant', :git => 'https://github.com/hashicorp/vagrant', :branch => 'master'
14
+ gem 'vagrant', :git => 'https://github.com/hashicorp/vagrant', :branch => 'main'
15
15
  else
16
16
  gem 'vagrant', :git => 'https://github.com/hashicorp/vagrant', :tag => ENV['TEST_VAGRANT_VERSION']
17
17
  end
@@ -19,7 +19,7 @@ group :test, :development do
19
19
  end
20
20
 
21
21
  group :test do
22
- gem 'vagrant-spec', :git => 'https://github.com/hashicorp/vagrant-spec'
22
+ gem 'vagrant-spec', :git => 'https://github.com/hashicorp/vagrant-spec', :branch => 'main'
23
23
  gem 'rake'
24
24
  end
25
25
 
data/PLATFORM_SUPPORT.md CHANGED
@@ -14,7 +14,7 @@ This document aims to be a guide to implementing support for other platforms.
14
14
  How Vagrant-DNS currently works
15
15
  ===============================
16
16
 
17
- In a nutshell, Vagrant-DNS starts a DNS server on a non-privileged port (5300 by default) and makes sure that the host operating system knows this server. If possible, it only does so for a specific, free, TLD (.dev). As a fallback, it also supports pass-through, if you really want to play with ICANN domains.
17
+ In a nutshell, Vagrant-DNS starts a DNS server on a non-privileged port (5300 by default) and makes sure that the host operating system knows this server. If possible, it only does so for a specific, free, TLD (.test). As a fallback, it also supports pass-through, if you really want to play with ICANN domains.
18
18
 
19
19
  The DNS server runs on all platforms.
20
20
 
@@ -58,4 +58,4 @@ Quite frankly, I have not enough understanding on how to implement this properly
58
58
  General Notes
59
59
  =============
60
60
 
61
- mDNS is not an option. It doesn't support subdomains and most implementations do not support multiple servers per machine. Thats sad, as all platforms come with good solutions for it.
61
+ mDNS is not an option. It doesn't support subdomains and most implementations do not support multiple servers per machine. Thats sad, as all platforms come with good solutions for it.
data/README.md CHANGED
@@ -18,11 +18,11 @@ In addition to your networking config, configure a toplevel domain and a `hostna
18
18
  Vagrant.configure("2") do |config|
19
19
  #...
20
20
 
21
- config.dns.tld = "dev"
21
+ config.dns.tld = "test"
22
22
 
23
23
  config.vm.hostname = "machine"
24
24
 
25
- config.dns.patterns = [/^.*mysite.dev$/, /^.*myothersite.dev$/]
25
+ config.dns.patterns = [/^(\w+\.)*mysite\.test$/, /^(\w+\.)*myothersite\.test$/]
26
26
 
27
27
  config.vm.network :private_network, ip: "33.33.33.60"
28
28
  end
@@ -37,7 +37,7 @@ Then, register the DNS server as a resolver:
37
37
  $ vagrant dns --install
38
38
  ```
39
39
 
40
- On OS X, this will create a file `/etc/resolver/dev`, which tells OS X to resolve the TLD `.dev` by using the nameserver given in this file. You will have to rerun --install every time a tld is added.
40
+ On OS X, this will create a file `/etc/resolver/test`, which tells OS X to resolve the TLD `.test` by using the nameserver given in this file. You will have to rerun --install every time a tld is added.
41
41
 
42
42
  You can delete this file by running:
43
43
 
@@ -45,7 +45,7 @@ You can delete this file by running:
45
45
  $ vagrant dns --uninstall
46
46
  ```
47
47
 
48
- To also delete the created config file for this TLD (`~/.vagrant.d/tmp/dns/resolver/dev` in our example) run:
48
+ To also delete the created config file for this TLD (`~/.vagrant.d/tmp/dns/resolver/test` in our example) run:
49
49
 
50
50
 
51
51
  ```bash
@@ -64,12 +64,12 @@ And test it:
64
64
  $ scutil --dns
65
65
  ...
66
66
  resolver #8
67
- domain : dev
67
+ domain : test
68
68
  nameserver[0] : 127.0.0.1
69
69
  port : 5300
70
70
  ...
71
- $ dscacheutil -q host -a name test.machine.dev
72
- name: test.machine.dev
71
+ $ dscacheutil -q host -a name test.machine.test
72
+ name: test.machine.test
73
73
  ip_address: 33.33.33.10
74
74
  ```
75
75
 
@@ -87,6 +87,47 @@ $ vagrant dns --stop
87
87
 
88
88
  The DNS server will start automatically once the first VM is started.
89
89
 
90
+ You can list the currently configured dns patterns using:
91
+
92
+ ```bash
93
+ $ vagrant dns --list
94
+ ```
95
+
96
+ (Keep in mind, that it's not guaranteed that the running server uses exactly this configuration - for example, when manually editing it.)
97
+ The output looks somewhat like this:
98
+
99
+ ```
100
+ /^.*mysite.test$/ => 33.33.33.60
101
+ /^.*myothersite.test$/ => 33.33.33.60
102
+ ```
103
+
104
+ Where the first part of each line is a [regular expression](https://ruby-doc.org/core-2.3.0/Regexp.html) and the second part is the mapped IPv4. (` => ` is just a separator)
105
+
106
+ ## Multi VM config
107
+
108
+ We can use [multivm](https://www.vagrantup.com/docs/multi-machine/) configuration and have dns names for host.
109
+
110
+ * Use below given vagrant config
111
+ ```ruby
112
+ BOX_IMAGE = "ubuntu/xenial64"
113
+ WORKER_COUNT = 2
114
+ Vagrant.configure("2") do |config|
115
+ (1..WORKER_COUNT).each do |i|
116
+ config.vm.define "worker#{i}" do |subconfig|
117
+ subconfig.dns.tld = "test"
118
+ subconfig.vm.hostname = "vagrant"
119
+ subconfig.dns.patterns = "worker#{i}.mysite.test"
120
+ subconfig.vm.box = BOX_IMAGE
121
+ subconfig.vm.network "private_network", ip: "10.240.0.#{i+15}"
122
+ end
123
+ end
124
+ end
125
+ ```
126
+ * `vagrant up`
127
+ * Execute : `vagrant dns --install`
128
+ * Test via: `ping worker2.mysite.box` or `worker1.mysite.box`
129
+
130
+
90
131
  ## VM options
91
132
 
92
133
  * `vm.dns.tld`: Set the tld for the given virtual machine. No default.
@@ -96,7 +137,36 @@ The DNS server will start automatically once the first VM is started.
96
137
  ## Global Options
97
138
 
98
139
  * `VagrantDNS::Config.listen`: an Array of Arrays describing interfaces to bind to. Defaults to `[[:udp, "127.0.0.1", 5300]]`.
140
+ * `VagrantDNS::Config.ttl`: The time-to-live in seconds for all resources. Defaults to `300` (5 minutes).
99
141
  * `VagrantDNS::Config.auto_run`: (re)start and reconfigure the server every time a machine is started. On by default.
142
+ * `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:
143
+ - `false`: Disables the feature.
144
+ - `"warn"`: Check and print a warning. (Still creates a resolver config and potentionally messes up your DNS) **At the moment, this is the default** because lots of projetcs used to use `"dev"` as a TLD, but this got registered by google and is now a public suffix.
145
+ - `"error"`: Check and prevent the box from starting. (Does not create the resolver config, it will also prevent the box from starting.)
146
+
147
+ ## Using custom domains from inside the VM (VirtualBox only)
148
+
149
+ If you need to be able to resolve custom domains managed by this plugin from inside your virtual machine, add the following
150
+ setting to your `Vagrantfile`:
151
+
152
+ ```ruby
153
+ Vagrant.configure(2) do |config|
154
+ # ...
155
+ config.vm.provider "virtualbox" do |vm_config, override|
156
+ vm_config.customize [
157
+ "modifyvm", :id,
158
+ "--natdnshostresolver1", "on",
159
+ # some systems also need this:
160
+ # "--natdnshostresolver2", "on"
161
+ ]
162
+ end
163
+ end
164
+ ```
165
+
166
+ By default, the Virtualbox NAT engine offers the same DNS servers to the guest that are configured on the host. With the above
167
+ setting, however, the NAT engine will act as a DNS proxy
168
+ (see [Virtualbox docs](https://www.virtualbox.org/manual/ch09.html#nat-adv-dns)). That way, queries for your custom domains
169
+ from inside the guest will also be handled by the DNS server run by the plugin.
100
170
 
101
171
  ## Issues
102
172
 
@@ -104,4 +174,4 @@ The DNS server will start automatically once the first VM is started.
104
174
  * No IPv6 support
105
175
  * OS X only (please read: [Platform
106
176
  Support](https://github.com/BerlinVagrant/vagrant-dns/blob/master/PLATFORM_SUPPORT.md) before ranting about this).
107
- * Not visible inside the box
177
+ * Not automatically visible inside the box (special configuration of your guest system or provider needed)
@@ -11,35 +11,56 @@ module VagrantDNS
11
11
  def execute
12
12
  options = {}
13
13
  opts = OptionParser.new do |opts|
14
- opts.banner = "Usage: vagrant dns [vm-name] [-i|--install] [-u|--uninstall] [--with-sudo] [--pruge] [-s|--start] [-S|--stop] [-r|--restart] [-o|--ontop]"
14
+ opts.banner = "Usage: vagrant dns [vm-name] [-i|--install] [-u|--uninstall] [--with-sudo] [--pruge] [-s|--start] [-S|--stop] [-r|--restart] [--status] [-l|--list] [-o|--ontop]"
15
15
  opts.separator ""
16
16
 
17
17
  opts.on("--install", "-i", "Install DNS config for machine domain") do
18
18
  options[:install] = true
19
+ options[:build_config] = true
20
+ options[:manage_installation] = true
19
21
  end
20
22
 
21
23
  opts.on("--uninstall", "-u", "Uninstall DNS config for machine domain") do
22
24
  options[:uninstall] = true
23
- end
24
-
25
- opts.on("--with-sudo", "In conjunction with `--install`, `--uninstall`, `--purge`: Run using `sudo` instead of `osascript`. Useful for automated scripts running as sudoer.") do
26
- options[:installer_opts] = { exec_style: :sudo }
25
+ options[:build_config] = false
26
+ options[:manage_installation] = true
27
+ options[:stop] = true
27
28
  end
28
29
 
29
30
  opts.on("--purge", "Uninstall DNS config and remove DNS configurations of all machines.") do
30
31
  options[:purge] = true
32
+ options[:build_config] = false
33
+ options[:manage_installation] = true
34
+ options[:stop] = true
31
35
  end
32
36
 
33
37
  opts.on("--start", "-s", "Start the DNS service") do
34
38
  options[:start] = true
39
+ options[:build_config] = true
35
40
  end
36
41
 
37
- opts.on("--stop", "-s", "Stop the DNS service") do
42
+ opts.on("--stop", "-S", "Stop the DNS service") do
38
43
  options[:stop] = true
44
+ options[:build_config] = false
39
45
  end
40
46
 
41
47
  opts.on("--restart", "-r", "Restart the DNS service") do
42
48
  options[:restart] = true
49
+ options[:build_config] = true
50
+ end
51
+
52
+ opts.on("--status", "Show DNS service running status and PID.") do
53
+ options[:status] = true
54
+ options[:build_config] = false
55
+ end
56
+
57
+ opts.on("--list", "-l", "Show the current DNS service config. This works in conjunction with --start --stop --restart --status.") do
58
+ options[:show_config] = true
59
+ options[:build_config] = false
60
+ end
61
+
62
+ opts.on("--with-sudo", "In conjunction with `--install`, `--uninstall`, `--purge`: Run using `sudo` instead of `osascript`. Useful for automated scripts running as sudoer.") do
63
+ options[:installer_opts] = { exec_style: :sudo }
43
64
  end
44
65
 
45
66
  opts.on("--ontop", "-o", "Start the DNS service on top. Debugging only, this blocks Vagrant!") do
@@ -52,15 +73,10 @@ module VagrantDNS
52
73
 
53
74
  vms = argv unless argv.empty?
54
75
 
55
- if options[:uninstall] || options[:purge]
56
- manage_service(vms, options.merge(stop: true))
57
- manage_installation(vms, options)
58
- else
59
- build_config(vms, options)
60
- manage_service(vms, options)
61
- manage_installation(vms, options) if options[:install]
62
- end
63
-
76
+ build_config(vms, options) if options[:build_config]
77
+ manage_service(vms, options)
78
+ manage_installation(vms, options) if options[:manage_installation]
79
+ show_config(vms, options) if options[:show_config]
64
80
  end
65
81
 
66
82
  protected
@@ -91,11 +107,18 @@ module VagrantDNS
91
107
  service.stop!
92
108
  elsif options[:restart]
93
109
  service.restart! :ontop => options[:ontop]
110
+ elsif options[:status]
111
+ service.status!
94
112
  end
95
113
  end
96
114
 
115
+ def show_config(vms, options)
116
+ service = VagrantDNS::Service.new(tmp_path)
117
+ service.show_config
118
+ end
119
+
97
120
  def build_config(vms, options)
98
- with_target_vms(vms) { |vm| VagrantDNS::Configurator.new(vm, tmp_path).run! }
121
+ with_target_vms(vms) { |vm| VagrantDNS::Configurator.new(vm, tmp_path).up! }
99
122
  end
100
123
 
101
124
  def tmp_path
@@ -3,27 +3,60 @@ require 'logger'
3
3
  module VagrantDNS
4
4
  class Config < Vagrant.plugin(2, :config)
5
5
  class << self
6
- attr_accessor :listen, :logger, :ipv4only, :auto_run
6
+ attr_accessor :listen, :ttl, :logger, :auto_run, :check_public_suffix
7
7
 
8
8
  def listen
9
9
  @listen ||= [[:udp, "127.0.0.1", 5300]]
10
10
  end
11
11
 
12
- def ipv4only
13
- @ipv4only || @ipv4only.nil?
12
+ def ttl
13
+ @ttl ||= 300
14
14
  end
15
-
15
+
16
16
  def auto_run
17
17
  return true if @auto_run.nil?
18
18
  @auto_run
19
19
  end
20
+
21
+ def check_public_suffix
22
+ return "warn" if @check_public_suffix.nil?
23
+ @check_public_suffix
24
+ end
25
+
26
+ def validate_tlds(vm)
27
+ return [true, nil] unless check_public_suffix
28
+
29
+ require "public_suffix"
30
+
31
+ # Don't include private domains in the list, we are only interested in TLDs and such
32
+ list = PublicSuffix::List.parse(
33
+ File.read(PublicSuffix::List::DEFAULT_LIST_PATH),
34
+ private_domains: false
35
+ )
36
+
37
+ failed_tlds = vm.config.dns.tlds.select { |tld| list.find(tld, default: false) }
38
+
39
+ err = if failed_tlds.any?
40
+ "tlds include a public suffix: #{failed_tlds.join(', ')}"
41
+ end
42
+
43
+ if err && check_public_suffix.to_s == "error"
44
+ [false, err]
45
+ elsif err
46
+ [true, err]
47
+ else
48
+ [true, nil]
49
+ end
50
+ end
20
51
  end
21
52
 
22
- attr_accessor :records, :tlds, :ipv4only, :patterns
53
+ attr_accessor :records
54
+ attr_reader :tlds, :patterns
23
55
 
24
56
  def pattern=(pattern)
25
- self.patterns = pattern
57
+ @patterns = (pattern ? Array(pattern) : pattern)
26
58
  end
59
+ alias_method :patterns=, :pattern=
27
60
 
28
61
  def tld=(tld)
29
62
  @tlds = Array(tld)
@@ -36,12 +69,31 @@ module VagrantDNS
36
69
  # explicit hash, to get symbols in hash keys
37
70
  def to_hash
38
71
  {
39
- :patterns => (patterns ? Array(patterns) : patterns),
72
+ :patterns => patterns,
40
73
  :records => records,
41
- :tlds => tlds,
42
- :ipv4only => ipv4only
74
+ :tlds => tlds
43
75
  }
44
76
  end
77
+
78
+ def validate(machine)
79
+ errors = _detected_errors
80
+
81
+ errors = validate_check_public_suffix(errors, machine)
82
+
83
+ { "vagrant_dns" => errors }
84
+ end
85
+
86
+ def validate_check_public_suffix(errors, machine)
87
+ valid, err = self.class.validate_tlds(machine)
88
+
89
+ if !valid
90
+ errors << err
91
+ elsif err
92
+ machine.ui.warn(err)
93
+ end
94
+
95
+ errors
96
+ end
45
97
  end
46
98
  end
47
99
 
@@ -1,5 +1,4 @@
1
1
  require 'fileutils'
2
- require 'yaml'
3
2
 
4
3
  module VagrantDNS
5
4
  class Configurator
@@ -10,13 +9,28 @@ module VagrantDNS
10
9
  @tmp_path = tmp_path
11
10
  end
12
11
 
13
- def run!
12
+ def up!
13
+ return unless validate_tlds
14
14
  regenerate_resolvers!
15
15
  ensure_deamon_env!
16
16
  register_patterns!
17
17
  end
18
18
 
19
+ def down!
20
+ unregister_patterns!
21
+ end
22
+
19
23
  private
24
+ def validate_tlds
25
+ valid, err = VagrantDNS::Config.validate_tlds(vm)
26
+ if !valid
27
+ vm.ui.error(err)
28
+ elsif err
29
+ vm.ui.warn(err)
30
+ end
31
+ valid
32
+ end
33
+
20
34
  def regenerate_resolvers!
21
35
  FileUtils.mkdir_p(resolver_folder)
22
36
 
@@ -56,15 +70,38 @@ module VagrantDNS
56
70
 
57
71
  ip = network.last[:ip]
58
72
 
59
- registry = YAML.load(File.read(config_file)) if File.exists?(config_file)
60
- registry ||= {}
73
+ registry = Registry.new(tmp_path)
74
+ registry.transaction do
75
+ patterns.each do |pattern|
76
+ registry[pattern] = ip
77
+ end
78
+ end
79
+ end
80
+
81
+ def unregister_patterns!
82
+ opts = dns_options(vm)
61
83
 
62
- patterns.each do |p|
63
- p = p.source if p.respond_to? :source # Regexp#to_s is unusable
64
- registry[p] = ip
84
+ patterns = opts[:patterns] || default_patterns(opts)
85
+ if patterns.empty?
86
+ vm.ui.warn '[vagrant-dns] TLD but no host_name given. No patterns will be removed.'
87
+ return
65
88
  end
66
89
 
67
- File.open(config_file, "w") { |f| f << YAML.dump(registry) }
90
+ registry = Registry.new(tmp_path)
91
+ registry.transaction do
92
+ unless registry.any?
93
+ vm.ui.warn '[vagrant-dns] Configuration missing or empty. No patterns will be removed.'
94
+ registry.abort
95
+ end
96
+
97
+ patterns.each do |pattern|
98
+ if (ip = registry.delete(pattern))
99
+ vm.ui.info "[vagrant-dns] Removing pattern: #{pattern} for ip: #{ip}"
100
+ else
101
+ vm.ui.info "[vagrant-dns] Pattern: #{pattern} was not in config."
102
+ end
103
+ end
104
+ end
68
105
  end
69
106
 
70
107
  def dns_options(vm)
@@ -97,9 +134,5 @@ FILE
97
134
  def ensure_deamon_env!
98
135
  FileUtils.mkdir_p(File.join(tmp_path, "daemon"))
99
136
  end
100
-
101
- def config_file
102
- File.join(tmp_path, "config")
103
- end
104
137
  end
105
138
  end
@@ -0,0 +1,20 @@
1
+ module VagrantDNS
2
+ module Middlewares
3
+ class ConfigDown
4
+ def initialize(app, env)
5
+ @app = app
6
+ @env = env
7
+ end
8
+
9
+ def call(env)
10
+ @env = env
11
+ vm = env[:machine]
12
+ if VagrantDNS::Config.auto_run
13
+ tmp_path = File.join(vm.env.tmp_path, "dns")
14
+ VagrantDNS::Configurator.new(vm, tmp_path).down!
15
+ end
16
+ @app.call(env)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantDNS
2
+ module Middlewares
3
+ class ConfigUp
4
+ def initialize(app, env)
5
+ @app = app
6
+ @env = env
7
+ end
8
+
9
+ def call(env)
10
+ @env = env
11
+ vm = env[:machine]
12
+ if VagrantDNS::Config.auto_run
13
+ tmp_path = File.join(vm.env.tmp_path, "dns")
14
+ VagrantDNS::Configurator.new(vm, tmp_path).up!
15
+ end
16
+ @app.call(env)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ module VagrantDNS
2
+ module Middlewares
3
+ class Restart
4
+ def initialize(app, env)
5
+ @app = app
6
+ @env = env
7
+ end
8
+
9
+ def call(env)
10
+ @env = env
11
+ vm = env[:machine]
12
+ if VagrantDNS::Config.auto_run
13
+ tmp_path = File.join(vm.env.tmp_path, "dns")
14
+ VagrantDNS::Service.new(tmp_path).restart!
15
+ env[:ui].info "Restarted DNS Service"
16
+ end
17
+ @app.call(env)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,60 @@
1
+ require 'yaml/store'
2
+ require 'forwardable'
3
+
4
+ module VagrantDNS
5
+ # This is the dns pattern registry (aka "config")
6
+ # It basically delegates everything to a YAML::Store but handles the conversion
7
+ # of Regexp dns-patterns into YAML string keys and reverse.
8
+ class Registry
9
+ extend Forwardable
10
+
11
+ def initialize(tmp_path)
12
+ @store = YAML::Store.new(File.join(tmp_path, "config"), true)
13
+ end
14
+
15
+ def_delegators :@store, :transaction, :abort, :commit
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
28
+
29
+ def delete(name)
30
+ name = name.source if name.respond_to? :source
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?
50
+ end
51
+
52
+ def to_hash
53
+ @store.transaction(true) do
54
+ @store.roots.each_with_object({}) do |name, a|
55
+ a[Regexp.new(name)] = @store[name]
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -1,6 +1,5 @@
1
1
  require 'daemons'
2
2
 
3
-
4
3
  module VagrantDNS
5
4
  class Service
6
5
  attr_accessor :tmp_path
@@ -22,18 +21,24 @@ module VagrantDNS
22
21
  run!(run_options)
23
22
  end
24
23
 
24
+ def status!
25
+ run_options = {:ARGV => ["status"]}.merge(runopts)
26
+ run!(run_options)
27
+ end
28
+
25
29
  def run!(run_options)
26
30
  Daemons.run_proc("vagrant-dns", run_options) do
27
31
  require 'rubydns'
28
32
  require 'async/dns/system'
29
33
 
30
- registry = YAML.load(File.read(config_file))
34
+ registry = Registry.new(tmp_path).to_hash
31
35
  std_resolver = RubyDNS::Resolver.new(Async::DNS::System.nameservers)
36
+ ttl = VagrantDNS::Config.ttl
32
37
 
33
38
  RubyDNS::run_server(VagrantDNS::Config.listen) do
34
39
  registry.each do |pattern, ip|
35
- match(Regexp.new(pattern), Resolv::DNS::Resource::IN::A) do |transaction, match_data|
36
- transaction.respond!(ip)
40
+ match(pattern, Resolv::DNS::Resource::IN::A) do |transaction, match_data|
41
+ transaction.respond!(ip, ttl: ttl)
37
42
  end
38
43
  end
39
44
 
@@ -52,6 +57,18 @@ module VagrantDNS
52
57
  start!(start_opts)
53
58
  end
54
59
 
60
+ def show_config
61
+ registry = Registry.new(tmp_path).to_hash
62
+
63
+ if registry.any?
64
+ registry.each do |pattern, ip|
65
+ puts format("%s => %s", pattern.inspect, ip)
66
+ end
67
+ else
68
+ puts "Configuration missing or empty."
69
+ end
70
+ end
71
+
55
72
  def runopts
56
73
  daemon_dir = File.join(tmp_path, "daemon")
57
74
  {
@@ -61,9 +78,5 @@ module VagrantDNS
61
78
  :log_dir => daemon_dir
62
79
  }
63
80
  end
64
-
65
- def config_file
66
- File.join(tmp_path, "config")
67
- end
68
81
  end
69
82
  end
@@ -1,5 +1,3 @@
1
- module Vagrant
2
- module Dns
3
- VERSION = "2.0.0"
4
- end
1
+ module VagrantDNS
2
+ VERSION = "2.2.2"
5
3
  end
data/lib/vagrant-dns.rb CHANGED
@@ -1,15 +1,32 @@
1
1
  require "vagrant-dns/version"
2
2
  require "vagrant-dns/config"
3
3
 
4
+ require "vagrant-dns/registry"
4
5
  require "vagrant-dns/service"
5
6
  require "vagrant-dns/installers/mac"
6
- require "vagrant-dns/restart_middleware"
7
7
  require "vagrant-dns/configurator"
8
+ require "vagrant-dns/middlewares/config_up"
9
+ require "vagrant-dns/middlewares/config_down"
10
+ require "vagrant-dns/middlewares/restart"
8
11
 
9
12
  module VagrantDNS
10
13
 
11
- class Plugin < Vagrant.plugin("2")
14
+ # @private
15
+ def self.hooks
16
+ @hooks ||= []
17
+ end
12
18
 
19
+ # @private
20
+ def self.hooked(name)
21
+ hooks << name
22
+ end
23
+
24
+ # @private
25
+ def self.hooked?(name)
26
+ hooks.include?(name)
27
+ end
28
+
29
+ class Plugin < Vagrant.plugin("2")
13
30
  name "vagrant-dns"
14
31
 
15
32
  config "dns" do
@@ -21,12 +38,23 @@ module VagrantDNS
21
38
  Command
22
39
  end
23
40
 
24
- %w{up reload}.each do |action|
25
- action_hook(:restart_host_dns, "machine_action_#{action}".to_sym) do |hook|
26
- hook.append VagrantDNS::RestartMiddleware
41
+ %w{machine_action_up machine_action_reload}.each do |action|
42
+ action_hook("restart_vagarant_dns_on_#{action}", action) do |hook|
43
+ unless VagrantDNS.hooked?(action)
44
+ hook.append VagrantDNS::Middlewares::ConfigUp
45
+ hook.append VagrantDNS::Middlewares::Restart
46
+ VagrantDNS.hooked(action)
47
+ end
27
48
  end
28
49
  end
29
50
 
51
+ action_hook("remove_vagrant_dns_config", "machine_action_destroy") do |hook|
52
+ unless VagrantDNS.hooked?("remove_vagrant_dns_config")
53
+ hook.append VagrantDNS::Middlewares::ConfigDown
54
+ hook.append VagrantDNS::Middlewares::Restart
55
+ VagrantDNS.hooked("remove_vagrant_dns_config")
56
+ end
57
+ end
30
58
  end
31
59
 
32
60
  end
@@ -1,3 +1,5 @@
1
+ require "tmpdir"
2
+
1
3
  namespace :acceptance do
2
4
  def tmp_dir_path
3
5
  @tmp_dir_path ||= ENV["VS_TEMP"] || Dir.mktmpdir('vagrant-dns-spec')
@@ -6,22 +8,25 @@ namespace :acceptance do
6
8
  ARTIFACT_DIR = File.join('test', 'acceptance', 'artifacts')
7
9
 
8
10
  TEST_BOXES = {
9
- :virtualbox => 'http://files.vagrantup.com/precise32.box'
11
+ # Ubuntu 16.04 https://app.vagrantup.com/ubuntu/boxes/xenial64.json
12
+ # :virtualbox => "https://vagrantcloud.com/ubuntu/boxes/xenial64/versions/20180511.0.0/providers/virtualbox.box"
13
+ # Ubuntu 18.04 https://app.vagrantup.com/ubuntu/boxes/bionic64.json
14
+ :virtualbox => "https://vagrantcloud.com/ubuntu/boxes/bionic64/versions/20180709.0.0/providers/virtualbox.box"
10
15
  }
11
16
 
12
17
  TEST_BOXES.each do |provider, box_url|
13
18
  # Declare file download tasks
14
- directory ARTIFACT_DIR do
15
- file File.join(ARTIFACT_DIR, "#{provider}.box") => ARTIFACT_DIR do |path|
16
- puts 'Downloading: ' + box_url
17
- Kernel.system 'curl', '-L', '-o', path.to_s, box_url
18
- end
19
+ directory ARTIFACT_DIR
20
+
21
+ file File.join(ARTIFACT_DIR, "#{provider}.box") => ARTIFACT_DIR do |path|
22
+ puts 'Downloading: ' + box_url
23
+ Kernel.system 'curl', '-L', '-o', path.to_s, box_url
19
24
  end
20
25
 
21
26
  desc "Run acceptance tests for #{provider}"
22
27
  task provider => :"setup:#{provider}" do |task|
23
28
  box_path = File.expand_path(File.join('..', '..', ARTIFACT_DIR, "#{provider}.box"), __FILE__)
24
- puts "TMPDIR: " + tmp_dir_path
29
+ puts "TMPDIR: #{tmp_dir_path}"
25
30
  Kernel.system(
26
31
  {
27
32
  "VS_PROVIDER" => provider.to_s,
data/vagrant-dns.gemspec CHANGED
@@ -7,18 +7,25 @@ Gem::Specification.new do |gem|
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
9
  gem.homepage = ""
10
+ gem.license = "MIT"
10
11
 
11
12
  gem.files = `git ls-files`.split($\).reject { |f| f.match(%r{^(test|testdrive)/}) }
12
13
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
14
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
15
  gem.name = "vagrant-dns"
15
16
  gem.require_paths = ["lib"]
16
- gem.version = Vagrant::Dns::VERSION
17
+ gem.version = VagrantDNS::VERSION
17
18
 
18
19
  gem.required_ruby_version = '>= 2.2.6'
19
20
 
20
21
  gem.add_dependency "daemons"
21
22
  gem.add_dependency "rubydns", '~> 2.0.0'
23
+ gem.add_dependency "public_suffix"
24
+
25
+ # Pinning async gem to work around an issue in vagrant, where it does not
26
+ # honor "required_ruby_version" while resolving sub-dependencies.
27
+ # see: https://github.com/hashicorp/vagrant/issues/12640
28
+ gem.add_dependency 'async', '< 2'
22
29
 
23
30
  gem.add_development_dependency 'rspec'
24
31
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-dns
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Gilcher
8
8
  - Robert Schulze
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-10-19 00:00:00.000000000 Z
12
+ date: 2022-01-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: daemons
@@ -39,6 +39,34 @@ dependencies:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
41
  version: 2.0.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: public_suffix
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: async
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '2'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "<"
68
+ - !ruby/object:Gem::Version
69
+ version: '2'
42
70
  - !ruby/object:Gem::Dependency
43
71
  name: rspec
44
72
  requirement: !ruby/object:Gem::Requirement
@@ -75,16 +103,20 @@ files:
75
103
  - lib/vagrant-dns/config.rb
76
104
  - lib/vagrant-dns/configurator.rb
77
105
  - lib/vagrant-dns/installers/mac.rb
78
- - lib/vagrant-dns/restart_middleware.rb
106
+ - lib/vagrant-dns/middlewares/config_down.rb
107
+ - lib/vagrant-dns/middlewares/config_up.rb
108
+ - lib/vagrant-dns/middlewares/restart.rb
109
+ - lib/vagrant-dns/registry.rb
79
110
  - lib/vagrant-dns/service.rb
80
111
  - lib/vagrant-dns/version.rb
81
112
  - tasks/acceptance.rake
82
113
  - vagrant-dns.gemspec
83
114
  - vagrant-spec.config.rb
84
115
  homepage: ''
85
- licenses: []
116
+ licenses:
117
+ - MIT
86
118
  metadata: {}
87
- post_install_message:
119
+ post_install_message:
88
120
  rdoc_options: []
89
121
  require_paths:
90
122
  - lib
@@ -99,9 +131,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
131
  - !ruby/object:Gem::Version
100
132
  version: '0'
101
133
  requirements: []
102
- rubyforge_project:
103
- rubygems_version: 2.5.2
104
- signing_key:
134
+ rubygems_version: 3.1.6
135
+ signing_key:
105
136
  specification_version: 4
106
137
  summary: vagrant-dns manages DNS records of vagrant machines
107
138
  test_files: []
@@ -1,21 +0,0 @@
1
- module VagrantDNS
2
- class RestartMiddleware
3
- def initialize(app, env)
4
- @app = app
5
- @env = env
6
- end
7
-
8
- def call(env)
9
- @env = env
10
- vm = env[:machine]
11
- if VagrantDNS::Config.auto_run
12
- tmp_path = File.join(vm.env.tmp_path, "dns")
13
- VagrantDNS::Configurator.new(vm, tmp_path).run!
14
- VagrantDNS::Service.new(tmp_path).restart!
15
- env[:ui].info "Restarted DNS Service"
16
- end
17
-
18
- @app.call(env)
19
- end
20
- end
21
- end