vagrant-hosts 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG CHANGED
@@ -1,6 +1,20 @@
1
1
  CHANGELOG
2
2
  =========
3
3
 
4
+ 1.1.2
5
+ -----
6
+
7
+ 2013-08-07
8
+
9
+ This is a backwards compatible bugfix release.
10
+
11
+ * GH-6 provisioner `autoconfigure` option works with explicit hosts
12
+ * GH-7 all host aliases are respected
13
+ * Autoconfigured entries should ensure private_networks have an IP address
14
+ * Remove hardcoded dependency on virtualbox vm provider
15
+
16
+ Thanks to Tom Linkin for his help on this release.
17
+
4
18
  1.1.1
5
19
  -----
6
20
 
@@ -1,7 +1,6 @@
1
- # Declare top level vagrant hosts module.
2
1
  module VagrantHosts
3
- REQUIRED_VAGRANT_VERSION = '1.1.0'
2
+ require 'vagrant-hosts/version'
3
+ require 'vagrant-hosts/plugin'
4
4
  end
5
5
 
6
- require 'vagrant-hosts/version'
7
- require 'vagrant-hosts/plugin'
6
+ I18n.load_path << File.expand_path('../templates/locales/en.yml', File.dirname(__FILE__))
@@ -1,62 +1,66 @@
1
1
  require 'vagrant'
2
2
 
3
3
  module VagrantHosts
4
- class Config < Vagrant.plugin('2', :config)
4
+ class Config < Vagrant.plugin('2', :config)
5
5
 
6
- # @!attribute hosts
7
- # @return [Array<Array<String, Array<String>>>] A list of IP addresses and their aliases
8
- attr_reader :hosts
6
+ # @!attribute hosts
7
+ # @return [Array<Array<String, Array<String>>>] A list of IP addresses and their aliases
8
+ attr_reader :hosts
9
9
 
10
- # @!attribute autoconfigure
11
- # @return [TrueClass, FalseClass] If hosts should be generated from the
12
- # other vagrant machines
13
- attr_accessor :autoconfigure
10
+ # @!attribute autoconfigure
11
+ # @return [TrueClass, FalseClass] If hosts should be generated from the
12
+ # other vagrant machines
13
+ attr_accessor :autoconfigure
14
14
 
15
- def initialize
16
- @hosts = []
17
- @autoconfigure = UNSET_VALUE
18
- end
19
-
20
- # Register a host for entry
21
- #
22
- # @param [String] address The IP address for aliases
23
- # @param [Array] aliases An array of hostnames to assign to the IP address
24
- def add_host(address, aliases)
25
- @hosts << [address, aliases]
26
- end
15
+ def initialize
16
+ @hosts = []
17
+ @autoconfigure = UNSET_VALUE
18
+ end
27
19
 
28
- # All IPv6 multicast addresses
29
- def add_ipv6_multicast
30
- add_host '::1', ['ip6-localhost', 'ip6-loopback']
31
- add_host 'fe00::0', ['ip6-localnet']
32
- add_host 'ff00::0', ['ip6-mcastprefix']
33
- add_host 'ff02::1', ['ip6-allnodes']
34
- add_host 'ff02::2', ['ip6-allrouters']
35
- end
20
+ # Register a host for entry
21
+ #
22
+ # @param [String] address The IP address for aliases
23
+ # @param [Array] aliases An array of hostnames to assign to the IP address
24
+ def add_host(address, aliases)
25
+ @hosts << [address, aliases]
26
+ end
36
27
 
37
- def finalize!
38
- if @autoconfigure == UNSET_VALUE or @hosts.empty?
39
- @autoconfigure = true
28
+ # All IPv6 multicast addresses
29
+ def add_ipv6_multicast
30
+ add_host '::1', ['ip6-localhost', 'ip6-loopback']
31
+ add_host 'fe00::0', ['ip6-localnet']
32
+ add_host 'ff00::0', ['ip6-mcastprefix']
33
+ add_host 'ff02::1', ['ip6-allnodes']
34
+ add_host 'ff02::2', ['ip6-allrouters']
40
35
  end
41
- end
42
36
 
