vagrant-rubydns 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/Rakefile +10 -1
- data/{Vagrantfile → examples/Vagrantfile} +2 -2
- data/lib/vagrant-rubydns/action/setup.rb +3 -24
- data/lib/vagrant-rubydns/action/teardown.rb +3 -15
- data/lib/vagrant-rubydns/command.rb +0 -1
- data/lib/vagrant-rubydns/config.rb +37 -0
- data/lib/vagrant-rubydns/plugin.rb +5 -5
- data/lib/vagrant-rubydns/provisioner.rb +22 -10
- data/lib/vagrant-rubydns/server.rb +3 -11
- data/lib/vagrant-rubydns/util.rb +25 -0
- data/lib/vagrant-rubydns/version.rb +1 -1
- data/lib/vagrant-rubydns.rb +7 -7
- data/test/support/fake_ui.rb +4 -0
- data/test/test_helper.rb +38 -0
- data/test/vagrant-rubydns/action/setup_test.rb +30 -0
- data/test/vagrant-rubydns/action/teardown_test.rb +31 -0
- data/test/vagrant-rubydns/config_test.rb +49 -0
- metadata +15 -3
data/.gitignore
CHANGED
data/Rakefile
CHANGED
@@ -4,8 +4,8 @@
|
|
4
4
|
# If you're doing development and want to run this locally you can simply
|
5
5
|
# `bundle install`, then prefix all your vagrant commands with `bundle exec`, like so:
|
6
6
|
#
|
7
|
-
# bundle exec vagrant up
|
8
|
-
# bundle exce vagrant halt
|
7
|
+
# VAGRANT_CWD=examples bundle exec vagrant up
|
8
|
+
# VAGRANT_CWD=examples bundle exce vagrant halt
|
9
9
|
#
|
10
10
|
|
11
11
|
# This line is unnecessary when the plugin is installed normally; it's just
|
@@ -6,35 +6,14 @@ module VagrantRubydns
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def call(env)
|
9
|
-
|
9
|
+
hostname, ip_address = Util.host_and_ip(env[:machine])
|
10
10
|
|
11
|
-
|
11
|
+
env[:ui].info "setting #{hostname} to #{ip_address} in in DNS"
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
config[hostname] = ip_address
|
16
|
-
|
17
|
-
File.open(configfile, "w") do |f|
|
18
|
-
f.write(JSON.pretty_generate(config))
|
19
|
-
end
|
13
|
+
Config.set(hostname, ip_address)
|
20
14
|
|
21
15
|
@app.call(env)
|
22
16
|
end
|
23
|
-
|
24
|
-
def hostname
|
25
|
-
@env[:machine].config.vm.hostname
|
26
|
-
end
|
27
|
-
|
28
|
-
def ip_address
|
29
|
-
@env[:machine].config.vm.networks.each do |type, options|
|
30
|
-
if type == :private_network && options[:ip].is_a?(String)
|
31
|
-
return options[:ip]
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
nil
|
36
|
-
end
|
37
|
-
|
38
17
|
end
|
39
18
|
end
|
40
19
|
end
|
@@ -3,29 +3,17 @@ module VagrantRubydns
|
|
3
3
|
class Teardown
|
4
4
|
def initialize(app, env)
|
5
5
|
@app = app
|
6
|
-
puts "I AM RUBYDNS TEARDOWN init"
|
7
6
|
end
|
8
7
|
|
9
8
|
def call(env)
|
10
|
-
|
9
|
+
hostname = Util.hostname(env[:machine])
|
11
10
|
|
12
|
-
|
11
|
+
env[:ui].info "removing #{hostname} from DNS"
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
config.delete hostname
|
17
|
-
|
18
|
-
File.open(configfile, "w") do |f|
|
19
|
-
f.write(JSON.pretty_generate(config))
|
20
|
-
end
|
13
|
+
Config.delete(hostname)
|
21
14
|
|
22
15
|
@app.call(env)
|
23
16
|
end
|
24
|
-
|
25
|
-
def hostname
|
26
|
-
@env[:machine].config.vm.hostname
|
27
|
-
end
|
28
|
-
|
29
17
|
end
|
30
18
|
end
|
31
19
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module VagrantRubydns
|
2
|
+
class Config
|
3
|
+
CONFIG_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 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))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
module VagrantRubydns
|
2
2
|
class Plugin < Vagrant.plugin('2')
|
3
|
-
name
|
3
|
+
name 'vagrant-rubydns'
|
4
4
|
|
5
|
-
command
|
6
|
-
require_relative
|
5
|
+
command 'rubydns' do
|
6
|
+
require_relative 'command'
|
7
7
|
Command
|
8
8
|
end
|
9
9
|
|
10
|
-
provisioner
|
11
|
-
require_relative
|
10
|
+
provisioner 'rubydns' do
|
11
|
+
require_relative 'provisioner'
|
12
12
|
Provisioner
|
13
13
|
end
|
14
14
|
|
@@ -7,19 +7,31 @@ module VagrantRubydns
|
|
7
7
|
def configure(root_config)
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
10
|
+
def provision
|
11
|
+
# hostname, ip_address = Util.host_and_ip(@machine)
|
12
|
+
# Config.set(hostname, ip_address)
|
13
|
+
|
14
|
+
@machine.env.ui.info "setting up machine's DNS to point to our server"
|
15
15
|
|
16
|
-
|
17
|
-
|
16
|
+
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'
|
17
|
+
command = %Q(iptables -C #{redirect_dns_to_unpriviledged_port_tcp} 2> /dev/null || iptables -A #{redirect_dns_to_unpriviledged_port_tcp})
|
18
|
+
_run_command(command)
|
19
|
+
|
20
|
+
redirect_dns_to_unpriviledged_port_udp = 'OUTPUT -t nat -d 10.0.2.2 -p udp --dport 53 -j DNAT --to-destination 10.0.2.2:10053'
|
21
|
+
command = %Q(iptables -C #{redirect_dns_to_unpriviledged_port_udp} 2> /dev/null || iptables -A #{redirect_dns_to_unpriviledged_port_udp})
|
22
|
+
_run_command(command)
|
23
|
+
|
24
|
+
command = %q(sed -i'' -e 's/10.0.2.3/10.0.2.2/' /etc/resolv.conf)
|
25
|
+
_run_command(command)
|
18
26
|
end
|
19
27
|
|
20
|
-
def
|
21
|
-
|
22
|
-
|
28
|
+
def _run_command(command)
|
29
|
+
@machine.communicate.sudo(command) do |data, type|
|
30
|
+
if [:stderr, :stdout].include?(type)
|
31
|
+
color = (type == :stdout) ? :green : :red
|
32
|
+
@machine.env.ui.info(data.chomp, :color => color, :prefix => false)
|
33
|
+
end
|
34
|
+
end
|
23
35
|
end
|
24
36
|
end
|
25
37
|
end
|
@@ -18,21 +18,13 @@ module VagrantRubydns
|
|
18
18
|
Pathname('.vagrant_dns.json')
|
19
19
|
end
|
20
20
|
|
21
|
-
def self.entries
|
22
|
-
if configfile.exist?
|
23
|
-
JSON.parse(File.read('.vagrant_dns.json'))
|
24
|
-
else
|
25
|
-
{}
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
21
|
def self.run
|
30
|
-
# Start the RubyDNS server
|
31
22
|
server = self
|
32
23
|
RubyDNS::run_server(:listen => INTERFACES) do
|
33
24
|
match(/vagrant.dev/, IN::A) do |transaction|
|
34
|
-
|
35
|
-
|
25
|
+
ip = Config.get(transaction.name)
|
26
|
+
if ip
|
27
|
+
transaction.respond!(ip)
|
36
28
|
else
|
37
29
|
transaction.passthrough!(server.upstream)
|
38
30
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module VagrantRubydns
|
2
|
+
module Util
|
3
|
+
def self.host_and_ip(machine)
|
4
|
+
[hostname(machine), ip_address(machine)]
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.hostname(machine)
|
8
|
+
return nil unless machine
|
9
|
+
|
10
|
+
machine.config.vm.hostname
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.ip_address(machine)
|
14
|
+
return nil unless machine
|
15
|
+
|
16
|
+
machine.config.vm.networks.each do |type, options|
|
17
|
+
if type == :private_network && options[:ip].is_a?(String)
|
18
|
+
return options[:ip]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/vagrant-rubydns.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
begin
|
2
|
-
require
|
2
|
+
require 'vagrant'
|
3
3
|
rescue LoadError
|
4
|
-
raise
|
4
|
+
raise 'The Vagrant RubyDNS plugin must be run within Vagrant.'
|
5
5
|
end
|
6
6
|
|
7
|
-
require
|
8
|
-
require
|
9
|
-
|
10
|
-
|
11
|
-
end
|
7
|
+
require 'vagrant-rubydns/config'
|
8
|
+
require 'vagrant-rubydns/plugin'
|
9
|
+
require 'vagrant-rubydns/util'
|
10
|
+
require 'vagrant-rubydns/version'
|
12
11
|
|
12
|
+
module VagrantRubydns; end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
$:.push(File.expand_path('../../lib', __FILE__))
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'minitest/spec'
|
5
|
+
|
6
|
+
require 'support/fake_ui'
|
7
|
+
|
8
|
+
require 'vagrant-rubydns'
|
9
|
+
|
10
|
+
# must be called before minitest/autorun to ensure proper at_exit ordering
|
11
|
+
MiniTest::Unit.after_tests { VagrantRubydns::Config.clear! }
|
12
|
+
|
13
|
+
require 'minitest/autorun'
|
14
|
+
|
15
|
+
def fake_environment_with_machine(hostname, ip)
|
16
|
+
provider_cls = Class.new do
|
17
|
+
def initialize(machine)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
env = Vagrant::Environment.new
|
22
|
+
|
23
|
+
machine = Vagrant::Machine.new(
|
24
|
+
'fake_machine',
|
25
|
+
'fake_provider',
|
26
|
+
provider_cls,
|
27
|
+
'provider_config',
|
28
|
+
env.config_global,
|
29
|
+
Pathname('data_dir'),
|
30
|
+
'box',
|
31
|
+
env
|
32
|
+
)
|
33
|
+
|
34
|
+
machine.config.vm.hostname = hostname
|
35
|
+
machine.config.vm.network :private_network, ip: ip
|
36
|
+
|
37
|
+
{ machine: machine, ui: FakeUI }
|
38
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'vagrant-rubydns/action/setup'
|
3
|
+
|
4
|
+
module VagrantRubydns
|
5
|
+
module Action
|
6
|
+
describe Setup do
|
7
|
+
it "calls the next app in the chain" do
|
8
|
+
env = {called: false, ui: FakeUI}
|
9
|
+
app = lambda { |e| e[:called] = true }
|
10
|
+
|
11
|
+
setup = Setup.new(app, nil)
|
12
|
+
setup.call(env)
|
13
|
+
|
14
|
+
env[:called].must_equal true
|
15
|
+
end
|
16
|
+
|
17
|
+
it "stores the machine's hostname => ip address in the config" do
|
18
|
+
Config.clear!
|
19
|
+
|
20
|
+
app = Proc.new {}
|
21
|
+
setup = Setup.new(app, nil)
|
22
|
+
|
23
|
+
env = fake_environment_with_machine('somehost.vagrant.dev', '1.2.3.4')
|
24
|
+
setup.call(env)
|
25
|
+
|
26
|
+
Config.get('somehost.vagrant.dev').must_equal '1.2.3.4'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'vagrant-rubydns/action/teardown'
|
3
|
+
|
4
|
+
module VagrantRubydns
|
5
|
+
module Action
|
6
|
+
describe Teardown do
|
7
|
+
it "calls the next app in the chain" do
|
8
|
+
env = {called: false, ui: FakeUI}
|
9
|
+
app = lambda { |e| e[:called] = true }
|
10
|
+
|
11
|
+
teardown = Teardown.new(app, nil)
|
12
|
+
teardown.call(env)
|
13
|
+
|
14
|
+
env[:called].must_equal true
|
15
|
+
end
|
16
|
+
|
17
|
+
it "stores the machine's hostname => ip address in the config" do
|
18
|
+
Config.set('somehost.vagrant.dev', '1.2.3.4')
|
19
|
+
|
20
|
+
app = Proc.new {}
|
21
|
+
teardown = Teardown.new(app, nil)
|
22
|
+
|
23
|
+
env = fake_environment_with_machine('somehost.vagrant.dev', '1.2.3.4')
|
24
|
+
teardown.call(env)
|
25
|
+
|
26
|
+
Config.get('somehost.vagrant.dev').must_equal nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,49 @@
|
|
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
|
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.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -71,15 +71,22 @@ files:
|
|
71
71
|
- LICENSE.txt
|
72
72
|
- README.md
|
73
73
|
- Rakefile
|
74
|
-
- Vagrantfile
|
74
|
+
- examples/Vagrantfile
|
75
75
|
- lib/vagrant-rubydns.rb
|
76
76
|
- lib/vagrant-rubydns/action/setup.rb
|
77
77
|
- lib/vagrant-rubydns/action/teardown.rb
|
78
78
|
- lib/vagrant-rubydns/command.rb
|
79
|
+
- lib/vagrant-rubydns/config.rb
|
79
80
|
- lib/vagrant-rubydns/plugin.rb
|
80
81
|
- lib/vagrant-rubydns/provisioner.rb
|
81
82
|
- lib/vagrant-rubydns/server.rb
|
83
|
+
- lib/vagrant-rubydns/util.rb
|
82
84
|
- lib/vagrant-rubydns/version.rb
|
85
|
+
- test/support/fake_ui.rb
|
86
|
+
- test/test_helper.rb
|
87
|
+
- test/vagrant-rubydns/action/setup_test.rb
|
88
|
+
- test/vagrant-rubydns/action/teardown_test.rb
|
89
|
+
- test/vagrant-rubydns/config_test.rb
|
83
90
|
- vagrant-rubydns.gemspec
|
84
91
|
homepage: ''
|
85
92
|
licenses:
|
@@ -106,5 +113,10 @@ rubygems_version: 1.8.23
|
|
106
113
|
signing_key:
|
107
114
|
specification_version: 3
|
108
115
|
summary: a simple dns server for vagrant guests
|
109
|
-
test_files:
|
116
|
+
test_files:
|
117
|
+
- test/support/fake_ui.rb
|
118
|
+
- test/test_helper.rb
|
119
|
+
- test/vagrant-rubydns/action/setup_test.rb
|
120
|
+
- test/vagrant-rubydns/action/teardown_test.rb
|
121
|
+
- test/vagrant-rubydns/config_test.rb
|
110
122
|
has_rdoc:
|