vagrant-dns 0.1.0 → 0.2.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.
- data/CHANGELOG.md +14 -0
- data/README.md +21 -8
- data/Vagrantfile +4 -3
- data/lib/vagrant-dns.rb +7 -1
- data/lib/vagrant-dns/command.rb +30 -63
- data/lib/vagrant-dns/config.rb +24 -7
- data/lib/vagrant-dns/configurator.rb +75 -0
- data/lib/vagrant-dns/installers/mac.rb +38 -0
- data/lib/vagrant-dns/restart_middleware.rb +19 -0
- data/lib/vagrant-dns/service.rb +52 -0
- data/lib/vagrant-dns/version.rb +1 -1
- metadata +7 -2
data/CHANGELOG.md
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# v0.2.0
|
2
|
+
|
3
|
+
* Deactivate ipv6 support (was broken anyways)
|
4
|
+
* Add multiple patterns support
|
5
|
+
* Introduces the `tlds` config key, for managing multiple tlds. `tld` is still supported
|
6
|
+
* --ontop option to run the dns server on top
|
7
|
+
* removed the logger config in favor of a default logger
|
8
|
+
* Uses one central server now
|
9
|
+
* The DNS server is now reconfigured on every run
|
10
|
+
|
11
|
+
# v0.1.0
|
12
|
+
|
13
|
+
* Initial Release
|
14
|
+
* Support for A and AAAA configuration
|
data/README.md
CHANGED
@@ -14,7 +14,7 @@ otherwise, use:
|
|
14
14
|
|
15
15
|
## Usage
|
16
16
|
|
17
|
-
In addition to your networking config, configure a toplevel domain and a `host_name` for your machine. Optionally configure a
|
17
|
+
In addition to your networking config, configure a toplevel domain and a `host_name` for your machine. Optionally, configure a set of free matching patterns. Global configuration options can be given through the `VagrantDNS::Config` object:
|
18
18
|
|
19
19
|
```ruby
|
20
20
|
Vagrant::Config.run do |config|
|
@@ -23,12 +23,14 @@ Vagrant::Config.run do |config|
|
|
23
23
|
config.dns.tld = "dev"
|
24
24
|
|
25
25
|
config.vm.host_name = "machine"
|
26
|
+
|
27
|
+
config.dns.patterns = [/^.*mysite.dev$/, /^.*myothersite.dev$/]
|
28
|
+
|
26
29
|
config.vm.network :hostonly, "33.33.33.60"
|
27
30
|
end
|
28
31
|
|
29
32
|
# optional
|
30
33
|
VagrantDNS::Config.logger = Logger.new("dns.log")
|
31
|
-
VagrantDNS::Config.listen = [[:udp, "0.0.0.0", 5300]]
|
32
34
|
```
|
33
35
|
|
34
36
|
Then, register the DNS server as a resolver:
|
@@ -37,7 +39,7 @@ Then, register the DNS server as a resolver:
|
|
37
39
|
$ sudo vagrant dns --install
|
38
40
|
```
|
39
41
|
|
40
|
-
On OS X, this will create a file `/etc/resolver/dev`, which tells OS X to resolve the TLD `.dev` by using the
|
42
|
+
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.
|
41
43
|
|
42
44
|
You can delete this file by running:
|
43
45
|
|
@@ -65,11 +67,22 @@ Finally, stop the server using:
|
|
65
67
|
$ vagrant dns --stop
|
66
68
|
```
|
67
69
|
|
68
|
-
|
70
|
+
The DNS server will start automatically once the first VM is started.
|
71
|
+
|
72
|
+
## VM options
|
73
|
+
|
74
|
+
* `vm.dns.tld`: Set the tld for the given virtual machine. No default.
|
75
|
+
* `vm.dns.tlds`: Set multiple tlds. Default: `[tld]`
|
76
|
+
* `vm.dns.patterns`: A list of domain patterns to match. Defaults to `[/^.*{host_name}.{tld}$/]`
|
77
|
+
|
78
|
+
## Global Options
|
79
|
+
|
80
|
+
* `VagrantDNS::Config.listen`: an Array of Arrays describing interfaces to bind to. Defaults to `[[:udp, "127.0.0.1", 5300]]`.
|
81
|
+
* `VagrantDNS::Config.auto_run`: (re)start and reconfigure the server every time a machine is started. On by default.
|
82
|
+
|
83
|
+
## Issues
|
69
84
|
|
70
|
-
*
|
71
|
-
*
|
72
|
-
* Only one record per machine ("hostname.tld")
|
73
|
-
* Advanced customization of record rules is not supported at the moment
|
85
|
+
* A records only
|
86
|
+
* no ipv6 support
|
74
87
|
* OS X only
|
75
88
|
* Alpha code
|
data/Vagrantfile
CHANGED
@@ -9,12 +9,13 @@ Vagrant::Config.run do |config|
|
|
9
9
|
|
10
10
|
# Every Vagrant virtual environment requires a box to build off of.
|
11
11
|
config.vm.box = "base"
|
12
|
-
|
12
|
+
|
13
13
|
config.dns.tld = "dev"
|
14
|
-
|
14
|
+
config.dns.patterns = /^.*machine.dev$/
|
15
|
+
|
15
16
|
config.vm.host_name = "machine"
|
16
17
|
config.vm.network :hostonly, "33.33.33.60"
|
17
18
|
|
18
|
-
|
19
|
+
|
19
20
|
VagrantDNS::Config.listen = [[:udp, "0.0.0.0", 5300]]
|
20
21
|
end
|
data/lib/vagrant-dns.rb
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
require "vagrant-dns/version"
|
2
2
|
require "vagrant-dns/command"
|
3
3
|
require "vagrant-dns/config"
|
4
|
+
require "vagrant-dns/service"
|
5
|
+
require "vagrant-dns/installers/mac"
|
6
|
+
require "vagrant-dns/restart_middleware"
|
7
|
+
require "vagrant-dns/configurator"
|
4
8
|
|
5
9
|
Vagrant.config_keys.register(:dns) { VagrantDNS::Config }
|
6
10
|
|
7
|
-
Vagrant.commands.register(:dns) { VagrantDNS::Command }
|
11
|
+
Vagrant.commands.register(:dns) { VagrantDNS::Command }
|
12
|
+
|
13
|
+
Vagrant.actions[:start].insert Vagrant::Action::VM::Customize, VagrantDNS::RestartMiddleware
|
data/lib/vagrant-dns/command.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
require 'daemons'
|
3
|
+
require 'rbconfig'
|
3
4
|
|
4
5
|
module VagrantDNS
|
5
6
|
|
@@ -10,7 +11,7 @@ module VagrantDNS
|
|
10
11
|
def execute
|
11
12
|
options = {}
|
12
13
|
opts = OptionParser.new do |opts|
|
13
|
-
opts.banner = "Usage: vagrant dns [vm-name] [-i|--install] [-u|--uninstall] [-s|--start] [-S|--stop]"
|
14
|
+
opts.banner = "Usage: vagrant dns [vm-name] [-i|--install] [-u|--uninstall] [-s|--start] [-S|--stop] [-r|--restart] [-o|--ontop]"
|
14
15
|
opts.separator ""
|
15
16
|
|
16
17
|
opts.on("--install", "-i", "Install DNS config for machine domain") do
|
@@ -28,7 +29,14 @@ module VagrantDNS
|
|
28
29
|
opts.on("--stop", "-s", "Stop the DNS service") do
|
29
30
|
options[:stop] = true
|
30
31
|
end
|
31
|
-
|
32
|
+
|
33
|
+
opts.on("--restart", "-r", "Restart the DNS service") do
|
34
|
+
options[:restart] = true
|
35
|
+
end
|
36
|
+
|
37
|
+
opts.on("--ontop", "-o", "Start the DNS service on top. Debugging only, this blocks Vagrant!") do
|
38
|
+
options[:ontop] = true
|
39
|
+
end
|
32
40
|
end
|
33
41
|
|
34
42
|
argv = parse_options(opts)
|
@@ -36,75 +44,34 @@ module VagrantDNS
|
|
36
44
|
|
37
45
|
dns_options = []
|
38
46
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
47
|
+
vms = argv unless argv.empty?
|
48
|
+
tmp_path = File.join(@env.tmp_path, "dns")
|
49
|
+
|
50
|
+
with_target_vms(vms) { |vm| VagrantDNS::Configurator.new(vm, tmp_path).run! }
|
51
|
+
|
52
|
+
service = VagrantDNS::Service.new(tmp_path, options)
|
46
53
|
|
47
54
|
if options[:start]
|
48
|
-
|
55
|
+
service.start!
|
49
56
|
elsif options[:stop]
|
50
|
-
|
57
|
+
service.stop!
|
58
|
+
elsif options[:restart]
|
59
|
+
service.restart!
|
51
60
|
end
|
52
|
-
|
53
|
-
if options[:start] || options[:stop]
|
54
|
-
Daemons.run_proc("dnsserver.rb", run_options) do
|
55
|
-
require 'rubydns'
|
56
|
-
|
57
|
-
RubyDNS::run_server(:listen => VagrantDNS::Config.listen) do
|
58
|
-
self.logger = VagrantDNS::Config.logger if VagrantDNS::Config.logger
|
59
|
-
|
60
|
-
dns_options.each do |opts|
|
61
|
-
pattern = /^.*#{opts[:host_name]}.#{opts[:tld]}$/
|
62
|
-
|
63
|
-
network = opts[:networks].first
|
64
|
-
ip = network.last.first
|
65
61
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
if options[:install]
|
76
|
-
require 'fileutils'
|
77
|
-
dns_options.each do |opts|
|
78
|
-
port = VagrantDNS::Config.listen.first.last
|
79
|
-
tld = opts[:tld]
|
80
|
-
contents = <<-FILE
|
81
|
-
nameserver 127.0.0.1
|
82
|
-
port #{port}
|
83
|
-
FILE
|
84
|
-
FileUtils.mkdir_p("/etc/resolver")
|
85
|
-
File.open(File.join("/etc/resolver", tld), "w") do |f|
|
86
|
-
f << contents
|
62
|
+
if options[:install] || options[:uninstall]
|
63
|
+
if RbConfig::CONFIG["host_os"].match /darwin/
|
64
|
+
installer = VagrantDNS::Installers::Mac.new(tmp_path)
|
65
|
+
|
66
|
+
if options[:install]
|
67
|
+
installer.install!
|
68
|
+
elsif options[:uninstall]
|
69
|
+
installer.uninstall!
|
87
70
|
end
|
71
|
+
else
|
72
|
+
raise 'installing and uninstalling is only supported on Mac OS X at the moment.'
|
88
73
|
end
|
89
74
|
end
|
90
|
-
|
91
|
-
if options[:uninstall]
|
92
|
-
require 'fileutils'
|
93
|
-
|
94
|
-
dns_options.each do |opts|
|
95
|
-
tld = opts[:tld]
|
96
|
-
FileUtils.rm(File.join("/etc/resolver", tld))
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
protected
|
102
|
-
|
103
|
-
def get_dns_options(vm)
|
104
|
-
dns_options = vm.config.dns.to_hash
|
105
|
-
dns_options[:host_name] = vm.config.vm.host_name
|
106
|
-
dns_options[:networks] = vm.config.vm.networks
|
107
|
-
dns_options
|
108
75
|
end
|
109
76
|
end
|
110
77
|
end
|
data/lib/vagrant-dns/config.rb
CHANGED
@@ -1,26 +1,43 @@
|
|
1
1
|
require 'logger'
|
2
2
|
|
3
3
|
module VagrantDNS
|
4
|
-
|
5
4
|
class Config < Vagrant::Config::Base
|
6
5
|
class << self
|
7
|
-
attr_accessor :listen, :logger
|
8
|
-
|
6
|
+
attr_accessor :listen, :logger, :ipv4only, :auto_run
|
7
|
+
|
9
8
|
def listen
|
10
9
|
@listen ||= [[:udp, "127.0.0.1", 5300]]
|
11
10
|
end
|
11
|
+
|
12
|
+
def ipv4only
|
13
|
+
@ipv4only || @ipv4only.nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
def auto_run
|
17
|
+
return true if @auto_run.nil?
|
18
|
+
@auto_run
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
attr_accessor :records, :tlds, :ipv4only, :patterns
|
23
|
+
|
24
|
+
def pattern=(pattern)
|
25
|
+
self.patterns = pattern
|
12
26
|
end
|
13
27
|
|
14
|
-
|
15
|
-
|
28
|
+
def tld=(tld)
|
29
|
+
@tlds = Array(tld)
|
30
|
+
end
|
31
|
+
|
16
32
|
# explicit hash, to get symbols in hash keys
|
17
33
|
def to_hash
|
18
34
|
{
|
35
|
+
:patterns => (patterns ? Array(patterns) : patterns),
|
19
36
|
:records => records,
|
20
|
-
:
|
37
|
+
:tlds => tlds,
|
38
|
+
:ipv4only => ipv4only
|
21
39
|
}
|
22
40
|
end
|
23
|
-
|
24
41
|
end
|
25
42
|
end
|
26
43
|
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module VagrantDNS
|
5
|
+
class Configurator
|
6
|
+
attr_accessor :vm, :tmp_path
|
7
|
+
|
8
|
+
def initialize(vm, tmp_path)
|
9
|
+
@vm = vm
|
10
|
+
@tmp_path = tmp_path
|
11
|
+
end
|
12
|
+
|
13
|
+
def run!
|
14
|
+
regenerate_resolvers!
|
15
|
+
ensure_deamon_env!
|
16
|
+
register_patterns!
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def regenerate_resolvers!
|
21
|
+
FileUtils.mkdir_p(resolver_folder)
|
22
|
+
port = VagrantDNS::Config.listen.first.last
|
23
|
+
tlds = dns_options(vm)[:tlds]
|
24
|
+
|
25
|
+
tlds.each do |tld|
|
26
|
+
File.open(File.join(resolver_folder, tld), "w") do |f|
|
27
|
+
f << resolver_file(port)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def register_patterns!
|
33
|
+
registry = YAML.load(File.read(config_file)) if File.exists?(config_file)
|
34
|
+
registry ||= {}
|
35
|
+
opts = dns_options(vm)
|
36
|
+
patterns = opts[:patterns] || opts[:tlds].map { |tld| /^.*#{opts[:host_name]}.#{tld}$/ }
|
37
|
+
network = opts[:networks].first
|
38
|
+
ip = network.last.first
|
39
|
+
|
40
|
+
patterns.each do |p|
|
41
|
+
p = p.source if p.respond_to? :source # Regexp#to_s is unusable
|
42
|
+
registry[p] = ip
|
43
|
+
end
|
44
|
+
|
45
|
+
File.open(config_file, "w") { |f| f << YAML.dump(registry) }
|
46
|
+
end
|
47
|
+
|
48
|
+
def dns_options(vm)
|
49
|
+
dns_options = vm.config.dns.to_hash
|
50
|
+
dns_options[:host_name] = vm.config.vm.host_name
|
51
|
+
dns_options[:networks] = vm.config.vm.networks
|
52
|
+
dns_options
|
53
|
+
end
|
54
|
+
|
55
|
+
def resolver_file(port)
|
56
|
+
contents = <<-FILE
|
57
|
+
# this file is generated by vagrant-dns
|
58
|
+
nameserver 127.0.0.1
|
59
|
+
port #{port}
|
60
|
+
FILE
|
61
|
+
end
|
62
|
+
|
63
|
+
def resolver_folder
|
64
|
+
File.join(tmp_path, "resolver")
|
65
|
+
end
|
66
|
+
|
67
|
+
def ensure_deamon_env!
|
68
|
+
FileUtils.mkdir_p(File.join(tmp_path, "daemon"))
|
69
|
+
end
|
70
|
+
|
71
|
+
def config_file
|
72
|
+
File.join(tmp_path, "config")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module VagrantDNS
|
2
|
+
module Installers
|
3
|
+
class Mac
|
4
|
+
attr_accessor :tmp_path, :install_path
|
5
|
+
|
6
|
+
def initialize(tmp_path, install_path = "/etc/resolver")
|
7
|
+
self.tmp_path, self.install_path = tmp_path, install_path
|
8
|
+
end
|
9
|
+
|
10
|
+
def install!
|
11
|
+
require 'fileutils'
|
12
|
+
|
13
|
+
registered_resolvers.each do |r|
|
14
|
+
FileUtils.ln_s(registered_resolvers, "/etc/resolver", :force => true)
|
15
|
+
end
|
16
|
+
rescue Errno::EACCES => e
|
17
|
+
warn "vagrant-dns needs superuser access to manipulate DNS settings"
|
18
|
+
raise e
|
19
|
+
end
|
20
|
+
|
21
|
+
def uninstall!
|
22
|
+
require 'fileutils'
|
23
|
+
|
24
|
+
registered_resolvers.each do |r|
|
25
|
+
resolver = File.join("/etc/resolver", File.basename(r))
|
26
|
+
FileUtils.rm_f(resolver)
|
27
|
+
end
|
28
|
+
rescue Errno::EACCES => e
|
29
|
+
warn "vagrant-dns needs superuser access to manipulate DNS settings"
|
30
|
+
raise e
|
31
|
+
end
|
32
|
+
|
33
|
+
def registered_resolvers
|
34
|
+
Dir[File.join(tmp_path, "resolver", "*")]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,19 @@
|
|
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
|
+
if VagrantDNS::Config.auto_run
|
10
|
+
tmp_path = File.join(env[:vm].env.tmp_path, "dns")
|
11
|
+
VagrantDNS::Configurator.new(env[:vm], tmp_path).run!
|
12
|
+
VagrantDNS::Service.new(tmp_path).restart!
|
13
|
+
env[:ui].info "Restarted DNS Service"
|
14
|
+
end
|
15
|
+
|
16
|
+
@app.call(env)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module VagrantDNS
|
2
|
+
class Service
|
3
|
+
attr_accessor :tmp_path, :options
|
4
|
+
|
5
|
+
def initialize(tmp_path, options = {})
|
6
|
+
self.tmp_path = tmp_path
|
7
|
+
self.options = options
|
8
|
+
end
|
9
|
+
|
10
|
+
def start!
|
11
|
+
run_options = {:ARGV => ["start"]}.merge(options).merge(runopts)
|
12
|
+
run!(run_options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def stop!
|
16
|
+
run_options = {:ARGV => ["stop"]}.merge(options).merge(runopts)
|
17
|
+
run!(run_options)
|
18
|
+
end
|
19
|
+
|
20
|
+
def run!(run_options)
|
21
|
+
Daemons.run_proc("vagrant-dns", run_options) do
|
22
|
+
require 'rubydns'
|
23
|
+
|
24
|
+
registry = YAML.load(File.read(config_file))
|
25
|
+
|
26
|
+
RubyDNS::run_server(:listen => VagrantDNS::Config.listen) do
|
27
|
+
registry.each do |pattern, ip|
|
28
|
+
match(Regexp.new(pattern), :A) do |match_data, transaction|
|
29
|
+
transaction.respond!(ip)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def restart!
|
37
|
+
stop!
|
38
|
+
start!
|
39
|
+
end
|
40
|
+
|
41
|
+
def runopts
|
42
|
+
{:dir_mode => :normal,
|
43
|
+
:dir => File.join(tmp_path, "daemon"),
|
44
|
+
:log_output => true,
|
45
|
+
:log_dir => File.join(tmp_path, "daemon")}
|
46
|
+
end
|
47
|
+
|
48
|
+
def config_file
|
49
|
+
File.join(tmp_path, "config")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/vagrant-dns/version.rb
CHANGED
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: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-04-
|
12
|
+
date: 2012-04-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: vagrant
|
@@ -68,6 +68,7 @@ extensions: []
|
|
68
68
|
extra_rdoc_files: []
|
69
69
|
files:
|
70
70
|
- .gitignore
|
71
|
+
- CHANGELOG.md
|
71
72
|
- Gemfile
|
72
73
|
- LICENSE
|
73
74
|
- README.md
|
@@ -76,6 +77,10 @@ files:
|
|
76
77
|
- lib/vagrant-dns.rb
|
77
78
|
- lib/vagrant-dns/command.rb
|
78
79
|
- lib/vagrant-dns/config.rb
|
80
|
+
- lib/vagrant-dns/configurator.rb
|
81
|
+
- lib/vagrant-dns/installers/mac.rb
|
82
|
+
- lib/vagrant-dns/restart_middleware.rb
|
83
|
+
- lib/vagrant-dns/service.rb
|
79
84
|
- lib/vagrant-dns/version.rb
|
80
85
|
- lib/vagrant_init.rb
|
81
86
|
- vagrant-dns.gemspec
|