43
- # @param other [VagrantHosts::Config]
44
- # @return [VagrantHosts::Config] The merged results
45
- def merge(other)
46
- super.tap do |result|
47
- result.hosts += other.hosts
37
+ def finalize!
38
+ if @autoconfigure == UNSET_VALUE
39
+ if @hosts.empty?
40
+ @autoconfigure = true
41
+ else
42
+ @autoconfigure = false
43
+ end
44
+ end
48
45
  end
49
- end
50
46
 
51
- def validate(machine)
52
- errors = []
53
- @hosts.each do |(address, aliases)|
54
- unless aliases.is_a? Array
55
- errors << "#{address} should have an array of aliases, got #{aliases.inspect}:#{aliases.class}"
47
+ # @param other [VagrantHosts::Config]
48
+ # @return [VagrantHosts::Config] The merged results
49
+ def merge(other)
50
+ super.tap do |result|
51
+ result.hosts += other.hosts
56
52
  end
57
53
  end
58
54
 
59
- {"Vagrant Hosts" => errors}
55
+ def validate(machine)
56
+ errors = []
57
+ @hosts.each do |(address, aliases)|
58
+ unless aliases.is_a? Array
59
+ errors << "#{address} should have an array of aliases, got #{aliases.inspect}:#{aliases.class}"
60
+ end
61
+ end
62
+
63
+ {"Vagrant Hosts" => errors}
64
+ end
60
65
  end
61
66
  end
62
- end
@@ -0,0 +1,31 @@
1
+ require 'config_builder/model'
2
+
3
+ module VagrantHosts
4
+ module ConfigBuilder
5
+ class Model < ::ConfigBuilder::Model::Base
6
+
7
+ # @!attribute [rw] hosts
8
+ attr_accessor :hosts
9
+ # @!attribute [rw] autoconfigure
10
+ attr_accessor :autoconfigure
11
+
12
+ def initialize
13
+ @hosts = []
14
+ end
15
+
16
+ def to_proc
17
+ Proc.new do |vm_config|
18
+ vm_config.provision :hosts do |h_config|
19
+ h_config.autoconfigure = @autoconfigure if defined? @autoconfigure
20
+
21
+ @hosts.each do |(address, aliases)|
22
+ h_config.add_host address, aliases
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ ::ConfigBuilder::ModelCollection.provisioner.register('hosts', self)
29
+ end
30
+ end
31
+ end
@@ -2,11 +2,6 @@ require 'vagrant'
2
2
  require 'vagrant-hosts'
3
3
  require 'vagrant-hosts/version'
4
4
 
5
- if Vagrant::VERSION < VagrantHosts::REQUIRED_VAGRANT_VERSION
6
- raise "vagrant-hosts version #{VagrantHosts::VERSION} requires Vagrant " +
7
- "#{VagrantHosts::REQUIRED_VAGRANT_VERSION} or later"
8
- end
9
-
10
5
  class VagrantHosts::Plugin < Vagrant.plugin(2)
11
6
  name 'hosts'
12
7
 
@@ -24,4 +19,8 @@ class VagrantHosts::Plugin < Vagrant.plugin(2)
24
19
  require_relative 'config'
25
20
  VagrantHosts::Config
26
21
  end
22
+
23
+ action_hook(:hosts, :config_builder_extension) do
24
+ require_relative 'config_builder'
25
+ end
27
26
  end
@@ -2,95 +2,19 @@ require 'vagrant'
2
2
  require 'tempfile'
3
3
 
4
4
  module VagrantHosts
5
- class Provisioner < Vagrant.plugin('2', :provisioner)
5
+ class Provisioner < Vagrant.plugin('2', :provisioner)
6
6
 
7
- def initialize(machine, config)
8
- @machine, @config = machine, config
9
- end
10
-
11
- def provision
12
- # too tired to do this. detect target platform, select according provider,
13
- # add entries that are specified in the config and are not on the client
14
-
15
- driver = Linux.new(@machine, @config)
16
- driver.sync!
17
- end
18
-
19
- class Linux
20
-
21
- # This has to be inside of this class, because otherwise the hostname mixin
22
- # will create this class with a different superclass. It makes me sad. :(
23
7
  require 'vagrant-hosts/provisioner/hostname'
