vagrant-multihostmanager 1.3.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b9c7e0c45edc0e6b82800af16d0280d722e8e859
4
+ data.tar.gz: e38aa24aeccb1c95ad4841a45d3a223eaeabbe00
5
+ SHA512:
6
+ metadata.gz: 387cddbaf83030a097dcbc99f2c8fd0004125d12f06c2a05144245015d750b72ad61ba6582dcb03bf0e2b27aa2be3393b5fb611e358cd52e40c526f40ea6fd67
7
+ data.tar.gz: 5601337f17b7d5603844eb672d5f39d5908d803d7be8f86f2741e08c47b0057ae4632607b1d5152b26feb089ca4a8732383fac982b3711768032870c062fc789
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ pkg
3
+ Gemfile.lock
4
+ test/.vagrant
5
+ .bundle
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Shawn Dahlen
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,118 @@
1
+ Vagrant Host Manager
2
+ ====================
3
+ `vagrant-multihostmanager` is a Vagrant 1.1+ plugin that manages the `/etc/hosts`
4
+ file on guest machines (and optionally the host). Its goal is to enable
5
+ resolution of multi-machine environments deployed with a cloud provider
6
+ where IP addresses are not known in advance.
7
+
8
+ *NOTE:* Version 1.1 of the plugin prematurely introduced a feature to hook into
9
+ commands other than `vagrant up` and `vagrant destroy`. Version 1.1 broke support for some providers. Version 1.2 reverts this feature until a suitable implementation supporting all providers is available.
10
+
11
+ Installation
12
+ ------------
13
+ Install the plugin following the typical Vagrant 1.1 procedure:
14
+
15
+ $ vagrant plugin install vagrant-multihostmanager
16
+
17
+ Usage
18
+ -----
19
+ To update the `/etc/hosts` file on each active machine, run the following
20
+ command:
21
+
22
+ $ vagrant hostmanager
23
+
24
+ The plugin hooks into the `vagrant up` and `vagrant destroy` commands
25
+ automatically.
26
+ When a machine enters or exits the running state , all active
27
+ machines with the same provider will have their `/etc/hosts` file updated
28
+ accordingly. Set the `hostmanager.enabled` attribute to `true` in the
29
+ Vagrantfile to activate this behavior.
30
+
31
+ To update the host's `/etc/hosts` file, set the `hostmanager.manage_host`
32
+ attribute to `true`.
33
+
34
+ A machine's IP address is defined by either the static IP for a private
35
+ network configuration or by the SSH host configuration. To disable
36
+ using the private network IP address, set `config.hostmanger.ignore_private_ip`
37
+ to true.
38
+
39
+ A machine's host name is defined by `config.vm.hostname`. If this is not
40
+ set, it falls back to the symbol defining the machine in the Vagrantfile.
41
+
42
+ If the `hostmanager.include_offline` attribute is set to `true`, boxes that are
43
+ up or have a private ip configured will be added to the hosts file.
44
+
45
+ In addition, the `hostmanager.aliases` configuration attribute can be used
46
+ to provide aliases for your host names.
47
+
48
+ Example configuration:
49
+
50
+ ```ruby
51
+ Vagrant.configure("2") do |config|
52
+ config.hostmanager.enabled = true
53
+ config.hostmanager.manage_host = true
54
+ config.hostmanager.ignore_private_ip = false
55
+ config.hostmanager.include_offline = true
56
+ config.vm.define 'example-box' do |node|
57
+ node.vm.hostname = 'example-box-hostname'
58
+ node.vm.network :private_network, ip: '192.168.42.42'
59
+ node.hostmanager.aliases = %w(example-box.localdomain example-box-alias)
60
+ end
61
+ end
62
+ ```
63
+
64
+ As a last option, you can use hostmanager as a provisioner.
65
+ This allows you to use the provisioning order to ensure that hostmanager
66
+ runs before or after provisioning. The provisioner will collect hosts from
67
+ boxes with the same provider as the running box.
68
+
69
+ Use:
70
+
71
+ ```ruby
72
+ config.vm.provision :hostmanager
73
+ ```
74
+
75
+ Custom IP resolver
76
+ ------------------
77
+
78
+ You can customize way, how host manager resolves IP address
79
+ for each machine. This might be handy in case of aws provider,
80
+ where host name is stored in ssh_info hash of each machine.
81
+ This causes generation of invalid /etc/hosts file.
82
+
83
+ Custom IP resolver gives you oportunity to calculate IP address
84
+ for each machine by yourself. For example:
85
+
86
+ ```ruby
87
+ config.hostmanager.ip_resolver = proc do |vm|
88
+ if hostname = (vm.ssh_info && vm.ssh_info[:host])
89
+ `host #{hostname}`.split("\n").last[/(\d+\.\d+\.\d+\.\d+)/, 1]
90
+ end
91
+ end
92
+ ```
93
+
94
+ Windows support
95
+ ---------------
96
+
97
+ Hostmanager will detect Windows guests and hosts and use the appropriate
98
+ path for the ```hosts``` file: ```%WINDIR%\System32\drivers\etc\hosts```
99
+
100
+ By default on a Windows host, the ```hosts``` file is not writable without
101
+ elevated privileges. If hostmanager detects that it cannot overwrite the file,
102
+ it will attempt to do so with elevated privileges, causing the
103
+ [UAC](http://en.wikipedia.org/wiki/User_Account_Control) prompt to appear.
104
+
105
+ ### UAC limitations
106
+
107
+ Due to limitations caused by UAC, cancelling out of the UAC prompt will not cause any
108
+ visible errors, however the ```hosts``` file will not be updated.
109
+
110
+ Contribute
111
+ ----------
112
+ Contributions are welcome.
113
+
114
+ 1. Fork it
115
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
116
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
117
+ 4. Push to the branch (`git push origin my-new-feature`)
118
+ 5. Create new Pull Request
@@ -0,0 +1,12 @@
1
+ require 'bundler/gem_helper'
2
+
3
+ # Change to the directory of this file.
4
+ Dir.chdir(File.expand_path("../", __FILE__))
5
+
6
+ namespace :gem do
7
+ Bundler::GemHelper.install_tasks
8
+ end
9
+
10
+ task :test do
11
+ sh 'bash test/test.sh'
12
+ end
@@ -0,0 +1,14 @@
1
+ require 'vagrant-multihostmanager/plugin'
2
+ require 'vagrant-multihostmanager/version'
3
+ require 'vagrant-multihostmanager/errors'
4
+
5
+ module VagrantPlugins
6
+ module MultiHostManager
7
+ def self.source_root
8
+ @source_root ||= Pathname.new(File.expand_path('../../', __FILE__))
9
+ end
10
+
11
+ I18n.load_path << File.expand_path('locales/en.yml', source_root)
12
+ I18n.reload!
13
+ end
14
+ end
@@ -0,0 +1,31 @@
1
+ require 'vagrant-multihostmanager/action/update_all'
2
+ require 'vagrant-multihostmanager/action/update_guest'
3
+ require 'vagrant-multihostmanager/action/update_host'
4
+
5
+ module VagrantPlugins
6
+ module MultiHostManager
7
+ module Action
8
+ include Vagrant::Action::Builtin
9
+
10
+ def self.update_all
11
+ Vagrant::Action::Builder.new.tap do |builder|
12
+ builder.use ConfigValidate
13
+ builder.use UpdateAll
14
+ end
15
+ end
16
+
17
+ def self.update_guest
18
+ Vagrant::Action::Builder.new.tap do |builder|
19
+ builder.use ConfigValidate
20
+ builder.use UpdateGuest
21
+ end
22
+ end
23
+
24
+ def self.update_host
25
+ Vagrant::Action::Builder.new.tap do |builder|
26
+ builder.use UpdateHost
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,46 @@
1
+ require 'vagrant-multihostmanager/hosts_file'
2
+
3
+ module VagrantPlugins
4
+ module MultiHostManager
5
+ module Action
6
+ class UpdateAll
7
+ include HostsFile
8
+
9
+ def initialize(app, env)
10
+ @app = app
11
+ @machine = env[:machine]
12
+ @global_env = @machine.env
13
+ @provider = @machine.provider_name
14
+ @logger = Log4r::Logger.new('vagrant::hostmanager::update_all')
15
+ end
16
+
17
+ def call(env)
18
+ # skip if machine is already active on up action
19
+ return @app.call(env) if @machine.id && env[:machine_action] == :up
20
+ # skip if machine is not active on destroy action
21
+ return @app.call(env) if !@machine.id && env[:machine_action] == :destroy
22
+
23
+ # check config to see if the hosts file should be update automatically
24
+ return @app.call(env) unless @global_env.config_global.multihostmanager.enabled?
25
+ @logger.info 'Updating /etc/hosts file automatically'
26
+
27
+ @app.call(env)
28
+
29
+ # update /etc/hosts file on active machines
30
+ @global_env.active_machines.each do |name, p|
31
+ if p == @provider
32
+ machine = @global_env.machine(name, p)
33
+ update_guest(machine)
34
+ end
35
+ end
36
+
37
+ # update /etc/hosts files on host if enabled
38
+ if @machine.config.multihostmanager.manage_host?
39
+ env[:ui].info I18n.t('vagrant_hostmanager.action.update_host')
40
+ update_host
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,28 @@
1
+ require 'vagrant-multihostmanager/hosts_file'
2
+
3
+ module VagrantPlugins
4
+ module MultiHostManager
5
+ module Action
6
+ class UpdateGuest
7
+ include HostsFile
8
+
9
+ def initialize(app, env)
10
+ @app = app
11
+ @machine = env[:machine]
12
+ @global_env = @machine.env
13
+ @provider = env[:provider]
14
+ @logger = Log4r::Logger.new('vagrant::hostmanager::update_guest')
15
+ end
16
+
17
+ def call(env)
18
+ env[:ui].info I18n.t('vagrant_hostmanager.action.update_guest', {
19
+ :name => @machine.name
20
+ })
21
+ update_guest(@machine)
22
+
23
+ @app.call(env)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ require 'vagrant-multihostmanager/hosts_file'
2
+
3
+ module VagrantPlugins
4
+ module MultiHostManager
5
+ module Action
6
+ class UpdateHost
7
+ include HostsFile
8
+
9
+ def initialize(app, env)
10
+ @app = app
11
+ @global_env = env[:global_env]
12
+ @provider = env[:provider]
13
+ @logger = Log4r::Logger.new('vagrant::hostmanager::update_host')
14
+ end
15
+
16
+ def call(env)
17
+ if @global_env.config_global.multihostmanager.manage_host?
18
+ env[:ui].info I18n.t('vagrant_hostmanager.action.update_host')
19
+ update_host
20
+ end
21
+
22
+ @app.call(env)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+
@@ -0,0 +1,39 @@
1
+ module VagrantPlugins
2
+ module MultiHostManager
3
+ class Command < Vagrant.plugin('2', :command)
4
+ include HostsFile
5
+
6
+ def execute
7
+ options = {}
8
+ opts = OptionParser.new do |o|
9
+ o.banner = 'Usage: vagrant multihostmanager [vm-name]'
10
+ o.separator ''
11
+ o.version = VagrantPlugins::MultiHostManager::VERSION
12
+ o.program_name = 'vagrant multihostmanager'
13
+
14
+ o.on('--provider provider', String,
15
+ 'Update machines with the specific provider.') do |provider|
16
+ options[:provider] = provider.to_sym
17
+ end
18
+ end
19
+
20
+ argv = parse_options(opts)
21
+ options[:provider] ||= @env.default_provider
22
+
23
+ # update /etc/hosts file for specified guest machines
24
+ with_target_vms(argv, options) do |machine|
25
+ @env.action_runner.run(Action.update_guest, {
26
+ :machine => machine,
27
+ :provider => options[:provider]
28
+ })
29
+ end
30
+
31
+ # update /etc/hosts file for host
32
+ @env.action_runner.run(Action.update_host, {
33
+ :global_env => @env,
34
+ :provider => options[:provider]
35
+ })
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,78 @@
1
+ module VagrantPlugins
2
+ module MultiHostManager
3
+ class Config < Vagrant.plugin('2', :config)
4
+ attr_accessor :enabled
5
+ attr_accessor :manage_host
6
+ attr_accessor :ignore_private_ip
7
+ attr_accessor :aliases
8
+ attr_accessor :include_offline
9
+ attr_accessor :ip_resolver
10
+
11
+ alias_method :enabled?, :enabled
12
+ alias_method :include_offline?, :include_offline
13
+ alias_method :manage_host?, :manage_host
14
+
15
+ def initialize
16
+ @enabled = false
17
+ @manage_host = UNSET_VALUE
18
+ @ignore_private_ip = UNSET_VALUE
19
+ @include_offline = UNSET_VALUE
20
+ @aliases = []
21
+ @aliases = Array.new
22
+ @include_offline = false
23
+ @ip_resolver = nil
24
+ end
25
+
26
+ def finalize!
27
+ @manage_host = false if @manage_host == UNSET_VALUE
28
+ @ignore_private_ip = false if @ignore_private_ip == UNSET_VALUE
29
+ @include_offline = false if @include_offline == UNSET_VALUE
30
+ @aliases = [ @aliases ].flatten
31
+ end
32
+
33
+ def validate(machine)
34
+ errors = []
35
+
36
+ errors << validate_bool('multihostmanager.enabled', @enabled)
37
+ errors << validate_bool('multihostmanager.manage_host', @manage_host)
38
+ errors << validate_bool('multihostmanager.ignore_private_ip', @ignore_private_ip)
39
+ errors << validate_bool('multihostmanager.include_offline', @include_offline)
40
+ errors.compact!
41
+
42
+ # check if aliases option is an Array
43
+ if !machine.config.multihostmanager.aliases.kind_of?(Array) &&
44
+ !machine.config.multihostmanager.aliases.kind_of?(String)
45
+ errors << I18n.t('vagrant_hostmanager.config.not_an_array_or_string', {
46
+ :config_key => 'multihostmanager.aliases',
47
+ :is_class => aliases.class.to_s,
48
+ })
49
+ end
50
+
51
+ if !machine.config.multihostmanager.ip_resolver.nil? &&
52
+ !machine.config.multihostmanager.ip_resolver.kind_of?(Proc)
53
+ errors << I18n.t('vagrant_hostmanager.config.not_a_proc', {
54
+ :config_key => 'multihostmanager.ip_resolver',
55
+ :is_class => ip_resolver.class.to_s,
56
+ })
57
+ end
58
+
59
+ errors.compact!
60
+ { "MultiHostManager configuration" => errors }
61
+ end
62
+
63
+ private
64
+
65
+ def validate_bool(key, value)
66
+ if ![TrueClass, FalseClass].include?(value.class) &&
67
+ value != UNSET_VALUE
68
+ I18n.t('vagrant_hostmanager.config.not_a_bool', {
69
+ :config_key => key,
70
+ :value => value.class.to_s
71
+ })
72
+ else
73
+ nil
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,6 @@
1
+ module VagrantPlugins
2
+ module MultiHostManager
3
+ module Errors
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,157 @@
1
+ require 'tempfile'
2
+
3
+ module VagrantPlugins
4
+ module MultiHostManager
5
+ module HostsFile
6
+ def update_guest(machine)
7
+ return unless machine.communicate.ready?
8
+
9
+ if (machine.communicate.test("uname -s | grep SunOS"))
10
+ realhostfile = '/etc/inet/hosts'
11
+ move_cmd = 'mv'
12
+ elsif (machine.communicate.test("test -d $Env:SystemRoot"))
13
+ realhostfile = "#{ENV['WINDIR']}\\System32\\drivers\\etc\\hosts"
14
+ move_cmd = 'mv -force'
15
+ else
16
+ realhostfile = '/etc/hosts'
17
+ move_cmd = 'mv'
18
+ end
19
+ # download and modify file with Vagrant-managed entries
20
+ file = @global_env.tmp_path.join("hosts.#{machine.name}")
21
+ machine.communicate.download(realhostfile, file)
22
+ update_file(file)
23
+
24
+ # upload modified file and remove temporary file
25
+ machine.communicate.upload(file, '/tmp/hosts')
26
+ machine.communicate.sudo("#{move_cmd} /tmp/hosts #{realhostfile}")
27
+ # i have no idea if this is a windows competibility issue or not, but sometimes it dosen't work on my machine
28
+ begin
29
+ FileUtils.rm(file)
30
+ rescue Exception => e
31
+ end
32
+ end
33
+
34
+ def update_host
35
+ # copy and modify hosts file on host with Vagrant-managed entries
36
+ file = @global_env.tmp_path.join('hosts.local')
37
+
38
+ if WindowsSupport.windows?
39
+ # lazily include windows Module
40
+ class << self
41
+ include WindowsSupport unless include? WindowsSupport
42
+ end
43
+
44
+ hosts_location = "#{ENV['WINDIR']}\\System32\\drivers\\etc\\hosts"
45
+ copy_proc = Proc.new { windows_copy_file(file, hosts_location) }
46
+ else
47
+ hosts_location = '/etc/hosts'
48
+ copy_proc = Proc.new { `sudo cp #{file} #{hosts_location}` }
49
+ end
50
+
51
+ FileUtils.cp(hosts_location, file)
52
+ update_file(file)
53
+ copy_proc.call
54
+ end
55
+
56
+ private
57
+
58
+ def update_file(file)
59
+ # build array of host file entries from Vagrant configuration
60
+ entries = []
61
+ @global_env.config_global.multihostmanager.aliases.each do |a|
62
+ ip = a[:ip]
63
+ aliases = a[:hosts].join(' ').chomp
64
+ entries << "#{ip}\t#{aliases}\t# VAGRANT\n"
65
+ end
66
+
67
+ tmp_file = Tempfile.open('multihostmanager', @global_env.tmp_path, 'a')
68
+ begin
69
+ # copy each line not managed by Vagrant
70
+ File.open(file).each_line do |line|
71
+ next if line =~ /# VAGRANT/
72
+ tmp_file << line
73
+ end
74
+
75
+ # write a line for each Vagrant-managed entry
76
+ entries.each { |entry| tmp_file << entry }
77
+ ensure
78
+ tmp_file.close
79
+ FileUtils.cp(tmp_file, file)
80
+ tmp_file.unlink
81
+ end
82
+ end
83
+
84
+ def get_ip_address(machine)
85
+ custom_ip_resolver = machine.config.multihostmanager.ip_resolver
86
+ if custom_ip_resolver
87
+ custom_ip_resolver.call(machine)
88
+ else
89
+ ip = nil
90
+ if machine.config.multihostmanager.ignore_private_ip != true
91
+ machine.config.vm.networks.each do |network|
92
+ key, options = network[0], network[1]
93
+ ip = options[:ip] if key == :private_network
94
+ next if ip
95
+ end
96
+ end
97
+ ip || (machine.ssh_info ? machine.ssh_info[:host] : nil)
98
+ end
99
+ end
100
+
101
+ def get_machines
102
+ if @global_env.config_global.multihostmanager.include_offline?
103
+ machines = []
104
+ @global_env.machine_names.each do |name|
105
+ begin
106
+ @global_env.machine(name, @provider)
107
+ machines << [name, @provider]
108
+ rescue Vagrant::Errors::MachineNotFound
109
+ end
110
+ end
111
+ machines
112
+ else
113
+ @global_env.active_machines
114
+ end
115
+ end
116
+
117
+ ## Windows support for copying files, requesting elevated privileges if necessary
118
+ module WindowsSupport
119
+ require 'rbconfig'
120
+
121
+ def self.windows?
122
+ RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
123
+ end
124
+
125
+ require 'win32ole' if windows?
126
+
127
+ def windows_copy_file(source, dest)
128
+ begin
129
+ # First, try Ruby copy
130
+ FileUtils.cp(source, dest)
131
+ rescue Errno::EACCES
132
+ # Access denied, try with elevated privileges
133
+ windows_copy_file_elevated(source, dest)
134
+ end
135
+ end
136
+
137
+ private
138
+
139
+ def windows_copy_file_elevated(source, dest)
140
+ # copy command only supports backslashes as separators
141
+ source, dest = [source, dest].map { |s| s.to_s.gsub(/\//, '\\') }
142
+
143
+ # run 'cmd /C copy ...' with elevated privilege, minimized
144
+ copy_cmd = "copy \"#{source}\" \"#{dest}\""
145
+ WIN32OLE.new('Shell.Application').ShellExecute('cmd', "/C #{copy_cmd}", nil, 'runas', 7)
146
+
147
+ # Unfortunately, ShellExecute does not give us a status code,
148
+ # and it is non-blocking so we can't reliably compare the file contents
149
+ # to see if they were copied.
150
+ #
151
+ # If the user rejects the UAC prompt, vagrant will silently continue
152
+ # without updating the hostsfile.
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,38 @@
1
+ require 'vagrant-multihostmanager/action'
2
+
3
+ module VagrantPlugins
4
+ module MultiHostManager
5
+ class Plugin < Vagrant.plugin('2')
6
+ name 'MultiHostManager'
7
+ description <<-DESC
8
+ This plugin manages the /etc/hosts file for the host and guest machines.
9
+ An entry is created for each running machine using the hostname attribute.
10
+
11
+ You can also use the multihostmanager provisioner to update the hosts file.
12
+ DESC
13
+
14
+ config(:multihostmanager) do
15
+ require_relative 'config'
16
+ Config
17
+ end
18
+
19
+ action_hook(:multihostmanager, :machine_action_up) do |hook|
20
+ hook.prepend(Action.update_all)
21
+ end
22
+
23
+ action_hook(:multihostmanager, :machine_action_destroy) do |hook|
24
+ hook.prepend(Action.update_all)
25
+ end
26
+
27
+ provisioner(:multihostmanager) do
28
+ require_relative 'provisioner'
29
+ Provisioner
30
+ end
31
+
32
+ command(:multihostmanager) do
33
+ require_relative 'command'
34
+ Command
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module MultiHostManager
3
+ class Provisioner < Vagrant.plugin('2', :provisioner)
4
+ include HostsFile
5
+
6
+ def initialize(machine, config)
7
+ super(machine, config)
8
+ @global_env = machine.env
9
+ @provider = machine.provider_name
10
+ end
11
+
12
+ def provision
13
+ update_guest(@machine)
14
+ if @global_env.config_global.multihostmanager.manage_host?
15
+ update_host
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ module VagrantPlugins
2
+ module MultiHostManager
3
+ VERSION = '1.3.0'
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ en:
2
+ vagrant_hostmanager:
3
+ action:
4
+ update_guests: "Updating /etc/hosts file on active guest machines..."
5
+ update_guest: "[%{name}] Updating /etc/hosts file..."
6
+ update_host: "Updating /etc/hosts file on host machine (password may be required)..."
7
+ config:
8
+ not_a_bool: "A value for %{config_key} can only be true or false, not type '%{value}'"
9
+ not_an_array_or_string: "A value for %{config_key} must be an Array or String, not type '%{is_class}'"
10
+ not_a_proc: "A value for %{config_key} must be a Proc, not type '%{is_class}'"
@@ -0,0 +1,23 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ Vagrant.require_plugin('vagrant-multihostmanager')
5
+
6
+ Vagrant.configure('2') do |config|
7
+ config.vm.box = 'precise64'
8
+ config.vm.box_url = 'http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-vagrant-amd64-disk1.box'
9
+
10
+ config.hostmanager.enabled = true
11
+ config.hostmanager.manage_host = true
12
+
13
+ config.vm.define :server1 do |server|
14
+ server.vm.hostname = 'fry'
15
+ server.vm.network :private_network, :ip => '10.0.5.2'
16
+ server.hostmanager.aliases = %w(test-alias)
17
+ end
18
+
19
+ config.vm.define :server2 do |server|
20
+ server.vm.hostname = 'bender'
21
+ server.vm.network :private_network, :ip => '10.0.5.3'
22
+ end
23
+ end
@@ -0,0 +1,14 @@
1
+ cd test
2
+
3
+ vagrant up
4
+
5
+ vagrant hostmanager
6
+
7
+ echo "[server1] /etc/hosts file:"
8
+ vagrant ssh server1 -c 'cat /etc/hosts'
9
+ echo "[server2] /etc/hosts file:"
10
+ vagrant ssh server2 -c 'cat /etc/hosts'
11
+
12
+ vagrant destroy -f
13
+
14
+ cd ..
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'vagrant-multihostmanager/version'
6
+
7
+ Gem::Specification.new do |gem|
8
+ gem.name = 'vagrant-multihostmanager'
9
+ gem.version = VagrantPlugins::MultiHostManager::VERSION
10
+ gem.authors = ['Shawn Dahlen']
11
+ gem.email = ['shawn@dahlen.me']
12
+ gem.description = %q{A Vagrant plugin that manages the /etc/hosts file within a multi-machine environment}
13
+ gem.summary = gem.description
14
+ gem.license = 'MIT'
15
+
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ['lib']
19
+
20
+ gem.add_development_dependency 'bundler', '~> 1.3'
21
+ gem.add_development_dependency 'rake'
22
+ # gem.add_dependency 'pry'
23
+ # gem.add_dependency 'pry-nav'
24
+ end
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vagrant-multihostmanager
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Shawn Dahlen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: A Vagrant plugin that manages the /etc/hosts file within a multi-machine
42
+ environment
43
+ email:
44
+ - shawn@dahlen.me
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - .gitignore
50
+ - Gemfile
51
+ - LICENSE.txt
52
+ - README.md
53
+ - Rakefile
54
+ - lib/vagrant-multihostmanager.rb
55
+ - lib/vagrant-multihostmanager/action.rb
56
+ - lib/vagrant-multihostmanager/action/update_all.rb
57
+ - lib/vagrant-multihostmanager/action/update_guest.rb
58
+ - lib/vagrant-multihostmanager/action/update_host.rb
59
+ - lib/vagrant-multihostmanager/command.rb
60
+ - lib/vagrant-multihostmanager/config.rb
61
+ - lib/vagrant-multihostmanager/errors.rb
62
+ - lib/vagrant-multihostmanager/hosts_file.rb
63
+ - lib/vagrant-multihostmanager/plugin.rb
64
+ - lib/vagrant-multihostmanager/provisioner.rb
65
+ - lib/vagrant-multihostmanager/version.rb
66
+ - locales/en.yml
67
+ - test/Vagrantfile
68
+ - test/test.sh
69
+ - vagrant-multihostmanager.gemspec
70
+ homepage:
71
+ licenses:
72
+ - MIT
73
+ metadata: {}
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ requirements: []
89
+ rubyforge_project:
90
+ rubygems_version: 2.0.14
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: A Vagrant plugin that manages the /etc/hosts file within a multi-machine
94
+ environment
95
+ test_files:
96
+ - test/Vagrantfile
97
+ - test/test.sh