vagrant-hostmaster 0.7.0 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +72 -10
- data/lib/vagrant/hostmaster.rb +3 -2
- data/lib/vagrant/hostmaster/command/base.rb +30 -0
- data/lib/vagrant/hostmaster/command/list.rb +1 -18
- data/lib/vagrant/hostmaster/command/remove.rb +1 -17
- data/lib/vagrant/hostmaster/command/update.rb +1 -18
- data/lib/vagrant/hostmaster/middleware/remove.rb +1 -1
- data/lib/vagrant/hostmaster/middleware/update.rb +1 -1
- data/lib/vagrant/hostmaster/version.rb +1 -1
- data/lib/vagrant/hostmaster/vm.rb +77 -18
- metadata +4 -3
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# vagrant-hostmaster
|
2
2
|
|
3
|
-
vagrant-hostmaster is a Vagrant plugin to manage /etc/hosts entries on both the host OS and guest VMs.
|
3
|
+
`vagrant-hostmaster` is a Vagrant plugin to manage /etc/hosts entries on both the host OS and guest VMs.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -18,6 +18,74 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
+
vagrant-hostmaster will automatically add/update /etc/hosts entries when you run `vagrant up`
|
22
|
+
(or `vagrant provision`).
|
23
|
+
|
24
|
+
The host entries will automatically be removed when you run `vagrant destroy`.
|
25
|
+
|
26
|
+
### Configuration
|
27
|
+
|
28
|
+
By default, the name specified in the `vm.host_name` configuration option will be associated
|
29
|
+
with the address of the first network interface.
|
30
|
+
|
31
|
+
For example:
|
32
|
+
|
33
|
+
Vagrant::Config.run do |config|
|
34
|
+
...
|
35
|
+
|
36
|
+
config.vm.host_name = "www.example.com"
|
37
|
+
|
38
|
+
config.vm.network :hostonly, "33.33.33.60"
|
39
|
+
end
|
40
|
+
|
41
|
+
This would result in the following hosts entry:
|
42
|
+
|
43
|
+
33.33.33.60 www.example.com # VAGRANT: ...
|
44
|
+
|
45
|
+
### Using a different host name
|
46
|
+
|
47
|
+
To use a different host name, specify it in your Vagrantfile using the `hosts.name` configuration
|
48
|
+
option.
|
49
|
+
|
50
|
+
For example:
|
51
|
+
|
52
|
+
Vagrant::Config.run do |config|
|
53
|
+
...
|
54
|
+
|
55
|
+
config.vm.host_name = "www.example.com"
|
56
|
+
config.hosts.name = "example.com"
|
57
|
+
|
58
|
+
config.vm.network :hostonly, "33.33.33.60"
|
59
|
+
end
|
60
|
+
|
61
|
+
This would result in the following hosts entry:
|
62
|
+
|
63
|
+
33.33.33.60 example.com # VAGRANT: ...
|
64
|
+
|
65
|
+
### Host aliases
|
66
|
+
|
67
|
+
In addition, the `hosts.aliases` configuration option can be used to provide aliases for your host names.
|
68
|
+
|
69
|
+
For example:
|
70
|
+
|
71
|
+
Vagrant::Config.run do |config|
|
72
|
+
...
|
73
|
+
|
74
|
+
config.vm.host_name = "www.example.com"
|
75
|
+
config.hosts.aliases = %w(example.com)
|
76
|
+
|
77
|
+
config.vm.network :hostonly, "33.33.33.60"
|
78
|
+
end
|
79
|
+
|
80
|
+
This would result in the following hosts entry:
|
81
|
+
|
82
|
+
33.33.33.60 www.example.com example.com # VAGRANT: ...
|
83
|
+
|
84
|
+
## Command Line
|
85
|
+
|
86
|
+
In addition to automatically updating the hosts file, the `hosts` command supports manual
|
87
|
+
modification (or verification) of the hosts entries.
|
88
|
+
|
21
89
|
Usage: vagrant hosts <command> [<args>]
|
22
90
|
|
23
91
|
Available subcommands:
|
@@ -29,21 +97,15 @@ Or install it yourself as:
|
|
29
97
|
|
30
98
|
### List Host Entries
|
31
99
|
|
32
|
-
vagrant hosts list
|
100
|
+
vagrant hosts list [vm-name]
|
33
101
|
|
34
102
|
### Remove Host Entries
|
35
103
|
|
36
|
-
vagrant hosts remove [
|
104
|
+
vagrant hosts remove [vm-name]
|
37
105
|
|
38
106
|
### Update Host Entries
|
39
107
|
|
40
|
-
vagrant hosts update [
|
41
|
-
|
42
|
-
## TODO
|
43
|
-
|
44
|
-
1. add commands to modify guests
|
45
|
-
|
46
|
-
2. add provisioning support so that changes are made automatically
|
108
|
+
vagrant hosts update [vm-name]
|
47
109
|
|
48
110
|
## Contributing
|
49
111
|
|
data/lib/vagrant/hostmaster.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'vagrant/hostmaster/version'
|
2
|
+
require 'vagrant/hostmaster/command/base'
|
2
3
|
require 'vagrant/hostmaster/command/root'
|
3
4
|
require 'vagrant/hostmaster/config'
|
4
5
|
require 'vagrant/hostmaster/vm'
|
@@ -11,5 +12,5 @@ Vagrant.commands.register(:hosts) { Vagrant::Hostmaster::Command::Root }
|
|
11
12
|
|
12
13
|
Vagrant.actions[:destroy].insert_after(Vagrant::Action::VM::ProvisionerCleanup, Vagrant::Hostmaster::Middleware::Remove)
|
13
14
|
|
14
|
-
Vagrant.actions[:provision].
|
15
|
-
Vagrant.actions[:start].
|
15
|
+
Vagrant.actions[:provision].insert_after(Vagrant::Action::VM::Provision, Vagrant::Hostmaster::Middleware::Update)
|
16
|
+
Vagrant.actions[:start].insert_after(Vagrant::Action::VM::Provision, Vagrant::Hostmaster::Middleware::Update)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Hostmaster
|
3
|
+
module Command
|
4
|
+
class Base < Vagrant::Command::Base
|
5
|
+
def execute
|
6
|
+
sub_command = self.class.name.split('::').last.downcase
|
7
|
+
|
8
|
+
parser = OptionParser.new do |opts|
|
9
|
+
opts.banner = "Usage: vagrant hosts #{sub_command} [vm-name]"
|
10
|
+
end
|
11
|
+
|
12
|
+
# Parse the options
|
13
|
+
argv = parse_options(parser)
|
14
|
+
return if !argv
|
15
|
+
|
16
|
+
with_target_vms(argv) do |vm|
|
17
|
+
if vm.created?
|
18
|
+
Hostmaster::VM.new(vm).send sub_command.to_sym
|
19
|
+
else
|
20
|
+
vm.ui.info I18n.t("vagrant.commands.common.vm_not_created")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Success, exit status 0
|
25
|
+
0
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,24 +1,7 @@
|
|
1
1
|
module Vagrant
|
2
2
|
module Hostmaster
|
3
3
|
module Command
|
4
|
-
class List < Vagrant::Command::Base
|
5
|
-
def execute
|
6
|
-
options = OptionParser.new do |opts|
|
7
|
-
opts.banner = "Usage: vagrant hosts list"
|
8
|
-
end
|
9
|
-
|
10
|
-
# Parse the options
|
11
|
-
argv = parse_options(options)
|
12
|
-
return if !argv
|
13
|
-
raise Vagrant::Errors::CLIInvalidUsage, :help => opts.help.chomp if argv.length != 0
|
14
|
-
|
15
|
-
with_target_vms do |vm|
|
16
|
-
Hostmaster::VM.new(vm).list
|
17
|
-
end
|
18
|
-
|
19
|
-
# Success, exit status 0
|
20
|
-
0
|
21
|
-
end
|
4
|
+
class List < Vagrant::Hostmaster::Command::Base
|
22
5
|
end
|
23
6
|
end
|
24
7
|
end
|
@@ -1,23 +1,7 @@
|
|
1
1
|
module Vagrant
|
2
2
|
module Hostmaster
|
3
3
|
module Command
|
4
|
-
class Remove < Vagrant::Command::Base
|
5
|
-
def execute
|
6
|
-
options = OptionParser.new do |opts|
|
7
|
-
opts.banner = "Usage: vagrant hosts remove [<vm-name> [...]]"
|
8
|
-
end
|
9
|
-
|
10
|
-
# Parse the options
|
11
|
-
argv = parse_options(options)
|
12
|
-
return if !argv
|
13
|
-
|
14
|
-
with_target_vms(argv) do |vm|
|
15
|
-
Hostmaster::VM.new(vm).remove
|
16
|
-
end
|
17
|
-
|
18
|
-
# Success, exit status 0
|
19
|
-
0
|
20
|
-
end
|
4
|
+
class Remove < Vagrant::Hostmaster::Command::Base
|
21
5
|
end
|
22
6
|
end
|
23
7
|
end
|
@@ -1,24 +1,7 @@
|
|
1
1
|
module Vagrant
|
2
2
|
module Hostmaster
|
3
3
|
module Command
|
4
|
-
class Update < Vagrant::Command::Base
|
5
|
-
def execute
|
6
|
-
options = OptionParser.new do |opts|
|
7
|
-
opts.banner = "Usage: vagrant hosts update [<vm-name> [...]]"
|
8
|
-
end
|
9
|
-
|
10
|
-
# Parse the options
|
11
|
-
argv = parse_options(options)
|
12
|
-
return if !argv
|
13
|
-
|
14
|
-
with_target_vms(argv) do |vm|
|
15
|
-
@env.ui.info("Updating host entry for #{vm.name} VM. Administrator privileges will be required...", :prefix => false)
|
16
|
-
Hostmaster::VM.new(vm).update
|
17
|
-
end
|
18
|
-
|
19
|
-
# Success, exit status 0
|
20
|
-
0
|
21
|
-
end
|
4
|
+
class Update < Vagrant::Hostmaster::Command::Base
|
22
5
|
end
|
23
6
|
end
|
24
7
|
end
|
@@ -5,46 +5,73 @@ module Vagrant
|
|
5
5
|
class VM
|
6
6
|
extend Forwardable
|
7
7
|
|
8
|
-
def_delegators :@vm, :config, :env, :name, :uuid
|
8
|
+
def_delegators :@vm, :channel, :config, :env, :name, :uuid
|
9
9
|
|
10
10
|
def initialize(vm)
|
11
11
|
@vm = vm
|
12
12
|
end
|
13
13
|
|
14
14
|
def add(options = {})
|
15
|
-
|
16
|
-
|
15
|
+
if process_local?(options)
|
16
|
+
env.ui.info("Adding host entry for #{name} VM. Administrator privileges will be required...") unless options[:quiet]
|
17
|
+
sudo add_command
|
18
|
+
end
|
19
|
+
|
20
|
+
with_other_vms { |vm| channel.sudo vm.add_command(uuid) } if process_guests?(options)
|
17
21
|
end
|
18
22
|
|
19
23
|
def list(options = {})
|
20
|
-
|
24
|
+
if process_local?(options)
|
25
|
+
output = `#{list_command}`.chomp
|
26
|
+
env.ui.info("Local host entry for #{name}...\n#{output}\n\n", :prefix => false) unless output.empty?
|
27
|
+
end
|
28
|
+
|
29
|
+
if process_guests?(options)
|
30
|
+
entries = []
|
31
|
+
with_other_vms do |vm|
|
32
|
+
entry = ""
|
33
|
+
channel.execute(vm.list_command(uuid), :error_check => false) do |type, data|
|
34
|
+
entry << data if type == :stdout
|
35
|
+
end
|
36
|
+
entry.chomp!
|
37
|
+
entries << entry unless entry.empty?
|
38
|
+
end
|
39
|
+
env.ui.info("Guest host #{entries.size > 1 ? 'entries' : 'entry'} on #{name}...\n#{entries.join("\n")}\n\n", :prefix => false) unless entries.empty?
|
40
|
+
end
|
21
41
|
end
|
22
42
|
|
23
43
|
def remove(options = {})
|
24
|
-
|
25
|
-
|
44
|
+
if process_local?(options)
|
45
|
+
env.ui.info("Removing host entry for #{name} VM. Administrator privileges will be required...") unless options[:quiet]
|
46
|
+
sudo remove_command
|
47
|
+
end
|
48
|
+
with_other_vms { |vm| channel.sudo vm.remove_command(uuid) } if process_guests?(options)
|
26
49
|
end
|
27
50
|
|
28
51
|
def update(options = {})
|
29
|
-
|
30
|
-
|
52
|
+
if process_local?(options)
|
53
|
+
env.ui.info("Updating host entry for #{name} VM. Administrator privileges will be required...") unless options[:quiet]
|
54
|
+
sudo(remove_command) && sudo(add_command)
|
55
|
+
end
|
56
|
+
with_other_vms { |vm| channel.sudo(vm.remove_command(uuid)) && channel.sudo(vm.add_command(uuid)) } if process_guests?(options)
|
31
57
|
end
|
32
58
|
|
33
59
|
protected
|
34
|
-
def
|
35
|
-
|
60
|
+
def add_command(uuid = self.uuid)
|
61
|
+
%Q(sh -c 'echo "#{host_entry(uuid)}" >>/etc/hosts')
|
36
62
|
end
|
37
63
|
|
38
|
-
def
|
39
|
-
|
64
|
+
def address
|
65
|
+
# network parameters consist of an address and a hash of options
|
66
|
+
@address ||= (network_parameters && network_parameters.first)
|
40
67
|
end
|
41
68
|
|
42
69
|
def host_aliases
|
43
70
|
@host_aliases ||= Array(config.hosts.aliases)
|
44
71
|
end
|
45
72
|
|
46
|
-
def host_entry
|
47
|
-
|
73
|
+
def host_entry(uuid = self.uuid)
|
74
|
+
%Q(#{address} #{host_names.join(' ')} #{signature(uuid)})
|
48
75
|
end
|
49
76
|
|
50
77
|
def host_name
|
@@ -55,16 +82,48 @@ module Vagrant
|
|
55
82
|
@host_names ||= (Array(host_name) + host_aliases)
|
56
83
|
end
|
57
84
|
|
85
|
+
def process_guests?(options = {})
|
86
|
+
{:guests => true}.merge(options)[:guests]
|
87
|
+
end
|
88
|
+
|
89
|
+
def process_local?(options = {})
|
90
|
+
{:local => true}.merge(options)[:local]
|
91
|
+
end
|
92
|
+
|
93
|
+
def list_command(uuid = self.uuid)
|
94
|
+
%Q(grep '#{signature(uuid)}$' /etc/hosts)
|
95
|
+
end
|
96
|
+
|
58
97
|
def network
|
59
|
-
|
98
|
+
# hostonly networks are the only ones we're interested in
|
99
|
+
@network ||= networks.find { |type,network_parameters| type == :hostonly }
|
60
100
|
end
|
61
101
|
|
62
|
-
def
|
63
|
-
|
102
|
+
def network_parameters
|
103
|
+
# network is a pair of a network type and the network parameters
|
104
|
+
@network_parameters ||= (network && network.last)
|
105
|
+
end
|
106
|
+
|
107
|
+
def networks
|
108
|
+
@networks ||= config.vm.networks
|
109
|
+
end
|
110
|
+
|
111
|
+
def remove_command(uuid = self.uuid)
|
112
|
+
%Q(sed -e '/#{signature(uuid)}$/ d' -ibak /etc/hosts)
|
113
|
+
end
|
114
|
+
|
115
|
+
def signature(uuid = self.uuid)
|
116
|
+
%Q(# VAGRANT: #{uuid} (#{name}))
|
64
117
|
end
|
65
118
|
|
66
119
|
def sudo(command)
|
67
|
-
|
120
|
+
`sudo #{command}`
|
121
|
+
end
|
122
|
+
|
123
|
+
def with_other_vms
|
124
|
+
env.vms.each do |name,vm|
|
125
|
+
yield Hostmaster::VM.new(vm) if vm.config.vm.networks.any? { |type,network_parameters| type == :hostonly } && vm.name != self.name
|
126
|
+
end
|
68
127
|
end
|
69
128
|
end
|
70
129
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 8
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.8.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- S. Brent Faulkner
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2012-08-
|
17
|
+
date: 2012-08-19 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -59,6 +59,7 @@ files:
|
|
59
59
|
- README.md
|
60
60
|
- Rakefile
|
61
61
|
- lib/vagrant/hostmaster.rb
|
62
|
+
- lib/vagrant/hostmaster/command/base.rb
|
62
63
|
- lib/vagrant/hostmaster/command/list.rb
|
63
64
|
- lib/vagrant/hostmaster/command/remove.rb
|
64
65
|
- lib/vagrant/hostmaster/command/root.rb
|