24
- include VagrantHosts::Provisioner::Hostname
25
-
8
+ require 'vagrant-hosts/provisioner/linux'
26
9
 
27
10
  def initialize(machine, config)
28
11
  @machine, @config = machine, config
29
12
  end
30
13
 
31
- def sync!
32
- upload_tmphosts
33
- update_hosts
34
- end
35
-
36
- private
37
-
38
- def upload_tmphosts
39
- cache = Tempfile.new('tmp-hosts')
40
- cache.write(format_hosts)
41
- cache.flush
42
- @machine.communicate.upload(cache.path, '/tmp/hosts')
43
- end
44
-
45
- def update_hosts
46
- hostname = @machine.config.vm.hostname || @machine.name.to_s
47
- change_host_name(hostname)
48
- @machine.communicate.sudo('install -m 644 /tmp/hosts /etc/hosts')
49
- end
50
-
51
- # Generates content appropriate for a linux hosts file
52
- #
53
- # @return [String] All hosts in the config joined into hosts records
54
- def format_hosts
55
- all_hosts.inject('') do |str, (address, aliases)|
56
- str << "#{address} #{aliases.join(' ')}\n"
57
- end
58
- end
59
-
60
- def all_hosts
61
- all_hosts = []
62
-
63
- if @config.autoconfigure
64
- all_hosts += vagrant_hosts
65
- else
66
- all_hosts += @config.hosts
67
- end
68
-
69
- all_hosts.unshift(['127.0.0.1', ['localhost']])
70
- all_hosts.unshift(['127.0.1.1', [@machine.name]])
71
- end
72
-
73
- def vagrant_hosts
74
- hosts = []
75
- env = @machine.env
76
- names = env.machine_names
77
-
78
- # Assume that all VMs are using the current provider
79
- provider = @machine.provider
80
-
81
- names.each do |name|
82
- network_settings = env.machine(name, :virtualbox).config.vm.networks
83
- hostname = env.machine(name, :virtualbox).config.vm.hostname
84
- network_settings.each do |entry|
85
- if entry[0] == :private_network
86
- ipaddr = entry[1][:ip]
87
- hosts << [ipaddr, [hostname, name]]
88
- end
89
- end
90
- end
91
-
92
- hosts
14
+ # @todo use guest capabilities instead of hardcoded provisioner provider
15
+ def provision
16
+ driver = Linux.new(@machine, @config)
17
+ driver.sync!
93
18
  end
94
19
  end
95
20
  end
96
- end
@@ -1,15 +1,17 @@
1
1
  require 'vagrant'
2
- require 'vagrant-hosts/provisioner'
2
+ require 'vagrant/errors'
3
3
 
4
- module VagrantHosts
5
- class Provisioner
6
- module Hostname
7
- # Abstract the details of setting a guest hostname on different versions of
8
- # Vagrant.
9
- #
10
- # Vagrant commit 61d2f9f96fc0f0ef5869c732674f25c4ccc85c8c converts the
11
- # #change_host_name # method to a capability, which breaks the API between
12
- # 1.1 and 1.2. :(
4
+ # Abstract the details of setting a guest hostname on different versions of
5
+ # Vagrant.
6
+ #
7
+ # Vagrant commit 61d2f9f96fc0f0ef5869c732674f25c4ccc85c8c converts the
8
+ # #change_host_name # method to a capability, which breaks the API between
9
+ # 1.1 and 1.2. :(
10
+ module VagrantHosts::Provisioner::Hostname
11
+
12
+ class UnknownVersion < Vagrant::Errors::VagrantError
13
+ error_key(:unknown_version, 'vagrant_hosts')
14
+ end
13
15
 
14
16
  # @param name [String] The new hostname to apply on the guest
15
17
  def change_host_name(name)
@@ -19,10 +21,7 @@ module Hostname
19
21
  when /1\.2/
20
22
  @machine.guest.capability(:change_host_name, name)
21
23
  else
22
- raise RuntimeError, "#{Vagrant::VERSION} isn't a recognized Vagrant version, can't reliably shim `change_host_name`"
24
+ raise UnknownVersion, :vagrant_version => Vagrant::VERSION
23
25
  end
