vagrant-dnsmasq 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5111a30318f9e218273d6d70c080a1c554d1b12f
4
- data.tar.gz: 8ebdd313a4e50a4b3841daf7977bc0eb6a1cfa21
3
+ metadata.gz: 835c9917b38e165f4a5b04c593c11d8ad88c1b45
4
+ data.tar.gz: 2a0dd01d6baafd68a189d3526f4db622c839d53f
5
5
  SHA512:
6
- metadata.gz: db23f6b1a476394f7ce76ce1490a248a6b311dee0cc6b0ec908a2863b544185160f624ef5d5c72238c7fb4c1ee575b41821ec9fa963b751187402a572e5031e6
7
- data.tar.gz: 1dbaf62f3975b08541220fa470dfed587ac8e72dd32e3e0033a5de6d9dbcfb15fd1b22756072cb098f8bc2ad07693210bed47c5e8b440295abb102370e7b4ef8
6
+ metadata.gz: f5918efdad10112169ddae03bbb89b23f2cdd7805336867a196ffb0a69817e49fa8f6d12fa7fcade4bacf8a527cbe69adc35f0a4cdc9329621745e7f9c651795
7
+ data.tar.gz: e62960e4ec379a5302b204d3f3ab35911094d32fb85214b4810adafbb5b76ea8c810776e8fbcf31507aba21f65eaf278c237df467347d1953c04f0c4ce3effb3
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ script: "rspec test/*.spec.rb"
data/Gemfile.lock CHANGED
@@ -15,13 +15,14 @@ GIT
15
15
  PATH
16
16
  remote: .
17
17
  specs:
18
- vagrant-dnsmasq (0.0.5)
18
+ vagrant-dnsmasq (0.0.6)
19
19
 
20
20
  GEM
21
21
  remote: https://rubygems.org/
22
22
  specs:
23
23
  childprocess (0.3.9)
24
24
  ffi (~> 1.0, >= 1.0.11)
25
+ diff-lcs (1.2.4)
25
26
  erubis (2.7.0)
26
27
  ffi (1.9.0)
27
28
  i18n (0.6.4)
@@ -31,6 +32,14 @@ GEM
31
32
  net-ssh (>= 2.6.5)
32
33
  net-ssh (2.6.7)
33
34
  rake (10.1.0)
35
+ rspec (2.13.0)
36
+ rspec-core (~> 2.13.0)
37
+ rspec-expectations (~> 2.13.0)
38
+ rspec-mocks (~> 2.13.0)
39
+ rspec-core (2.13.1)
40
+ rspec-expectations (2.13.0)
41
+ diff-lcs (>= 1.1.3, < 2.0)
42
+ rspec-mocks (2.13.1)
34
43
 
35
44
  PLATFORMS
36
45
  ruby
@@ -38,5 +47,6 @@ PLATFORMS
38
47
  DEPENDENCIES
39
48
  bundler (~> 1.3)
40
49
  rake
50
+ rspec
41
51
  vagrant!
42
52
  vagrant-dnsmasq!
data/README.md CHANGED
@@ -1,12 +1,14 @@
1
- vagrant-dnsmasq
2
- ===============
1
+ # vagrant-dnsmasq [![Build Status](https://travis-ci.org/mattes/vagrant-dnsmasq.png?branch=master)](https://travis-ci.org/mattes/vagrant-dnsmasq)
3
2
 
4
3
  A Dnsmasq Vagrant plugin that manages the dnsmasq.conf file and /etc/resolver directory on your host system.
5
4
 
6
5
  ## Prerequisites
7
- * Mac OS X Mountain Lion
8
- * [brew](http://mxcl.github.io/homebrew/)
9
- * [Dnsmasq](http://www.thekelleys.org.uk/dnsmasq/doc.html) ```brew install dnsmasq```
6
+ * [Vagrant](http://www.vagrantup.com)
7
+ * [Dnsmasq](http://www.thekelleys.org.uk/dnsmasq/doc.html)
8
+
9
+ Easily install dnsmasq with [brew](http://mxcl.github.io/homebrew/) under Mac OS:
10
+ ```brew install dnsmasq```
11
+
10
12
 
11
13
  ## Installation
12
14
  ```
@@ -15,19 +17,36 @@ vagrant plugin install vagrant-dnsmasq
15
17
 
16
18
  ## Usage
17
19
  in your Vagrantfile
18
- ```
19
- # dnsmasq ...
20
+ ```ruby
21
+ # set domain ending (required)
22
+ # adding this line enables dnsmasq handling
23
+ config.dnsmasq.domain = '.dev'
20
24
 
21
- # enable dnsmasq?
22
- # set to false or delete line to disable dnsmasq handling
23
- config.dnsmasq.enable = true
24
25
 
25
- # set domain ending
26
- config.dnsmasq.domain = '.dev'
26
+ # optional configuration ...
27
27
 
28
28
  # this plugin runs 'hostname -I' on the guest machine to obtain
29
- # the guest ip address. you could overwrite the ip here. optional.
29
+ # the guest ip address. you can overwrite this behaviour.
30
30
  # config.dnsmasq.ip = '192.168.59.100'
31
+
32
+ # config.dnsmasq.ip = proc do |guest_machine|
33
+ # guest_machine.communicate.sudo("command to obtain ip somehow") do |type, data|
34
+ # # return something like '192.168.59.100' or ['192.168.59.100', '192.168.59.103']
35
+ # end
36
+ # end
37
+
38
+ # this will prompt you during 'vagrant up' to choose an IP
39
+ # config.dnsmasq.ip = ['192.168.59.100', '192.168.59.103']
40
+
41
+ # overwrite default location for /etc/resolver directory
42
+ # config.dnsmasq.resolver = '/etc/resolver'
43
+
44
+ # overwrite default location for /usr/local/etc/dnsmasq.conf
45
+ # brew_prefix = `brew --prefix`.strip
46
+ # config.dnsmasq.dnsmasqconf = brew_prefix + '/etc/dnsmasq.conf'
47
+
48
+ # disable dnsmasq handling
49
+ # config.dnsmasq.disable = true
31
50
  ```
32
51
 
33
52
  ## Uninstall
data/Rakefile CHANGED
@@ -6,6 +6,11 @@ task :default do
6
6
  system 'rake -T'
7
7
  end
8
8
 
9
+ desc "run tests"
10
+ task :test do
11
+ system 'rspec test/*.spec.rb'
12
+ end
13
+
9
14
  desc "tag this version and rake release"
10
15
  task :publish do
11
16
  lib = File.expand_path('../lib', __FILE__)
@@ -3,55 +3,65 @@ module Vagrant
3
3
 
4
4
  class Up
5
5
  def initialize(app, env)
6
- inc_path = Pathname.new(File.expand_path("../includes", __FILE__))
7
- require inc_path.join("Domain.class.rb")
8
- require inc_path.join("Ip.class.rb")
9
- require inc_path.join("Dnsmasq.class.rb")
10
- require inc_path.join("Resolver.class.rb")
11
- require inc_path.join("helper.rb")
12
-
13
6
  @app = app
14
7
  @machine = env[:machine]
15
- @ip = []
8
+ @ips = nil
16
9
  end
17
10
 
18
11
  def call(env)
19
12
  if @machine.config.dnsmasq.enabled?
13
+ # env[:ui].info "Dnsmasq handler actived"
14
+
15
+ @ip = @machine.config.dnsmasq.ip
16
+
17
+ # is a proc?
18
+ if @ip.is_a? Proc
19
+ ips = @ip.call(@machine)
20
+ ips = [ips] unless ips.is_a? Array
21
+ ips.map!{|ip| begin Ip.new(ip) rescue nil end}.compact! # dismiss invalid ips
22
+ @ip = ips
23
+ end
20
24
 
21
- # overwrite ip with value from config?
22
- @ip = @machine.config.dnsmasq.ip if @machine.config.dnsmasq.ip.count > 0
23
-
24
-
25
- # ... or try to fetch it from guest system
26
- if @ip.count === 0
27
- @machine.communicate.sudo("hostname -I") do |type, data|
28
- @ip = data.scan /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/
25
+ if @ip.is_a?(Array) && @ip.count > 0
26
+ # @ip is an array with domain instances ...
27
+
28
+ if @ip.count > 1
29
+ # prompt: choose ip
30
+ ask = true
31
+ while(ask)
32
+ env[:ui].info "Dnsmasq handler asks: Which IP would you like to use?"
33
+ i = 0
34
+ @ip.each do |ip|
35
+ i += 1
36
+ env[:ui].info "(#{i}) #{ip.v4}"
37
+ end
38
+ env[:ui].info "Please type number [1-#{i}]: "
39
+ answer = $stdin.gets.strip.to_i - 1
40
+ use_ip = @ip.at(answer)
41
+ ask = false unless use_ip.nil?
42
+ end
43
+
44
+ else
45
+ use_ip = @ip[0]
29
46
  end
30
- @ip.map!{|ip| begin Ip.new(ip) rescue nil end}.compact!
31
- end
32
47
 
33
- # is there a ip?
34
- if @ip.count > 0
48
+ # use ip to update dnsmasq.conf and /etc/resolver
35
49
 
36
50
  # update dnsmasq.conf
37
- brew_prefix = `brew --prefix`
38
- brew_prefix.strip!
39
- dnsmasq_conf_file = brew_prefix + "/etc/dnsmasq.conf"
40
-
41
- dnsmasq = DnsmasqConf.new(dnsmasq_conf_file)
42
- @ip.each do |ip|
43
- dnsmasq.insert(@machine.config.dnsmasq.domain, ip)
44
- end
51
+ dnsmasq = DnsmasqConf.new(@machine.config.dnsmasq.dnsmasqconf)
52
+ dnsmasq.insert(@machine.config.dnsmasq.domain, use_ip)
45
53
 
46
54
  # update /etc/resolver
47
- resolver = Resolver.new('/etc/resolver')
48
- @ip.each do |ip|
49
- resolver.insert(@machine.config.dnsmasq.domain, ip)
50
- end
55
+ resolver = Resolver.new(@machine.config.dnsmasq.resolver, true) # true for sudo
56
+ resolver.insert(@machine.config.dnsmasq.domain, use_ip)
51
57
 
52
- env[:ui].info "Added domain #{@machine.config.dnsmasq.domain} for IP #{@ip}"
53
- @app.call(env)
58
+ env[:ui].success "Dnsmasq handler set IP '#{use_ip}' for domain '#{@machine.config.dnsmasq.domain.dotted}'"
59
+
60
+ else
61
+ env[:ui].warn "Dnsmasq handler was not able to determine an IP address"
54
62
  end
63
+
64
+ @app.call(env)
55
65
  end
56
66
  end
57
67
  end
@@ -59,19 +69,27 @@ module Vagrant
59
69
 
60
70
  class Destroy
61
71
  def initialize(app, env)
62
- inc_path = Pathname.new(File.expand_path("../includes", __FILE__))
63
- require inc_path.join("Domain.class.rb")
64
- require inc_path.join("Ip.class.rb")
65
- require inc_path.join("Dnsmasq.class.rb")
66
- require inc_path.join("Resolver.class.rb")
67
- require inc_path.join("helper.rb")
68
-
69
72
  @app = app
73
+ @machine = env[:machine]
70
74
  end
71
75
 
72
76
  def call(env)
73
- # @todo delete from dnsmasq.conf and /etc/resolver
74
- @app.call(env)
77
+ if @machine.config.dnsmasq.enabled?
78
+
79
+ # remove records from dnsmasq.conf and /etc/resolver
80
+
81
+ # update dnsmasq.conf
82
+ dnsmasq = DnsmasqConf.new(@machine.config.dnsmasq.dnsmasqconf)
83
+ dnsmasq.delete(@machine.config.dnsmasq.domain)
84
+
85
+ # update /etc/resolver
86
+ resolver = Resolver.new(@machine.config.dnsmasq.resolver, true) # true for sudo
87
+ resolver.delete(@machine.config.dnsmasq.domain)
88
+
89
+ env[:ui].success "Dnsmasq handler removed domain '#{@machine.config.dnsmasq.domain}'"
90
+
91
+ @app.call(env)
92
+ end
75
93
  end
76
94
  end
77
95
 
@@ -2,34 +2,81 @@ module Vagrant
2
2
  module Dnsmasq
3
3
  class Config < Vagrant.plugin("2", :config)
4
4
 
5
- attr_accessor :enable
6
5
  attr_accessor :domain
7
6
  attr_accessor :ip
8
-
9
- alias_method :enabled?, :enable
7
+ attr_accessor :resolver
8
+ attr_accessor :dnsmasqconf
9
+ attr_accessor :disable
10
10
 
11
11
  def initialize
12
- inc_path = Pathname.new(File.expand_path("../includes", __FILE__))
13
- require inc_path.join("Domain.class.rb")
14
- require inc_path.join("Ip.class.rb")
15
-
16
- @enable = UNSET_VALUE
17
12
  @domain = UNSET_VALUE
18
13
  @ip = UNSET_VALUE
14
+ @resolver = UNSET_VALUE
15
+ @dnsmasqconf = UNSET_VALUE
16
+ @disable = UNSET_VALUE
19
17
  end
20
18
 
21
19
  def finalize!
22
- @enable = false if @enable == UNSET_VALUE
23
20
  @domain = nil if @domain == UNSET_VALUE
24
- @ip = nil if @ip == UNSET_VALUE
21
+ @resolver = '/etc/resolver' if @resolver == UNSET_VALUE
22
+ @dnsmasqconf = "/etc/dnsmasq.conf" if @dnsmasqconf == UNSET_VALUE
23
+ @disable = false if @disable == UNSET_VALUE
24
+
25
+ # default way to obtain ip address
26
+ if @ip == UNSET_VALUE
27
+ @ip = proc do |guest_machine|
28
+ ips = nil
29
+ guest_machine.communicate.sudo("hostname -I") do |type, data|
30
+ ips = data.scan /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/
31
+ end
32
+ ips
33
+ end
34
+ end
35
+
36
+ end
37
+
38
+ def enabled?
39
+ not @disable and not @domain.nil?
40
+ end
41
+
42
+ def validate(machine)
43
+ return unless enabled?
44
+
45
+ errors = []
46
+
47
+ # verify @disable
48
+ if @disable != true and @disable != false then errors << 'invalid disable setting' end
49
+
50
+ # verify domain
51
+ begin @domain = Domain.new @domain; rescue => e; errors << e.message end
52
+
53
+ # verify ip
54
+ if @ip.is_a? Array
55
+ @ip.map!{|ip| begin Ip.new(ip); rescue => e; errors << e.message end}
56
+
57
+ elsif @ip.is_a? String
58
+ begin @ip = Ip.new(@ip); rescue => e; errors << e.message end
59
+ @ip = [@ip]
60
+
61
+ elsif @ip.is_a? Proc
62
+ # okay, there is nothing to verify at the moment
63
+ else
64
+ @ip = nil
65
+ end
66
+
67
+
68
+
69
+ # verify resolver
70
+ if @resolver
71
+ errors << "directory '#{@resolver}' does not exist" unless Dir.exists? @resolver
72
+ end
25
73
 
26
- # make it a Domain instance
27
- @domain = Domain.new @domain
28
-
29
- # make it an Ip instance
30
- @ip = [@ip] unless @ip.kind_of? Array
31
- @ip.map!{|ip| begin Ip.new(ip) rescue nil end}.compact!
74
+ # verify dnsmasqconf
75
+ if @dnsmasqconf
76
+ errors << "file '#{@dnsmasqconf}' does not exist" unless File.exists? @dnsmasqconf
77
+ end
32
78
 
79
+ return { 'Dnsmasq configuration' => errors }
33
80
  end
34
81
 
35
82
  end
@@ -6,11 +6,10 @@ class Domain
6
6
  @name = nil
7
7
 
8
8
  if name.is_a? Domain
9
- @name = name.dotted
10
- return
9
+ name = name.dotted
11
10
  end
12
11
 
13
- raise ArgumentError, "no domain name given" unless name
12
+ raise ArgumentError, "no domain name given" if name.blank?
14
13
 
15
14
  # parse domain name ...
16
15
  name = name.to_s
@@ -21,7 +20,7 @@ class Domain
21
20
  end
22
21
 
23
22
  def self.valid?(name)
24
- Domain::MATCH.match(name.downcase)
23
+ if not name.blank? and Domain::MATCH.match(name.downcase) then true else false end
25
24
  end
26
25
 
27
26
  def dotted
@@ -1,16 +1,20 @@
1
1
  class Ip
2
2
 
3
- MATCH_IP4 = /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/
3
+ MATCH_IP4 = /^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[0-9]{1,2})){3}$/
4
4
 
5
5
  def initialize(ipv4)
6
6
 
7
+ if ipv4.is_a? Ip
8
+ ipv4 = ipv4.v4
9
+ end
10
+
7
11
  raise ArgumentError, "IPv4 '#{ipv4}' must match #{MATCH_IP4}" unless Ip::ipv4_valid?(ipv4)
8
12
 
9
13
  @ipv4 = ipv4
10
14
  end
11
15
 
12
16
  def self.ipv4_valid?(ipv4)
13
- Ip::MATCH_IP4.match(ipv4)
17
+ if not ipv4.blank? and Ip::MATCH_IP4.match(ipv4) then true else false end
14
18
  end
15
19
 
16
20
  def v4
@@ -2,14 +2,15 @@ class Resolver
2
2
 
3
3
  attr_reader :dirname
4
4
 
5
- def initialize(dirname)
5
+ def initialize(dirname, sudo = false)
6
6
  raise ArgumentError, 'wrong dirname' if dirname.blank?
7
7
  raise IOError unless Dir.exists? dirname
8
8
  @dirname = dirname
9
+ @sudo = sudo
9
10
  end
10
11
 
11
12
  def self.flush_cache!
12
- system 'sudo dscacheutil -flushcache'
13
+ system 'sudo dscacheutil -flushcache' if @sudo
13
14
  end
14
15
 
15
16
  def list
@@ -21,8 +22,8 @@ class Resolver
21
22
 
22
23
  delete(domain) if includes?(domain)
23
24
 
24
- puts "You may be asked for your password to insert #{@dirname}/#{domain.name} (ip: #{ip})"
25
- system("sudo sh -c \"echo 'nameserver #{ip.v4}' >> #{@dirname}/#{domain.name}\"")
25
+ puts "You may be asked for your password to insert #{@dirname}/#{domain.name} (ip: #{ip})" if @sudo
26
+ system("#{'sudo' if @sudo} sh -c \"echo 'nameserver #{ip.v4}' >> #{@dirname}/#{domain.name}\"")
26
27
  Resolver::flush_cache!
27
28
 
28
29
  end
@@ -31,8 +32,8 @@ class Resolver
31
32
  raise ArgumentError, 'invalid domain instance' unless domain.is_a? Domain
32
33
 
33
34
  if includes? domain
34
- puts "You may be asked for your password to delete #{@dirname}/#{domain.name}"
35
- system("sudo rm -rf #{@dirname}/#{domain.name}")
35
+ puts "You may be asked for your password to delete #{@dirname}/#{domain.name}" if @sudo
36
+ system("#{'sudo' if @sudo} rm -rf #{@dirname}/#{domain.name}")
36
37
  Resolver::flush_cache!
37
38
  end
38
39
  end
@@ -1,10 +1,10 @@
1
- def delete_line_from_file(filename, line)
1
+ def delete_line_from_file(filename, regex)
2
2
  # create empty file string
3
3
  tmp_file = ''
4
4
 
5
5
  # iterate over every line and skip lines that match
6
6
  File.open(filename, "r").each_line do |l|
7
- tmp_file += l unless line.match(l.strip)
7
+ tmp_file += l unless regex.match(l.strip)
8
8
  end
9
9
 
10
10
  # write tmp file without matching lines
@@ -14,9 +14,8 @@ def delete_line_from_file(filename, line)
14
14
  tmp_file = nil
15
15
  end
16
16
 
17
-
18
17
  class Object
19
18
  def blank?
20
- self.nil? || self.empty?
19
+ respond_to?(:empty?) ? empty? : !self
21
20
  end
22
21
  end
@@ -1,5 +1,5 @@
1
1
  module Vagrant
2
2
  module Dnsmasq
3
- VERSION = "0.0.5"
3
+ VERSION = "0.0.6"
4
4
  end
5
5
  end
@@ -1,17 +1,24 @@
1
1
  module Vagrant
2
2
  module Dnsmasq
3
-
4
3
  class Plugin < Vagrant.plugin("2")
5
4
  name "vagrant-dnsmasq"
5
+ description "A Dnsmasq Vagrant plugin that manages the dnsmasq.conf file and /etc/resolver directory on your host system."
6
+
7
+ lib_path = Pathname.new(File.expand_path("../vagrant-dnsmasq", __FILE__))
8
+ require lib_path.join("actions")
9
+
10
+ inc_path = Pathname.new(File.expand_path("../vagrant-dnsmasq/includes", __FILE__))
11
+ require inc_path.join("Domain.class.rb")
12
+ require inc_path.join("Ip.class.rb")
13
+ require inc_path.join("DnsmasqConf.class.rb")
14
+ require inc_path.join("Resolver.class.rb")
15
+ require inc_path.join("helper.rb")
6
16
 
7
17
  config "dnsmasq" do
8
- require "vagrant-dnsmasq/config"
18
+ require lib_path.join("config")
9
19
  Config
10
20
  end
11
21
 
12
- lib_path = Pathname.new(File.expand_path("../vagrant-dnsmasq", __FILE__))
13
- require lib_path.join("actions")
14
-
15
22
  action_hook(:dnsmasq, :machine_action_up) do |hook|
16
23
  hook.append(Vagrant::Action::Up)
17
24
  end
@@ -23,4 +30,4 @@ module Vagrant
23
30
  end
24
31
  end
25
32
 
26
- end
33
+ end
@@ -0,0 +1,63 @@
1
+ require './lib/vagrant-dnsmasq/includes/DnsmasqConf.class.rb'
2
+ require './lib/vagrant-dnsmasq/includes/Domain.class.rb'
3
+ require './lib/vagrant-dnsmasq/includes/Ip.class.rb'
4
+
5
+ random = (0...50).map{ ('a'..'z').to_a[rand(26)] }.join
6
+
7
+ describe "At first" do
8
+ it "should fail if there is no conf file" do
9
+ expect {
10
+ DnsmasqConf.new("/tmp/some-non-existing-file-#{random}-h25hch345b3k5")
11
+ }.to raise_error IOError
12
+ end
13
+ end
14
+
15
+
16
+ describe DnsmasqConf do
17
+ before(:each) do
18
+ system "touch /tmp/dnsmasq-conf-#{random}"
19
+ @dnsm = DnsmasqConf.new("/tmp/dnsmasq-conf-#{random}")
20
+ @domain = Domain.new('.foobar')
21
+ @ip = Ip.new('10.10.10.10')
22
+ end
23
+
24
+ after(:each) do
25
+ system("rm /tmp/dnsmasq-conf-#{random}") if File.exists? "/tmp/dnsmasq-conf-#{random}"
26
+ end
27
+
28
+ it "should insert a domain" do
29
+ @dnsm.insert(@domain, @ip)
30
+ @dnsm.includes?(@domain).should eq(true)
31
+ end
32
+
33
+ it "should return false if no domain is found" do
34
+ @dnsm.includes?(Domain.new('.doesntexist')).should eq(false)
35
+ end
36
+
37
+ it "should delete a domain" do
38
+ @dnsm.includes?(@domain).should eq(false)
39
+ @dnsm.insert(@domain, @ip)
40
+ @dnsm.includes?(@domain).should eq(true)
41
+ @dnsm.delete(@domain)
42
+ @dnsm.includes?(@domain).should eq(false)
43
+ end
44
+
45
+ it "#insert should raise if domain is nil" do
46
+ expect {
47
+ @dnsm.insert(nil, nil)
48
+ }.to raise_error ArgumentError
49
+ end
50
+
51
+ it "#delete should raise if domain is nil" do
52
+ expect {
53
+ @dnsm.delete(nil)
54
+ }.to raise_error ArgumentError
55
+ end
56
+
57
+ it "#includes? should raise if domain is nil" do
58
+ expect {
59
+ @dnsm.includes?(nil)
60
+ }.to raise_error ArgumentError
61
+ end
62
+
63
+ end
@@ -0,0 +1,61 @@
1
+ require './lib/vagrant-dnsmasq/includes/Domain.class.rb'
2
+
3
+ describe Domain do
4
+
5
+ it "should return normal domain" do
6
+ Domain.new('foobar').name.should eq('foobar')
7
+ Domain.new('.foobar').name.should eq('foobar')
8
+ end
9
+
10
+ it "should return dotted domain" do
11
+ Domain.new('foobar').dotted.should eq('.foobar')
12
+ Domain.new('.foobar').dotted.should eq('.foobar')
13
+ end
14
+
15
+ it "should return valid domain if domain is passed" do
16
+ Domain.new(Domain.new('foobar')).name.should eq('foobar')
17
+ Domain.new(Domain.new('.foobar')).name.should eq('foobar')
18
+ Domain.new(Domain.new('foobar')).dotted.should eq('.foobar')
19
+ Domain.new(Domain.new('.foobar')).dotted.should eq('.foobar')
20
+ end
21
+
22
+ it "should make the domain lowercase" do
23
+ Domain.new('FOOBAR').name.should eq('foobar')
24
+ end
25
+
26
+ it "should fail for invalid domains" do
27
+ expect {
28
+ Domain.new('foo1')
29
+ }.to raise_error ArgumentError
30
+
31
+ expect {
32
+ Domain.new('foo_')
33
+ }.to raise_error ArgumentError
34
+
35
+ expect {
36
+ Domain.new('foo.')
37
+ }.to raise_error ArgumentError
38
+
39
+ expect {
40
+ Domain.new('foo-')
41
+ }.to raise_error ArgumentError
42
+
43
+ expect {
44
+ Domain.new('')
45
+ }.to raise_error ArgumentError
46
+
47
+ expect {
48
+ Domain.new(nil)
49
+ }.to raise_error ArgumentError
50
+ end
51
+
52
+ it "#valid? should fail for invalid domains" do
53
+ Domain::valid?('foo1').should eq(false)
54
+ Domain::valid?('foo_').should eq(false)
55
+ Domain::valid?('foo.').should eq(false)
56
+ Domain::valid?('foo-').should eq(false)
57
+ Domain::valid?('').should eq(false)
58
+ Domain::valid?(nil).should eq(false)
59
+ end
60
+
61
+ end
@@ -0,0 +1,43 @@
1
+ require './lib/vagrant-dnsmasq/includes/Ip.class.rb'
2
+
3
+ describe Ip do
4
+
5
+ it "should return ipv4" do
6
+ Ip.new('10.10.10.10').v4.should eq('10.10.10.10')
7
+ end
8
+
9
+ it "should return ipv4 if ip is passed" do
10
+ Ip.new(Ip.new('10.10.10.10')).v4.should eq('10.10.10.10')
11
+ end
12
+
13
+ it "should fail for invalid ips" do
14
+ expect {
15
+ Ip.new('10.10.10')
16
+ }.to raise_error ArgumentError
17
+
18
+ expect {
19
+ Ip.new('300.0.0.1')
20
+ }.to raise_error ArgumentError
21
+
22
+ expect {
23
+ Ip.new('10-10-10-10')
24
+ }.to raise_error ArgumentError
25
+
26
+ expect {
27
+ Ip.new('')
28
+ }.to raise_error ArgumentError
29
+
30
+ expect {
31
+ Ip.new(nil)
32
+ }.to raise_error ArgumentError
33
+ end
34
+
35
+ it "#valid? should fail for invalid ips" do
36
+ Ip::ipv4_valid?('10.10.10').should eq(false)
37
+ Ip::ipv4_valid?('300.0.0.1').should eq(false)
38
+ Ip::ipv4_valid?('10-10-10-10').should eq(false)
39
+ Ip::ipv4_valid?('').should eq(false)
40
+ Ip::ipv4_valid?(nil).should eq(false)
41
+ end
42
+
43
+ end
@@ -0,0 +1,62 @@
1
+ require './lib/vagrant-dnsmasq/includes/Resolver.class.rb'
2
+ require './lib/vagrant-dnsmasq/includes/Domain.class.rb'
3
+ require './lib/vagrant-dnsmasq/includes/Ip.class.rb'
4
+
5
+ random = (0...50).map{ ('a'..'z').to_a[rand(26)] }.join
6
+
7
+ describe "At first" do
8
+ it "should fail if there is no dir" do
9
+ expect {
10
+ Resolver.new("/tmp/some-non-existing-dir-#{random}-j2335n3kjfs3ap")
11
+ }.to raise_error IOError
12
+ end
13
+ end
14
+
15
+ describe Resolver do
16
+ before(:each) do
17
+ system("mkdir -p /tmp/resolver-dir-#{random}")
18
+ @res = Resolver.new("/tmp/resolver-dir-#{random}")
19
+ @domain = Domain.new('.foobar')
20
+ @ip = Ip.new('10.10.10.10')
21
+ end
22
+
23
+ after(:each) do
24
+ system("rm -R /tmp/resolver-dir-#{random}") if File.exists? "/tmp/resolver-dir-#{random}"
25
+ end
26
+
27
+ it "should insert a domain" do
28
+ @res.insert(@domain, @ip)
29
+ @res.includes?(@domain).should eq(true)
30
+ end
31
+
32
+ it "should return false if no domain is found" do
33
+ @res.includes?(Domain.new('.doesntexist')).should eq(false)
34
+ end
35
+
36
+ it "should delete a domain" do
37
+ @res.includes?(@domain).should eq(false)
38
+ @res.insert(@domain, @ip)
39
+ @res.includes?(@domain).should eq(true)
40
+ @res.delete(@domain)
41
+ @res.includes?(@domain).should eq(false)
42
+ end
43
+
44
+ it "#insert should raise if domain is nil" do
45
+ expect {
46
+ @res.insert(nil, nil)
47
+ }.to raise_error ArgumentError
48
+ end
49
+
50
+ it "#delete should raise if domain is nil" do
51
+ expect {
52
+ @res.delete(nil)
53
+ }.to raise_error ArgumentError
54
+ end
55
+
56
+ it "#includes? should raise if domain is nil" do
57
+ expect {
58
+ @res.includes?(nil)
59
+ }.to raise_error ArgumentError
60
+ end
61
+
62
+ end
data/test/Vagrantfile CHANGED
@@ -1,27 +1,44 @@
1
1
  # -*- mode: ruby -*-
2
2
  # vi: set ft=ruby :
3
3
 
4
- Vagrant.require_plugin('vagrant-dnsmasq')
5
-
6
4
  Vagrant.configure('2') do |config|
7
5
  config.vm.box = 'precise64'
8
6
  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
9
7
 
8
+ # dnsmasq works with both, private network as well as public network
10
9
  # config.vm.network :private_network, ip: "192.168.59.100"
11
10
  config.vm.network :public_network
12
11
 
13
12
 
14
13
  # dnsmasq ...
15
14
 
16
- # enable dnsmasq?
17
- # set to false or delete line to disable dnsmasq handling
18
- config.dnsmasq.enable = true
15
+ # set domain ending (required)
16
+ # adding this line enables dnsmasq handling
17
+ config.dnsmasq.domain = '.dnsmasqplugintest'
19
18
 
20
- # set domain ending
21
- config.dnsmasq.domain = '.dev'
19
+ # optional configuration ...
22
20
 
23
21
  # this plugin runs 'hostname -I' on the guest machine to obtain
24
- # the guest ip address. you could overwrite the ip here. optional.
25
- # config.dnsmasq.ip = '192.168.59.100'
22
+ # the guest ip address. you can overwrite this behaviour.
23
+ # config.dnsmasq.ip = '192.168.59.109'
24
+
25
+ # config.dnsmasq.ip = proc do |guest_machine|
26
+ # guest_machine.communicate.sudo("command to obtain ip somehow") do |type, data|
27
+ # # return something like '192.168.59.100' or ['192.168.59.100', '192.168.59.103']
28
+ # end
29
+ # end
30
+
31
+ # this will prompt you during 'vagrant up' to choose an IP
32
+ # config.dnsmasq.ip = ['192.168.59.100', '192.168.59.103']
33
+
34
+ # overwrite default location for /etc/resolver directory
35
+ # config.dnsmasq.resolver = '/etc/resolver'
36
+
37
+ # overwrite default location for /usr/local/etc/dnsmasq.conf
38
+ brew_prefix = `brew --prefix`.strip
39
+ config.dnsmasq.dnsmasqconf = brew_prefix + '/etc/dnsmasq.conf'
40
+
41
+ # disable dnsmasq handling
42
+ # config.dnsmasq.disable = true
26
43
 
27
- end
44
+ end
@@ -0,0 +1,34 @@
1
+ require './lib/vagrant-dnsmasq/includes/helper.rb'
2
+
3
+ random = (0...50).map{ ('a'..'z').to_a[rand(26)] }.join
4
+
5
+
6
+ describe "Helper" do
7
+
8
+ it "#delete_line_from_file should delete a line from a file" do
9
+ tmp_file = "/tmp/helper-delete-line-from-file-test-#{random}"
10
+ system "echo \"line 1\n another line\n\na line after an empty line \nline5\" > #{tmp_file}"
11
+ delete_line_from_file(tmp_file, Regexp.new("an"))
12
+ IO.read(tmp_file).should eq("line 1\n\nline5\n")
13
+ system("rm #{tmp_file}") if File.exists? tmp_file
14
+ end
15
+
16
+ end
17
+
18
+ describe Object do
19
+ it "#blank? should work" do
20
+ "".blank?.should eq(true)
21
+ nil.blank?.should eq(true)
22
+ [].blank?.should eq(true)
23
+ false.blank?.should eq(true)
24
+
25
+ 0.blank?.should eq(false)
26
+
27
+ 'foo'.blank?.should eq(false)
28
+ [1].blank?.should eq(false)
29
+ true.blank?.should eq(false)
30
+ 1.blank?.should eq(false)
31
+ -1.blank?.should eq(false)
32
+
33
+ end
34
+ end
@@ -20,4 +20,5 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
23
24
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-dnsmasq
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - mattes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-24 00:00:00.000000000 Z
11
+ date: 2013-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  description: A Dnsmasq Vagrant plugin that manages the dnsmasq.conf file and /etc/resolver
42
56
  directory on your host system.
43
57
  email:
@@ -47,6 +61,7 @@ extensions: []
47
61
  extra_rdoc_files: []
48
62
  files:
49
63
  - .gitignore
64
+ - .travis.yml
50
65
  - Gemfile
51
66
  - Gemfile.lock
52
67
  - LICENSE.txt
@@ -56,13 +71,18 @@ files:
56
71
  - lib/vagrant-dnsmasq.rb
57
72
  - lib/vagrant-dnsmasq/actions.rb
58
73
  - lib/vagrant-dnsmasq/config.rb
59
- - lib/vagrant-dnsmasq/includes/Dnsmasq.class.rb
74
+ - lib/vagrant-dnsmasq/includes/DnsmasqConf.class.rb
60
75
  - lib/vagrant-dnsmasq/includes/Domain.class.rb
61
76
  - lib/vagrant-dnsmasq/includes/Ip.class.rb
62
77
  - lib/vagrant-dnsmasq/includes/Resolver.class.rb
63
78
  - lib/vagrant-dnsmasq/includes/helper.rb
64
79
  - lib/vagrant-dnsmasq/version.rb
80
+ - test/Dnsmasq.class.spec.rb
81
+ - test/Domain.class.spec.rb
82
+ - test/Ip.class.spec.rb
83
+ - test/Resolver.class.spec.rb
65
84
  - test/Vagrantfile
85
+ - test/helper.spec.rb
66
86
  - vagrant-dnsmasq.gemspec
67
87
  homepage: https://github.com/mattes/vagrant-dnsmasq
68
88
  licenses:
@@ -90,4 +110,9 @@ specification_version: 4
90
110
  summary: A Dnsmasq Vagrant plugin that manages the dnsmasq.conf file and /etc/resolver
91
111
  directory on your host system.
92
112
  test_files:
113
+ - test/Dnsmasq.class.spec.rb
114
+ - test/Domain.class.spec.rb
115
+ - test/Ip.class.spec.rb
116
+ - test/Resolver.class.spec.rb
93
117
  - test/Vagrantfile
118
+ - test/helper.spec.rb