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 CHANGED
@@ -1 +1,2 @@
1
1
  pkg
2
+ hosts.yaml
data/.rvmrc CHANGED
@@ -1 +1 @@
1
- rvm use 1.9.3@dns --create
1
+ rvm use ruby-1.9.2-p320@dns --create
data/Gemfile CHANGED
@@ -1,6 +1,5 @@
1
1
  # A sample Gemfile
2
2
  source "https://rubygems.org"
3
3
 
4
- gem 'rubydns'
5
- gem 'zmq'
6
- gem 'thor'
4
+ gemspec :development_group => :dev
5
+
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
- rubydns
19
- thor
20
- zmq
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
@@ -1 +1,8 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.pattern = "test/*_test.rb"
7
+ t.verbose = true
8
+ end
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 'server'
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,2 @@
1
+
2
+ CHANNEL = 'vagrant'
@@ -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
@@ -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 'vagrant'
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::Provision, VagrantDns::Middleware::Update)
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
@@ -1,3 +1,3 @@
1
1
  module VagrantDns
2
- VERSION=0.1
2
+ VERSION=0.2
3
3
  end
@@ -0,0 +1,3 @@
1
+ ---
2
+ upstream_dns: <%=upstream%>
3
+ zmq_url: <%=zmq_url%>
@@ -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
@@ -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 'zmq'
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
- version: '0.1'
5
- prerelease:
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
- date: 2013-01-09 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
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: !ruby/object:Gem::Requirement
25
- none: false
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
- version: '0'
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: !ruby/object:Gem::Requirement
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
- version: '0'
46
- - !ruby/object:Gem::Dependency
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
- version: '0'
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: !ruby/object:Gem::Requirement
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
- version: '0'
62
- - !ruby/object:Gem::Dependency
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
- version: '0'
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: !ruby/object:Gem::Requirement
73
- none: false
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: !ruby/object:Gem::Requirement
89
- none: false
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
- version: '0'
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: !ruby/object:Gem::Requirement
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
- version: '0'
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
- files:
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/constants.rb
126
- - lib/dns.rb
127
- - lib/middleware/network_binder.rb
128
- - lib/middleware/update.rb
129
- - lib/pub.ruby
130
- - lib/server.rb
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
- require_paths:
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
- version: '0'
146
- required_rubygems_version: !ruby/object:Gem::Requirement
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
- version: '0'
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.8.24
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
@@ -1,3 +0,0 @@
1
-
2
- URL = 'tcp://127.0.0.1:7005'
3
- CHANNEL = 'vagrant'
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