24
26
  end
25
-
26
- end
27
- end
28
27
  end
@@ -0,0 +1,80 @@
1
+ class VagrantHosts::Provisioner::Linux
2
+
3
+ include VagrantHosts::Provisioner::Hostname
4
+
5
+ def initialize(machine, config)
6
+ @machine, @config = machine, config
7
+
8
+ @env = @machine.env
9
+ end
10
+
11
+ def sync!
12
+ upload_tmphosts
13
+ update_hosts
14
+ end
15
+
16
+ private
17
+
18
+ def upload_tmphosts
19
+ cache = Tempfile.new('tmp-hosts')
20
+ cache.write(format_hosts)
21
+ cache.flush
22
+ @machine.communicate.upload(cache.path, '/tmp/hosts')
23
+ end
24
+
25
+ def update_hosts
26
+ hostname = @machine.config.vm.hostname || @machine.name.to_s
27
+ change_host_name(hostname)
28
+ @machine.communicate.sudo('install -m 644 /tmp/hosts /etc/hosts')
29
+ end
30
+
31
+ # Generates content appropriate for a linux hosts file
32
+ #
33
+ # @return [String] All hosts in the config joined into hosts records
34
+ def format_hosts
35
+ all_hosts.inject('') do |str, (address, aliases)|
36
+ str << "#{address} #{aliases.join(' ')}\n"
37
+ end
38
+ end
39
+
40
+ def all_hosts
41
+ all_hosts = []
42
+ all_hosts += local_hosts
43
+
44
+ if @config.autoconfigure
45
+ all_hosts += vagrant_hosts
46
+ end
47
+ all_hosts += @config.hosts
48
+
49
+ all_hosts
50
+ end
51
+
52
+ def local_hosts
53
+ [
54
+ ['127.0.0.1', ['localhost']],
55
+ ['127.0.1.1', [@machine.name]],
56
+ ]
57
+ end
58
+
59
+ def vagrant_hosts
60
+ hosts = []
61
+
62
+ all_machines.each do |m|
63
+ m_networks = m.config.vm.networks
64
+ m_hostname = m.config.vm.hostname
65
+
66
+ m_networks.each do |(net_type, opts)|
67
+ next unless net_types == :private_network
68
+ addr = opts[:ip]
69
+ hosts << [addr, [m_hostname, @machine.name]]
70
+ end
71
+ end
72
+
73
+ hosts
74
+ end
75
+
76
+ # @return [Array<Vagrant::Machine>]
77
+ def all_machines
78
+ @env.active_machines.map { |vm_id| @env.machine(*vm_id) }
79
+ end
80
+ end
@@ -1,3 +1,3 @@
1
1
  module VagrantHosts
2
- VERSION = '1.1.1'
2
+ VERSION = '1.1.2'
3
3
  end
@@ -0,0 +1,6 @@
1
+ ---
2
+ en:
3
+ vagrant_hosts:
4
+ unknown_version: |-
5
+ %{vagrant_version} isn't a recognized Vagrant version, vagrant-hosts can't reliably
6
+ detect the `change_host_name` method.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-hosts
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-08 00:00:00.000000000 Z
12
+ date: 2013-08-08 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! ' Manage static DNS entries and configuration for Vagrant guests.
15
15
 
@@ -24,10 +24,13 @@ files:
24
24
  - README.markdown
25
25
  - lib/vagrant-hosts.rb
26
26
  - lib/vagrant-hosts/config.rb
27
+ - lib/vagrant-hosts/config_builder.rb
27
28
  - lib/vagrant-hosts/plugin.rb
28
29
  - lib/vagrant-hosts/provisioner.rb
29
30
  - lib/vagrant-hosts/provisioner/hostname.rb
31
+ - lib/vagrant-hosts/provisioner/linux.rb
30
32
  - lib/vagrant-hosts/version.rb
33
+ - templates/locales/en.yml
31
34
  - vagrant-hosts.gemspec
32
35
  homepage: https://github.com/adrienthebo/vagrant-hosts
33
36
  licenses: