vagrant-rubydns 0.0.2 → 0.0.3
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/README.md +15 -5
- data/examples/Vagrantfile +3 -0
- data/lib/vagrant-rubydns.rb +1 -1
- data/lib/vagrant-rubydns/action/setup.rb +14 -5
- data/lib/vagrant-rubydns/action/teardown.rb +14 -5
- data/lib/vagrant-rubydns/config.rb +9 -27
- data/lib/vagrant-rubydns/plugin.rb +5 -0
- data/lib/vagrant-rubydns/provisioner.rb +0 -3
- data/lib/vagrant-rubydns/server.rb +2 -6
- data/lib/vagrant-rubydns/store.rb +37 -0
- data/lib/vagrant-rubydns/version.rb +1 -1
- data/test/test_helper.rb +1 -1
- data/test/vagrant-rubydns/action/setup_test.rb +3 -3
- data/test/vagrant-rubydns/action/teardown_test.rb +3 -3
- data/test/vagrant-rubydns/store_test.rb +49 -0
- metadata +4 -3
- data/test/vagrant-rubydns/config_test.rb +0 -49
data/README.md
CHANGED
@@ -21,16 +21,26 @@ Bring up a machine that has a private network IP address and a hostname (see the
|
|
21
21
|
|
22
22
|
$ vagrant up
|
23
23
|
|
24
|
-
And you should be able to get your hostname from
|
24
|
+
And you should be able to get your hostname from your host:
|
25
25
|
|
26
26
|
$ dig -p 10053 @localhost myhost.vagrant.dev
|
27
|
-
|
28
|
-
|
27
|
+
|
28
|
+
You can also make this visible to the guest by using the provisioner, which will set `resolv.conf` and `iptables` rules such that DNS points at our server:
|
29
|
+
|
30
|
+
config.vm.provision :rubydns
|
31
|
+
|
32
|
+
If you shut down your guest, the entries associated with it will be removed.
|
33
|
+
|
34
|
+
You can add static host entries to the DNS server in your Vagrantfile like so:
|
35
|
+
|
36
|
+
config.rubydns.host 'myhost.example.com', '1.2.3.4'
|
37
|
+
|
38
|
+
Any DNS queries that do not match will be passed through to an upstream DNS server, so this will be able to serve as the one-stop shop for your guests' DNS needs.
|
29
39
|
|
30
40
|
## Work in Progress - Lots to do!
|
31
41
|
|
32
|
-
*
|
33
|
-
* Lots of static values that need configurin' - config location, ports,
|
42
|
+
* The provisioner assumes resolv.conf-based DNS and iptables-based firewall.
|
43
|
+
* Lots of static values that need configurin' - config location, ports, etc.
|
34
44
|
* Tests tests tests.
|
35
45
|
|
36
46
|
## Contributing
|
data/examples/Vagrantfile
CHANGED
data/lib/vagrant-rubydns.rb
CHANGED
@@ -4,8 +4,8 @@ rescue LoadError
|
|
4
4
|
raise 'The Vagrant RubyDNS plugin must be run within Vagrant.'
|
5
5
|
end
|
6
6
|
|
7
|
-
require 'vagrant-rubydns/config'
|
8
7
|
require 'vagrant-rubydns/plugin'
|
8
|
+
require 'vagrant-rubydns/store'
|
9
9
|
require 'vagrant-rubydns/util'
|
10
10
|
require 'vagrant-rubydns/version'
|
11
11
|
|
@@ -6,13 +6,22 @@ module VagrantRubydns
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def call(env)
|
9
|
-
|
10
|
-
|
11
|
-
env
|
9
|
+
setup_machine_dns(env)
|
10
|
+
setup_static_dns(env)
|
11
|
+
@app.call(env)
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
+
def setup_machine_dns(env)
|
15
|
+
hostname, ip_address = Util.host_and_ip(env[:machine])
|
16
|
+
env[:ui].info "[rubydns] adding machine entry: #{hostname} => #{ip_address}"
|
17
|
+
Store.set(hostname, ip_address)
|
18
|
+
end
|
14
19
|
|
15
|
-
|
20
|
+
def setup_static_dns(env)
|
21
|
+
env[:global_config].rubydns.hosts.each do |hostname, ip_address|
|
22
|
+
env[:ui].info "[rubydns] adding static entry: #{hostname} => #{ip_address}"
|
23
|
+
Store.set hostname, ip_address
|
24
|
+
end
|
16
25
|
end
|
17
26
|
end
|
18
27
|
end
|
@@ -6,13 +6,22 @@ module VagrantRubydns
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def call(env)
|
9
|
-
|
10
|
-
|
11
|
-
env
|
9
|
+
teardown_static_dns(env)
|
10
|
+
teardown_machine_dns(env)
|
11
|
+
@app.call(env)
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
+
def teardown_machine_dns(env)
|
15
|
+
hostname = Util.hostname(env[:machine])
|
16
|
+
env[:ui].info "[rubydns] removing machine entry: #{hostname}"
|
17
|
+
Store.delete(hostname)
|
18
|
+
end
|
14
19
|
|
15
|
-
|
20
|
+
def teardown_static_dns(env)
|
21
|
+
env[:global_config].rubydns.hosts.each do |hostname, _|
|
22
|
+
env[:ui].info "[rubydns] removing static entry: #{hostname}"
|
23
|
+
Store.delete hostname
|
24
|
+
end
|
16
25
|
end
|
17
26
|
end
|
18
27
|
end
|
@@ -1,36 +1,18 @@
|
|
1
1
|
module VagrantRubydns
|
2
|
-
class Config
|
3
|
-
|
2
|
+
class Config < Vagrant.plugin('2', :config)
|
3
|
+
attr_accessor :hosts
|
4
4
|
|
5
|
-
def
|
6
|
-
|
5
|
+
def initialize
|
6
|
+
@hosts = {}
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
10
|
-
|
9
|
+
def host(hostname, ip_address)
|
10
|
+
@hosts[hostname] = ip_address
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
def self.clear!
|
18
|
-
write({})
|
19
|
-
end
|
20
|
-
|
21
|
-
protected
|
22
|
-
|
23
|
-
def self.current_config
|
24
|
-
if CONFIG_FILE.exist?
|
25
|
-
JSON.parse(File.read(CONFIG_FILE))
|
26
|
-
else
|
27
|
-
{}
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.write(config)
|
32
|
-
File.open(CONFIG_FILE, "w") do |f|
|
33
|
-
f.write(JSON.pretty_generate(config))
|
13
|
+
def merge(other)
|
14
|
+
super.tap do |result|
|
15
|
+
result.hosts = @hosts.merge(other.hosts)
|
34
16
|
end
|
35
17
|
end
|
36
18
|
end
|
@@ -8,9 +8,6 @@ module VagrantRubydns
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def provision
|
11
|
-
# hostname, ip_address = Util.host_and_ip(@machine)
|
12
|
-
# Config.set(hostname, ip_address)
|
13
|
-
|
14
11
|
@machine.env.ui.info "setting up machine's DNS to point to our server"
|
15
12
|
|
16
13
|
redirect_dns_to_unpriviledged_port_tcp = 'OUTPUT -t nat -d 10.0.2.2 -p tcp --dport 53 -j DNAT --to-destination 10.0.2.2:10053'
|
@@ -14,15 +14,11 @@ module VagrantRubydns
|
|
14
14
|
@upstream ||= RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]])
|
15
15
|
end
|
16
16
|
|
17
|
-
def self.configfile
|
18
|
-
Pathname('.vagrant_dns.json')
|
19
|
-
end
|
20
|
-
|
21
17
|
def self.run
|
22
18
|
server = self
|
23
19
|
RubyDNS::run_server(:listen => INTERFACES) do
|
24
|
-
match(
|
25
|
-
ip =
|
20
|
+
match(/.*/, IN::A) do |transaction|
|
21
|
+
ip = Store.get(transaction.name)
|
26
22
|
if ip
|
27
23
|
transaction.respond!(ip)
|
28
24
|
else
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module VagrantRubydns
|
2
|
+
class Store
|
3
|
+
STORE_FILE = Pathname('.vagrant_dns.json')
|
4
|
+
|
5
|
+
def self.set(key, value)
|
6
|
+
write(current_config.merge(key => value))
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.delete(key)
|
10
|
+
write(current_config.reject { |k, _| k == key })
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.get(key)
|
14
|
+
current_config[key]
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.clear!
|
18
|
+
write({})
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
def self.current_config
|
24
|
+
if STORE_FILE.exist?
|
25
|
+
JSON.parse(File.read(STORE_FILE))
|
26
|
+
else
|
27
|
+
{}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.write(config)
|
32
|
+
File.open(STORE_FILE, "w") do |f|
|
33
|
+
f.write(JSON.pretty_generate(config))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -8,7 +8,7 @@ require 'support/fake_ui'
|
|
8
8
|
require 'vagrant-rubydns'
|
9
9
|
|
10
10
|
# must be called before minitest/autorun to ensure proper at_exit ordering
|
11
|
-
MiniTest::Unit.after_tests { VagrantRubydns::
|
11
|
+
MiniTest::Unit.after_tests { VagrantRubydns::Store.clear! }
|
12
12
|
|
13
13
|
require 'minitest/autorun'
|
14
14
|
|
@@ -14,8 +14,8 @@ module VagrantRubydns
|
|
14
14
|
env[:called].must_equal true
|
15
15
|
end
|
16
16
|
|
17
|
-
it "stores the machine's hostname => ip address
|
18
|
-
|
17
|
+
it "stores the machine's hostname => ip address" do
|
18
|
+
Store.clear!
|
19
19
|
|
20
20
|
app = Proc.new {}
|
21
21
|
setup = Setup.new(app, nil)
|
@@ -23,7 +23,7 @@ module VagrantRubydns
|
|
23
23
|
env = fake_environment_with_machine('somehost.vagrant.dev', '1.2.3.4')
|
24
24
|
setup.call(env)
|
25
25
|
|
26
|
-
|
26
|
+
Store.get('somehost.vagrant.dev').must_equal '1.2.3.4'
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -14,8 +14,8 @@ module VagrantRubydns
|
|
14
14
|
env[:called].must_equal true
|
15
15
|
end
|
16
16
|
|
17
|
-
it "stores the machine's hostname => ip address
|
18
|
-
|
17
|
+
it "stores the machine's hostname => ip address" do
|
18
|
+
Store.set('somehost.vagrant.dev', '1.2.3.4')
|
19
19
|
|
20
20
|
app = Proc.new {}
|
21
21
|
teardown = Teardown.new(app, nil)
|
@@ -23,7 +23,7 @@ module VagrantRubydns
|
|
23
23
|
env = fake_environment_with_machine('somehost.vagrant.dev', '1.2.3.4')
|
24
24
|
teardown.call(env)
|
25
25
|
|
26
|
-
|
26
|
+
Store.get('somehost.vagrant.dev').must_equal nil
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module VagrantRubydns
|
4
|
+
describe Store do
|
5
|
+
before { Store.clear! }
|
6
|
+
|
7
|
+
describe "set" do
|
8
|
+
it "sets the key to the value and makes it available for getting" do
|
9
|
+
Store.set('foo', 'bar')
|
10
|
+
|
11
|
+
Store.get('foo').must_equal 'bar'
|
12
|
+
end
|
13
|
+
|
14
|
+
it "allows updating keys that already exist" do
|
15
|
+
Store.set('foo', 'bar')
|
16
|
+
Store.set('foo', 'qux')
|
17
|
+
|
18
|
+
Store.get('foo').must_equal 'qux'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "get" do
|
23
|
+
it "returns nil for unset values" do
|
24
|
+
Store.get('notakey').must_equal nil
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns the latest set value (no caching)" do
|
28
|
+
Store.set('foo', 'first')
|
29
|
+
Store.get('foo').must_equal 'first'
|
30
|
+
Store.set('foo', 'second')
|
31
|
+
Store.get('foo').must_equal 'second'
|
32
|
+
Store.delete('foo')
|
33
|
+
Store.get('foo').must_equal nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "delete" do
|
38
|
+
it "removes the key from the store" do
|
39
|
+
Store.set('now', 'you see me')
|
40
|
+
|
41
|
+
Store.get('now').must_equal 'you see me'
|
42
|
+
|
43
|
+
Store.delete('now')
|
44
|
+
|
45
|
+
Store.get('now').must_equal nil # you don't!
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-rubydns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -80,13 +80,14 @@ files:
|
|
80
80
|
- lib/vagrant-rubydns/plugin.rb
|
81
81
|
- lib/vagrant-rubydns/provisioner.rb
|
82
82
|
- lib/vagrant-rubydns/server.rb
|
83
|
+
- lib/vagrant-rubydns/store.rb
|
83
84
|
- lib/vagrant-rubydns/util.rb
|
84
85
|
- lib/vagrant-rubydns/version.rb
|
85
86
|
- test/support/fake_ui.rb
|
86
87
|
- test/test_helper.rb
|
87
88
|
- test/vagrant-rubydns/action/setup_test.rb
|
88
89
|
- test/vagrant-rubydns/action/teardown_test.rb
|
89
|
-
- test/vagrant-rubydns/
|
90
|
+
- test/vagrant-rubydns/store_test.rb
|
90
91
|
- vagrant-rubydns.gemspec
|
91
92
|
homepage: ''
|
92
93
|
licenses:
|
@@ -118,5 +119,5 @@ test_files:
|
|
118
119
|
- test/test_helper.rb
|
119
120
|
- test/vagrant-rubydns/action/setup_test.rb
|
120
121
|
- test/vagrant-rubydns/action/teardown_test.rb
|
121
|
-
- test/vagrant-rubydns/
|
122
|
+
- test/vagrant-rubydns/store_test.rb
|
122
123
|
has_rdoc:
|
@@ -1,49 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module VagrantRubydns
|
4
|
-
describe Config do
|
5
|
-
before { Config.clear! }
|
6
|
-
|
7
|
-
describe "set" do
|
8
|
-
it "sets the key to the value and makes it available for getting" do
|
9
|
-
Config.set('foo', 'bar')
|
10
|
-
|
11
|
-
Config.get('foo').must_equal 'bar'
|
12
|
-
end
|
13
|
-
|
14
|
-
it "allows updating keys that already exist" do
|
15
|
-
Config.set('foo', 'bar')
|
16
|
-
Config.set('foo', 'qux')
|
17
|
-
|
18
|
-
Config.get('foo').must_equal 'qux'
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe "get" do
|
23
|
-
it "returns nil for unset values" do
|
24
|
-
Config.get('notakey').must_equal nil
|
25
|
-
end
|
26
|
-
|
27
|
-
it "returns the latest set value (no caching)" do
|
28
|
-
Config.set('foo', 'first')
|
29
|
-
Config.get('foo').must_equal 'first'
|
30
|
-
Config.set('foo', 'second')
|
31
|
-
Config.get('foo').must_equal 'second'
|
32
|
-
Config.delete('foo')
|
33
|
-
Config.get('foo').must_equal nil
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe "delete" do
|
38
|
-
it "removes the key from the store" do
|
39
|
-
Config.set('now', 'you see me')
|
40
|
-
|
41
|
-
Config.get('now').must_equal 'you see me'
|
42
|
-
|
43
|
-
Config.delete('now')
|
44
|
-
|
45
|
-
Config.get('now').must_equal nil # you don't!
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|