vagrant-dns-server 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.rvmrc +1 -1
- data/Gemfile +2 -3
- data/Gemfile.lock +55 -3
- data/README.md +9 -0
- data/Rakefile +7 -0
- data/TODOS +5 -0
- data/bin/vagrant_dns +27 -2
- data/lib/vagrant_dns/configuration.rb +19 -0
- data/lib/vagrant_dns/consts.rb +2 -0
- data/lib/vagrant_dns/dns.rb +47 -0
- data/lib/vagrant_dns/middleware/network_binder.rb +46 -0
- data/lib/vagrant_dns/middleware/remove.rb +20 -0
- data/lib/{middleware → vagrant_dns/middleware}/update.rb +0 -0
- data/lib/vagrant_dns/port.rb +16 -0
- data/lib/vagrant_dns/resolver.rb +49 -0
- data/lib/vagrant_dns/server.rb +51 -0
- data/lib/vagrant_dns_plugin.rb +10 -0
- data/lib/vagrant_dns_server.rb +12 -0
- data/lib/vagrant_init.rb +5 -6
- data/lib/version.rb +1 -1
- data/templates/vagrant_dns.yaml +3 -0
- data/test/resolver_test.rb +52 -0
- data/vagrant-dns-server.gemspec +8 -1
- metadata +197 -94
- data/lib/constants.rb +0 -3
- data/lib/dns.rb +0 -47
- data/lib/middleware/network_binder.rb +0 -23
- data/lib/pub.ruby +0 -15
- data/lib/server.rb +0 -40
data/.gitignore
CHANGED
data/.rvmrc
CHANGED
@@ -1 +1 @@
|
|
1
|
-
rvm use 1.9.
|
1
|
+
rvm use ruby-1.9.2-p320@dns --create
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,20 +1,72 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
vagrant-dns-server (0.2)
|
5
|
+
em-zeromq
|
6
|
+
log4r
|
7
|
+
moneta
|
8
|
+
net-ping
|
9
|
+
rubydns
|
10
|
+
rubydns
|
11
|
+
thor
|
12
|
+
vagrant (~> 1.0.3)
|
13
|
+
zmq
|
14
|
+
|
1
15
|
GEM
|
2
16
|
remote: https://rubygems.org/
|
3
17
|
specs:
|
18
|
+
archive-tar-minitar (0.5.2)
|
19
|
+
childprocess (0.3.6)
|
20
|
+
ffi (~> 1.0, >= 1.0.6)
|
21
|
+
em-zeromq (0.4.1)
|
22
|
+
eventmachine (>= 1.0.0)
|
23
|
+
ffi (>= 1.0.0)
|
24
|
+
ffi-rzmq (= 0.9.7)
|
25
|
+
erubis (2.7.0)
|
4
26
|
eventmachine (1.0.0)
|
27
|
+
ffi (1.3.1)
|
28
|
+
ffi-rzmq (0.9.7)
|
29
|
+
ffi
|
30
|
+
i18n (0.6.1)
|
31
|
+
json (1.5.4)
|
32
|
+
log4r (1.1.10)
|
33
|
+
metaclass (0.0.1)
|
34
|
+
minitest (4.4.0)
|
35
|
+
mocha (0.12.8)
|
36
|
+
metaclass (~> 0.0.1)
|
37
|
+
moneta (0.7.6)
|
38
|
+
net-ldap (0.2.2)
|
39
|
+
net-ping (1.5.3)
|
40
|
+
ffi (>= 1.0.0)
|
41
|
+
net-ldap (~> 0.2.2)
|
42
|
+
net-scp (1.0.4)
|
43
|
+
net-ssh (>= 1.99.1)
|
44
|
+
net-ssh (2.2.2)
|
5
45
|
rainbow (1.1.4)
|
46
|
+
rake (10.0.3)
|
6
47
|
rexec (1.5.1)
|
7
48
|
rainbow
|
8
49
|
rubydns (0.5.3)
|
9
50
|
eventmachine (~> 1.0.0)
|
10
51
|
rexec (~> 1.5.1)
|
11
52
|
thor (0.16.0)
|
53
|
+
vagrant (1.0.5)
|
54
|
+
archive-tar-minitar (= 0.5.2)
|
55
|
+
childprocess (~> 0.3.1)
|
56
|
+
erubis (~> 2.7.0)
|
57
|
+
i18n (~> 0.6.0)
|
58
|
+
json (~> 1.5.1)
|
59
|
+
log4r (~> 1.1.9)
|
60
|
+
net-scp (~> 1.0.4)
|
61
|
+
net-ssh (~> 2.2.2)
|
12
62
|
zmq (2.1.4)
|
13
63
|
|
14
64
|
PLATFORMS
|
15
65
|
ruby
|
16
66
|
|
17
67
|
DEPENDENCIES
|
18
|
-
|
19
|
-
|
20
|
-
|
68
|
+
bundler
|
69
|
+
minitest
|
70
|
+
mocha (~> 0.12.3)
|
71
|
+
rake
|
72
|
+
vagrant-dns-server!
|
data/README.md
CHANGED
@@ -3,6 +3,15 @@ vagrant-dns enables easy dns management of multiple local Vagrant machines.
|
|
3
3
|
|
4
4
|
It composed from a Vagrant plugin and standalone dns server, the plugin auto registers the host and ip of the VM once it boots up making it available for lookup on both the host and guest machines.
|
5
5
|
|
6
|
+
Follow [this](https://www.youtube.com/watch?v=6GFobNDvwpI) this demo to see it in action.
|
7
|
+
|
8
|
+
# Install
|
9
|
+
|
10
|
+
```bash
|
11
|
+
$ sudo aptitude install libzmq1 libzmq-dev
|
12
|
+
$ gem install vagrant-dns-server
|
13
|
+
```
|
14
|
+
|
6
15
|
# Usage
|
7
16
|
|
8
17
|
Add the plugin to the project Gemfile, use vagrant_dns server to boot the local dns server
|
data/Rakefile
CHANGED
data/TODOS
ADDED
@@ -0,0 +1,5 @@
|
|
1
|
+
* Add 127.0.0.1 to resolve.conf on server startup, clear out on teardown ( See http://www.ubuntututorials.com/set-dns-server-ubuntu-12-04/)
|
2
|
+
* Add 10.0.2.2 to guest resolv.conf
|
3
|
+
* Implement remove ip on VM shutdown
|
4
|
+
* Enable remote api to the running server (listing, adding, removing)
|
5
|
+
* Consider adding a hardcoded list of host (useful for non vagrant machines)
|
data/bin/vagrant_dns
CHANGED
@@ -3,7 +3,31 @@
|
|
3
3
|
$:.push 'lib'
|
4
4
|
require 'rubygems'
|
5
5
|
require 'thor'
|
6
|
-
require '
|
6
|
+
require 'thor/group'
|
7
|
+
require 'vagrant_dns_server'
|
8
|
+
|
9
|
+
module VagrantDns
|
10
|
+
class Generate < Thor::Group
|
11
|
+
include Thor::Actions
|
12
|
+
|
13
|
+
argument :upstream, :type => :string, :desc => 'upstream dns server', :default => '8.8.8.8'
|
14
|
+
argument :zmq_url, :type => :string, :desc => 'zeromq connection url', :default => 'tcp://127.0.0.1:7005'
|
15
|
+
|
16
|
+
def self.source_root
|
17
|
+
# during dev time
|
18
|
+
if(File.dirname(__FILE__) == './bin')
|
19
|
+
File.dirname('.')
|
20
|
+
else
|
21
|
+
"#{File.dirname(__FILE__)}/../"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "generate DNS server settings files #{ENV['HOME']}/.vagrant_dns.yaml"
|
26
|
+
def create_yaml
|
27
|
+
template('templates/vagrant_dns.yaml', "#{ENV['HOME']}/.vagrant_dns.yaml")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
7
31
|
|
8
32
|
class Main < Thor
|
9
33
|
|
@@ -11,8 +35,9 @@ class Main < Thor
|
|
11
35
|
def server
|
12
36
|
@server = VagrantDns::Server.new
|
13
37
|
@server.process
|
14
|
-
trap("INT") { @server.shutdown;exit 0}
|
15
38
|
end
|
39
|
+
register VagrantDns::Generate, 'generate', 'generate [upstream dns (8.8.8.8)] [zmq url (tcp://127.0.0.1)]', 'Generate vagrant_dns configuration file'
|
40
|
+
|
16
41
|
end
|
17
42
|
|
18
43
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module VagrantDns
|
4
|
+
|
5
|
+
class Configuration
|
6
|
+
extend Forwardable
|
7
|
+
def_delegator :@store, :store, :set
|
8
|
+
def_delegator :@store, :load, :get
|
9
|
+
def_delegator :@store, :delete, :delete
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@store = Moneta.new(:YAML,:file => "#{ENV['HOME']}/.vagrant_dns.yaml")
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
CONF = VagrantDns::Configuration.new
|
@@ -0,0 +1,47 @@
|
|
1
|
+
|
2
|
+
UDNS = CONF.get('upstream_dns')
|
3
|
+
UPSTREAM = RubyDNS::Resolver.new([[:tcp, UDNS, 53], [:udp, UDNS, 53]])
|
4
|
+
|
5
|
+
module VagrantDns
|
6
|
+
|
7
|
+
class Registry
|
8
|
+
extend Forwardable
|
9
|
+
def_delegator :@store, :store, :register
|
10
|
+
def_delegator :@store, :load, :read
|
11
|
+
def_delegator :@store, :delete, :delete
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@store = Moneta.new(:YAML,:file => "hosts.yaml")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class DnsServer
|
19
|
+
def initialize
|
20
|
+
RubyDNS::run_server(:listen => [[:tcp, "localhost", 53],[:udp, "localhost", 53]]) do
|
21
|
+
on(:start) do
|
22
|
+
if ARGV.include?("--debug")
|
23
|
+
@logger.level = Logger::DEBUG
|
24
|
+
else
|
25
|
+
@logger.level = Logger::WARN
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
otherwise do |transaction|
|
31
|
+
ip = REG.read(transaction.name)
|
32
|
+
if(ip)
|
33
|
+
transaction.respond!(ip)
|
34
|
+
else
|
35
|
+
begin
|
36
|
+
transaction.passthrough!(UPSTREAM)
|
37
|
+
rescue Exception => e
|
38
|
+
puts e
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
REG = VagrantDns::Registry.new
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
require 'zmq'
|
3
|
+
|
4
|
+
module VagrantDns
|
5
|
+
|
6
|
+
UI = Vagrant::UI::Colored.new('dns')
|
7
|
+
class NetworkBinder
|
8
|
+
def bind(vm)
|
9
|
+
(host,ip) = host_ip(vm)
|
10
|
+
Status.new.report(host,ip,:up)
|
11
|
+
end
|
12
|
+
|
13
|
+
def unbind(vm)
|
14
|
+
(host,ip) = host_ip(vm)
|
15
|
+
Status.new.report(host,ip,:down)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def host_ip(vm)
|
20
|
+
networks = vm.config.vm.networks.find_all do |type,network_parameters|
|
21
|
+
type == :hostonly
|
22
|
+
end
|
23
|
+
ips = networks.map {|type,params| params.first}
|
24
|
+
host = vm.config.vm.host_name
|
25
|
+
[host,ips.first]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class Status
|
30
|
+
# if socket is created on middleware initialization vagrant will get stuck
|
31
|
+
def report(host,ip,status)
|
32
|
+
url = CONF.get('zmq_url')
|
33
|
+
if(port_open?('localhost',url.split(':')[-1]))
|
34
|
+
context = ZMQ::Context.new
|
35
|
+
pub = context.socket(ZMQ::PUB)
|
36
|
+
pub.connect(url)
|
37
|
+
UI.say(:debug,"connection made")
|
38
|
+
res = pub.send("#{CHANNEL} #{host} #{ip} #{status.to_s}", ZMQ::NOBLOCK)
|
39
|
+
UI.say(:info,"notifying dns server with #{status} status")
|
40
|
+
pub.close
|
41
|
+
else
|
42
|
+
UI.say(:debug,"dns server isn't up, skiping notifying #{status} status")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
module VagrantDns
|
3
|
+
module Middleware
|
4
|
+
class Remove
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
@app.call(env)
|
11
|
+
remove env[:vm] if env["vm"].created?
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
def remove(vm)
|
16
|
+
VagrantDns::NetworkBinder.new.unbind(vm)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
File without changes
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'socket'
|
2
|
+
require 'timeout'
|
3
|
+
|
4
|
+
# see http://stackoverflow.com/questions/517219/ruby-see-if-a-port-is-open
|
5
|
+
def port_open?(ip, port, seconds=1)
|
6
|
+
Timeout::timeout(seconds) do
|
7
|
+
begin
|
8
|
+
TCPSocket.new(ip, port).close
|
9
|
+
true
|
10
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
11
|
+
false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
rescue Timeout::Error
|
15
|
+
false
|
16
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
RESOLV = '/etc/resolv.conf'
|
5
|
+
LOCAL = "nameserver 127.0.0.1\n"
|
6
|
+
|
7
|
+
class Module
|
8
|
+
def redefine_const(name, value)
|
9
|
+
__send__(:remove_const, name) if const_defined?(name)
|
10
|
+
const_set(name, value)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def atomic_write(path, content)
|
15
|
+
temp_path = Tempfile.new(path)
|
16
|
+
File.open(temp_path, 'w+') do |f|
|
17
|
+
f.write(content)
|
18
|
+
end
|
19
|
+
FileUtils.mv(temp_path, path)
|
20
|
+
end
|
21
|
+
|
22
|
+
module VagrantDns
|
23
|
+
class ResolvConf
|
24
|
+
def append()
|
25
|
+
input = IO.readlines(RESOLV)
|
26
|
+
ns_pos = input.find_index do |line|
|
27
|
+
line.include?('nameserver')
|
28
|
+
end
|
29
|
+
|
30
|
+
if(!local_defined?(input,ns_pos))
|
31
|
+
head = (input.slice(0,ns_pos) << LOCAL)
|
32
|
+
tail = input.slice(ns_pos,input.size)
|
33
|
+
newconf = head.concat(tail).join('')
|
34
|
+
atomic_write(RESOLV,newconf)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def clear
|
39
|
+
input = IO.readlines(RESOLV)
|
40
|
+
cleaned = input.select{|line| !line.eql?(LOCAL)}.join('')
|
41
|
+
atomic_write(RESOLV,cleaned)
|
42
|
+
end
|
43
|
+
|
44
|
+
def local_defined?(input,pos)
|
45
|
+
input[pos].eql?(LOCAL.chomp)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module VagrantDns
|
2
|
+
class Server
|
3
|
+
def initialize
|
4
|
+
traps
|
5
|
+
@resolv = VagrantDns::ResolvConf.new
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
def unpack(message)
|
10
|
+
_, host, ip, msg = message.split ' ', 4
|
11
|
+
[host, ip, msg.to_sym]
|
12
|
+
end
|
13
|
+
|
14
|
+
def process
|
15
|
+
begin
|
16
|
+
# @resolv.append
|
17
|
+
zmq = EM::ZeroMQ::Context.new(1)
|
18
|
+
EM.run {
|
19
|
+
@dns = VagrantDns::DnsServer.new
|
20
|
+
puts "processing "
|
21
|
+
pull= zmq.socket(ZMQ::SUB)
|
22
|
+
pull.bind(CONF.get('zmq_url'))
|
23
|
+
pull.subscribe('vagrant')
|
24
|
+
pull.on(:message) { |part|
|
25
|
+
host, ip, stat= unpack(part.copy_out_string)
|
26
|
+
puts "[#{ip}->#{host}]: is #{stat.to_s}"
|
27
|
+
REG.register(host,ip) if :up.eql?(stat)
|
28
|
+
REG.delete(host) if :down.eql?(stat)
|
29
|
+
part.close
|
30
|
+
}
|
31
|
+
}
|
32
|
+
rescue => e
|
33
|
+
$stderr.puts e
|
34
|
+
$stderr.puts e.backtrace.join("\n")
|
35
|
+
shutdown
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def traps
|
40
|
+
%w(INT SIGINT TERM).each{|s|
|
41
|
+
Signal.trap(s) {shutdown}
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def shutdown
|
46
|
+
$stderr.puts "Cleaning up server"
|
47
|
+
# @resolv.clear
|
48
|
+
EM::stop()
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
require 'zmq'
|
3
|
+
# client
|
4
|
+
require 'moneta'
|
5
|
+
require 'vagrant_dns/consts'
|
6
|
+
require 'vagrant_dns/configuration'
|
7
|
+
require 'vagrant_dns/port'
|
8
|
+
require 'vagrant_dns/middleware/update'
|
9
|
+
require 'vagrant_dns/middleware/remove'
|
10
|
+
require 'vagrant_dns/middleware/network_binder'
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'em-zeromq'
|
2
|
+
require 'eventmachine'
|
3
|
+
require 'vagrant_dns/consts'
|
4
|
+
require 'vagrant_dns/resolver'
|
5
|
+
require 'moneta'
|
6
|
+
require 'forwardable'
|
7
|
+
require 'vagrant_dns/configuration'
|
8
|
+
require 'rubydns'
|
9
|
+
require 'vagrant_dns/dns'
|
10
|
+
require 'vagrant_dns/server'
|
11
|
+
|
12
|
+
|
data/lib/vagrant_init.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
require '
|
2
|
-
require 'constants'
|
3
|
-
require 'middleware/update'
|
4
|
-
require 'middleware/network_binder'
|
5
|
-
require 'zmq'
|
1
|
+
require 'vagrant_dns_plugin'
|
6
2
|
|
3
|
+
#see http://tinyurl.com/bfuawuj
|
7
4
|
Vagrant.actions[:provision].insert_after(Vagrant::Action::VM::Provision, VagrantDns::Middleware::Update)
|
8
|
-
Vagrant.actions[:start].insert_after(Vagrant::Action::VM::
|
5
|
+
Vagrant.actions[:start].insert_after(Vagrant::Action::VM::Boot, VagrantDns::Middleware::Update)
|
6
|
+
|
7
|
+
Vagrant.actions[:destroy].insert_after(Vagrant::Action::VM::ProvisionerCleanup, VagrantDns::Middleware::Remove)
|
9
8
|
|
data/lib/version.rb
CHANGED
@@ -0,0 +1,52 @@
|
|
1
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
2
|
+
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require 'resolver'
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
|
8
|
+
class Module
|
9
|
+
def redefine_const(name, value)
|
10
|
+
__send__(:remove_const, name) if const_defined?(name)
|
11
|
+
const_set(name, value)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
VANILA =<<H
|
16
|
+
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
|
17
|
+
# # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
|
18
|
+
nameserver 127.0.1.1
|
19
|
+
H
|
20
|
+
|
21
|
+
DIRTY =<<H
|
22
|
+
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
|
23
|
+
# # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
|
24
|
+
nameserver 127.0.0.1
|
25
|
+
nameserver 127.0.1.1
|
26
|
+
H
|
27
|
+
|
28
|
+
FAKED = '/tmp/resolv.conf'
|
29
|
+
|
30
|
+
class TestResolver < MiniTest::Unit::TestCase
|
31
|
+
|
32
|
+
def setup
|
33
|
+
Object.redefine_const(:RESOLV,FAKED)
|
34
|
+
File.open(FAKED, 'w') {|f| f.write(VANILA) }
|
35
|
+
@resolver = VagrantDns::ResolvConf.new
|
36
|
+
end
|
37
|
+
|
38
|
+
def teardown
|
39
|
+
FileUtils.rm FAKED
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_appeding
|
43
|
+
@resolver.append()
|
44
|
+
assert_equal File.open(FAKED,'r').read, DIRTY
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_clearing
|
48
|
+
@resolver.append()
|
49
|
+
@resolver.clear()
|
50
|
+
assert_equal File.open(FAKED,'r').read, VANILA
|
51
|
+
end
|
52
|
+
end
|
data/vagrant-dns-server.gemspec
CHANGED
@@ -17,9 +17,16 @@ Gem::Specification.new do |gem|
|
|
17
17
|
|
18
18
|
gem.add_dependency 'vagrant', '~>1.0.3'
|
19
19
|
gem.add_dependency 'rubydns'
|
20
|
-
gem.add_dependency '
|
20
|
+
gem.add_dependency 'em-zeromq'
|
21
|
+
gem.add_dependency 'zmq' # required by client
|
22
|
+
gem.add_dependency 'thor'
|
23
|
+
gem.add_dependency 'rubydns'
|
24
|
+
gem.add_dependency 'moneta'
|
25
|
+
gem.add_dependency 'net-ping'
|
26
|
+
gem.add_dependency 'log4r'
|
21
27
|
gem.add_development_dependency 'bundler'
|
22
28
|
gem.add_development_dependency 'mocha', '~>0.12.3'
|
23
29
|
gem.add_development_dependency 'rake'
|
30
|
+
gem.add_development_dependency 'minitest'
|
24
31
|
|
25
32
|
end
|
metadata
CHANGED
@@ -1,158 +1,261 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-dns-server
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 2
|
8
|
+
version: "0.2"
|
6
9
|
platform: ruby
|
7
|
-
authors:
|
10
|
+
authors:
|
8
11
|
- Ronen Narkis
|
9
12
|
autorequire:
|
10
13
|
bindir: bin
|
11
14
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
+
|
16
|
+
date: 2013-02-24 00:00:00 +02:00
|
17
|
+
default_executable:
|
18
|
+
dependencies:
|
19
|
+
- !ruby/object:Gem::Dependency
|
15
20
|
name: vagrant
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
21
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
22
|
none: false
|
18
|
-
requirements:
|
23
|
+
requirements:
|
19
24
|
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
segments:
|
27
|
+
- 1
|
28
|
+
- 0
|
29
|
+
- 3
|
21
30
|
version: 1.0.3
|
22
31
|
type: :runtime
|
23
32
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
|
26
|
-
requirements:
|
27
|
-
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 1.0.3
|
30
|
-
- !ruby/object:Gem::Dependency
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
31
35
|
name: rubydns
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
33
37
|
none: false
|
34
|
-
requirements:
|
35
|
-
- -
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
version: "0"
|
38
44
|
type: :runtime
|
39
45
|
prerelease: false
|
40
|
-
version_requirements:
|
46
|
+
version_requirements: *id002
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: em-zeromq
|
49
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
50
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
|
46
|
-
-
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 0
|
56
|
+
version: "0"
|
57
|
+
type: :runtime
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: *id003
|
60
|
+
- !ruby/object:Gem::Dependency
|
47
61
|
name: zmq
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
62
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 0
|
69
|
+
version: "0"
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: *id004
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: thor
|
75
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
49
76
|
none: false
|
50
|
-
requirements:
|
51
|
-
- -
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
segments:
|
81
|
+
- 0
|
82
|
+
version: "0"
|
54
83
|
type: :runtime
|
55
84
|
prerelease: false
|
56
|
-
version_requirements:
|
85
|
+
version_requirements: *id005
|
86
|
+
- !ruby/object:Gem::Dependency
|
87
|
+
name: rubydns
|
88
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
57
89
|
none: false
|
58
|
-
requirements:
|
59
|
-
- -
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
|
62
|
-
-
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
segments:
|
94
|
+
- 0
|
95
|
+
version: "0"
|
96
|
+
type: :runtime
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: *id006
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: moneta
|
101
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
102
|
+
none: false
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
segments:
|
107
|
+
- 0
|
108
|
+
version: "0"
|
109
|
+
type: :runtime
|
110
|
+
prerelease: false
|
111
|
+
version_requirements: *id007
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: net-ping
|
114
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
segments:
|
120
|
+
- 0
|
121
|
+
version: "0"
|
122
|
+
type: :runtime
|
123
|
+
prerelease: false
|
124
|
+
version_requirements: *id008
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: log4r
|
127
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
128
|
+
none: false
|
129
|
+
requirements:
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
segments:
|
133
|
+
- 0
|
134
|
+
version: "0"
|
135
|
+
type: :runtime
|
136
|
+
prerelease: false
|
137
|
+
version_requirements: *id009
|
138
|
+
- !ruby/object:Gem::Dependency
|
63
139
|
name: bundler
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
140
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
65
141
|
none: false
|
66
|
-
requirements:
|
67
|
-
- -
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
segments:
|
146
|
+
- 0
|
147
|
+
version: "0"
|
70
148
|
type: :development
|
71
149
|
prerelease: false
|
72
|
-
version_requirements:
|
73
|
-
|
74
|
-
requirements:
|
75
|
-
- - ! '>='
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: '0'
|
78
|
-
- !ruby/object:Gem::Dependency
|
150
|
+
version_requirements: *id010
|
151
|
+
- !ruby/object:Gem::Dependency
|
79
152
|
name: mocha
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
153
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
81
154
|
none: false
|
82
|
-
requirements:
|
155
|
+
requirements:
|
83
156
|
- - ~>
|
84
|
-
- !ruby/object:Gem::Version
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
segments:
|
159
|
+
- 0
|
160
|
+
- 12
|
161
|
+
- 3
|
85
162
|
version: 0.12.3
|
86
163
|
type: :development
|
87
164
|
prerelease: false
|
88
|
-
version_requirements:
|
89
|
-
|
90
|
-
requirements:
|
91
|
-
- - ~>
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: 0.12.3
|
94
|
-
- !ruby/object:Gem::Dependency
|
165
|
+
version_requirements: *id011
|
166
|
+
- !ruby/object:Gem::Dependency
|
95
167
|
name: rake
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
168
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
97
169
|
none: false
|
98
|
-
requirements:
|
99
|
-
- -
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
segments:
|
174
|
+
- 0
|
175
|
+
version: "0"
|
102
176
|
type: :development
|
103
177
|
prerelease: false
|
104
|
-
version_requirements:
|
178
|
+
version_requirements: *id012
|
179
|
+
- !ruby/object:Gem::Dependency
|
180
|
+
name: minitest
|
181
|
+
requirement: &id013 !ruby/object:Gem::Requirement
|
105
182
|
none: false
|
106
|
-
requirements:
|
107
|
-
- -
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
|
183
|
+
requirements:
|
184
|
+
- - ">="
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
segments:
|
187
|
+
- 0
|
188
|
+
version: "0"
|
189
|
+
type: :development
|
190
|
+
prerelease: false
|
191
|
+
version_requirements: *id013
|
110
192
|
description: A vagrant plugin to automanage dns registration on local machine
|
111
|
-
email:
|
193
|
+
email:
|
112
194
|
- narkisr@gmail.com
|
113
|
-
executables:
|
195
|
+
executables:
|
114
196
|
- vagrant_dns
|
115
197
|
extensions: []
|
198
|
+
|
116
199
|
extra_rdoc_files: []
|
117
|
-
|
200
|
+
|
201
|
+
files:
|
118
202
|
- .gitignore
|
119
203
|
- .rvmrc
|
120
204
|
- Gemfile
|
121
205
|
- Gemfile.lock
|
122
206
|
- README.md
|
123
207
|
- Rakefile
|
208
|
+
- TODOS
|
124
209
|
- bin/vagrant_dns
|
125
|
-
- lib/
|
126
|
-
- lib/
|
127
|
-
- lib/
|
128
|
-
- lib/middleware/
|
129
|
-
- lib/
|
130
|
-
- lib/
|
210
|
+
- lib/vagrant_dns/configuration.rb
|
211
|
+
- lib/vagrant_dns/consts.rb
|
212
|
+
- lib/vagrant_dns/dns.rb
|
213
|
+
- lib/vagrant_dns/middleware/network_binder.rb
|
214
|
+
- lib/vagrant_dns/middleware/remove.rb
|
215
|
+
- lib/vagrant_dns/middleware/update.rb
|
216
|
+
- lib/vagrant_dns/port.rb
|
217
|
+
- lib/vagrant_dns/resolver.rb
|
218
|
+
- lib/vagrant_dns/server.rb
|
219
|
+
- lib/vagrant_dns_plugin.rb
|
220
|
+
- lib/vagrant_dns_server.rb
|
131
221
|
- lib/vagrant_init.rb
|
132
222
|
- lib/version.rb
|
223
|
+
- templates/vagrant_dns.yaml
|
224
|
+
- test/resolver_test.rb
|
133
225
|
- vagrant-dns-server.gemspec
|
226
|
+
has_rdoc: true
|
134
227
|
homepage: https://github.com/narkisr/vagrant-dns
|
135
228
|
licenses: []
|
229
|
+
|
136
230
|
post_install_message:
|
137
231
|
rdoc_options: []
|
138
|
-
|
232
|
+
|
233
|
+
require_paths:
|
139
234
|
- lib
|
140
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
235
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
141
236
|
none: false
|
142
|
-
requirements:
|
143
|
-
- -
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
|
146
|
-
|
237
|
+
requirements:
|
238
|
+
- - ">="
|
239
|
+
- !ruby/object:Gem::Version
|
240
|
+
hash: 3949929053861366492
|
241
|
+
segments:
|
242
|
+
- 0
|
243
|
+
version: "0"
|
244
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
245
|
none: false
|
148
|
-
requirements:
|
149
|
-
- -
|
150
|
-
- !ruby/object:Gem::Version
|
151
|
-
|
246
|
+
requirements:
|
247
|
+
- - ">="
|
248
|
+
- !ruby/object:Gem::Version
|
249
|
+
hash: 3949929053861366492
|
250
|
+
segments:
|
251
|
+
- 0
|
252
|
+
version: "0"
|
152
253
|
requirements: []
|
254
|
+
|
153
255
|
rubyforge_project:
|
154
|
-
rubygems_version: 1.
|
256
|
+
rubygems_version: 1.3.7.1
|
155
257
|
signing_key:
|
156
258
|
specification_version: 3
|
157
259
|
summary: A vagrant plugin that sets up a local dns server
|
158
|
-
test_files:
|
260
|
+
test_files:
|
261
|
+
- test/resolver_test.rb
|
data/lib/constants.rb
DELETED
data/lib/dns.rb
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'rubydns'
|
2
|
-
|
3
|
-
HOSTS = Hash[%w(jenkins artifactory x2.takadu.com).zip(15..17)]
|
4
|
-
IN = Resolv::DNS::Resource::IN
|
5
|
-
UPSTREAM = RubyDNS::Resolver.new([[:tcp, "8.8.8.8", 53]])
|
6
|
-
|
7
|
-
module VagrantDns
|
8
|
-
|
9
|
-
class Registry
|
10
|
-
def initialize
|
11
|
-
@reg = {}
|
12
|
-
end
|
13
|
-
def register(host,ip)
|
14
|
-
@reg[host] = ip
|
15
|
-
end
|
16
|
-
|
17
|
-
def unregister(host)
|
18
|
-
@reg[host] = nil
|
19
|
-
end
|
20
|
-
|
21
|
-
def read(host)
|
22
|
-
@reg[host]
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
class DnsServer
|
27
|
-
def initialize
|
28
|
-
RubyDNS::run_server(:listen => [[:tcp, "localhost", 53]]) do
|
29
|
-
otherwise do |transaction|
|
30
|
-
ip = REG.read(transaction.name)
|
31
|
-
if(ip)
|
32
|
-
transaction.respond!(ip)
|
33
|
-
else
|
34
|
-
puts "not found moving to UPSTREAM"
|
35
|
-
begin
|
36
|
-
transaction.passthrough!(UPSTREAM)
|
37
|
-
rescue Exception => e
|
38
|
-
puts e
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
REG = VagrantDns::Registry.new
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module VagrantDns
|
2
|
-
class NetworkBinder
|
3
|
-
def bind(vm)
|
4
|
-
networks = vm.config.vm.networks.find_all do |type,network_parameters|
|
5
|
-
type == :hostonly
|
6
|
-
end
|
7
|
-
ips = networks.map {|type,params| params.first}
|
8
|
-
host = vm.config.vm.host_name
|
9
|
-
Status.new.up(host,ips.first)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
class Status
|
13
|
-
# if socket is created on middleware initialization vagrant will get stuck
|
14
|
-
def up(host,ip)
|
15
|
-
context = ZMQ::Context.new
|
16
|
-
pub = context.socket ZMQ::PUB
|
17
|
-
puts "connecting to #{URL}"
|
18
|
-
pub.connect URL
|
19
|
-
pub.send "#{CHANNEL} #{host} #{ip} up"
|
20
|
-
pub.close
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/lib/pub.ruby
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
# pub.rb
|
2
|
-
require 'zmq'
|
3
|
-
|
4
|
-
context = ZMQ::Context.new
|
5
|
-
chan = ARGV[0]
|
6
|
-
user = ARGV[1]
|
7
|
-
pub = context.socket ZMQ::PUB
|
8
|
-
# pub.bind 'ipc:///tmp/2'
|
9
|
-
pub.connect 'tcp://127.0.0.1:5004'
|
10
|
-
|
11
|
-
while msg = STDIN.gets
|
12
|
-
msg.strip!
|
13
|
-
pub.send "#{chan} #{user} #{msg}"
|
14
|
-
end
|
15
|
-
|
data/lib/server.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'zmq'
|
2
|
-
require 'constants'
|
3
|
-
require 'dns'
|
4
|
-
require 'eventmachine'
|
5
|
-
|
6
|
-
module VagrantDns
|
7
|
-
class Server
|
8
|
-
def initialize
|
9
|
-
context = ZMQ::Context.new
|
10
|
-
@sub = context.socket ZMQ::SUB
|
11
|
-
puts "binding to #{URL}"
|
12
|
-
@sub.bind URL
|
13
|
-
@sub.setsockopt ZMQ::SUBSCRIBE, CHANNEL
|
14
|
-
end
|
15
|
-
|
16
|
-
def process
|
17
|
-
Thread.new {
|
18
|
-
@dns = VagrantDns::DnsServer.new
|
19
|
-
}
|
20
|
-
puts "processing "
|
21
|
-
begin
|
22
|
-
while line = @sub.recv
|
23
|
-
chan, host, ip, msg = line.split ' ', 4
|
24
|
-
puts "#{chan} [#{ip}->#{host}]: is #{msg}"
|
25
|
-
REG.register(host,ip)
|
26
|
-
end
|
27
|
-
catch Execption => e
|
28
|
-
$stderr.puts e
|
29
|
-
rescue
|
30
|
-
shutdown
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def shutdown
|
35
|
-
$stderr.puts "Cleaning up server"
|
36
|
-
@sub.close
|
37
|
-
EM::stop()
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|