vagrant-hosts-provisioner 1.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3e71f7143025972e9abaa8d937ac44545cff5c4a
4
+ data.tar.gz: f64b81d1d369dc6d7f74c520b1be99543b7b19f1
5
+ SHA512:
6
+ metadata.gz: 4acbd5edb6c4d6a529fc1f607f6ec87f1c6a40c6a4c00fe5107af9993066bbc34253702fa9ded52b3142a41c27daaaf82e583270e104db04a9bd375cc31acbe1
7
+ data.tar.gz: 611aa551f03a4a034b0f6d045941c4d99250f535d13f0195bc9d1001a7d1c22b958eb8305cd31c88825aa57cde6a65f1ab773f21eb88572bd50d440b505eb79a
data/.gitignore ADDED
@@ -0,0 +1,16 @@
1
+ .bundle/
2
+ .yardoc
3
+ Gemfile.lock
4
+ test/single/.vagrant
5
+ test/multi/.vagrant
6
+ _yardoc/
7
+ coverage/
8
+ doc/
9
+ pkg/
10
+ tmp/
11
+ *.gem
12
+ *.bundle
13
+ *.so
14
+ *.o
15
+ *.a
16
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ group :development do
4
+ gem 'vagrant', :git => 'git://github.com/mitchellh/vagrant.git', :tag => 'v1.6.3'
5
+ end
6
+
7
+ group :plugins do
8
+ gemspec
9
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Mohamed Elkholy
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.
data/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # VagrantPlugins::HostsProvisioner
2
+
3
+ A Vagrant provisioner for managing the /etc/hosts file of the host and guest machines. This plugin is currently being used by [#Dashboard VM](https://github.com/mdkholy/Dashboard)..
4
+
5
+ ## Installation
6
+
7
+ Install into vagrant's isolated RubyGems instance using:
8
+
9
+ $ vagrant plugin install vagrant-hosts-provisioner
10
+
11
+ ## Usage
12
+
13
+ TODO: Write usage instructions here
14
+
15
+ ## Contributing
16
+
17
+ 1. Fork it
18
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
19
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
20
+ 4. Push to the branch (`git push origin my-new-feature`)
21
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,22 @@
1
+ require 'bundler/setup'
2
+ require 'bundler/gem_helper'
3
+
4
+ # Immediately sync all stdout so that tools like buildbot can
5
+ # immediately load in the output.
6
+ $stdout.sync = true
7
+ $stderr.sync = true
8
+
9
+ # Change to the directory of this file.
10
+ Dir.chdir(File.expand_path("../", __FILE__))
11
+
12
+ # This installs the tasks that help with gem creation and
13
+ # publishing.
14
+ Bundler::GemHelper.install_tasks
15
+
16
+ task :test_single do
17
+ sh 'bash test/single/test.sh'
18
+ end
19
+
20
+ task :test_multi do
21
+ sh 'bash test/multi/test.sh'
22
+ end
@@ -0,0 +1,18 @@
1
+ require "pathname"
2
+ require "vagrant-hosts-provisioner/plugin"
3
+ require "vagrant-hosts-provisioner/version"
4
+
5
+ module VagrantPlugins
6
+ module HostsProvisioner
7
+ # This returns the path to the source of this plugin.
8
+ #
9
+ # @return [Pathname]
10
+ def self.source_root
11
+ @source_root ||= Pathname.new(File.expand_path('../../', __FILE__))
12
+ end
13
+
14
+ # This initializes the internationalization strings.
15
+ I18n.load_path << File.expand_path("locales/en.yml", self.source_root)
16
+ I18n.reload!
17
+ end
18
+ end
@@ -0,0 +1,67 @@
1
+ module VagrantPlugins
2
+ module HostsProvisioner
3
+ class Config < Vagrant.plugin("2", :config)
4
+ attr_accessor :hostname
5
+ attr_accessor :manage_guest
6
+ attr_accessor :manage_host
7
+ attr_accessor :aliases
8
+ attr_accessor :files
9
+
10
+ def initialize
11
+ @hostname = UNSET_VALUE
12
+ @manage_guest = UNSET_VALUE
13
+ @manage_host = UNSET_VALUE
14
+ @aliases = UNSET_VALUE
15
+ @files = UNSET_VALUE
16
+ end
17
+
18
+ def finalize!
19
+ @hostname = nil if @hostname == UNSET_VALUE
20
+ @manage_guest = false if @manage_guest == UNSET_VALUE
21
+ @manage_host = false if @manage_host == UNSET_VALUE
22
+ @aliases = [] if @aliases == UNSET_VALUE
23
+ @files = [] if @files == UNSET_VALUE
24
+
25
+ @aliases = [ @aliases ].flatten
26
+ @files = [ @files ].flatten
27
+ end
28
+
29
+ def validate(machine)
30
+ errors = []
31
+
32
+ errors << validate_bool('manage_guest', manage_guest)
33
+ errors << validate_bool('manage_host', manage_host)
34
+ errors << validate_array_or_string('aliases', aliases)
35
+ errors << validate_array_or_string('files', files)
36
+ errors.compact!
37
+
38
+ { "HostsProvisioner configuration" => errors }
39
+ end
40
+
41
+ # Checks if a option is boolean
42
+ def validate_bool(key, value)
43
+ if ![TrueClass, FalseClass].include?(value.class) && value != UNSET_VALUE
44
+ I18n.t('vagrant_hostsprovisioner.error.invalid_bool', {
45
+ :config_key => key,
46
+ :invalid_class => value.class.to_s
47
+ })
48
+ else
49
+ nil
50
+ end
51
+ end
52
+
53
+ # Checks if a option is an Array
54
+ def validate_array_or_string(key, value)
55
+ if !aliases.kind_of?(Array) && !aliases.kind_of?(String)
56
+ I18n.t('vagrant_hostsprovisioner.error.not_an_array_or_string', {
57
+ :config_key => key,
58
+ :invalid_class => value.class.to_s
59
+ })
60
+ else
61
+ nil
62
+ end
63
+ end
64
+
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,28 @@
1
+ require "vagrant"
2
+
3
+ # This is a sanity check to make sure no one is attempting to install
4
+ # this into an early Vagrant version.
5
+ if Vagrant::VERSION < "1.5.0"
6
+ raise "Vagrant HostsProvisioner plugin is only compatible with Vagrant 1.5+"
7
+ end
8
+
9
+ module VagrantPlugins
10
+ module HostsProvisioner
11
+ class Plugin < Vagrant.plugin('2')
12
+ name 'HostsProvisioner'
13
+ description <<-DESC
14
+ A Vagrant provisioner for managing the /etc/hosts file of the host and guest machines.
15
+ DESC
16
+
17
+ config(:hostsupdate, :provisioner) do
18
+ require File.expand_path("../config", __FILE__)
19
+ Config
20
+ end
21
+
22
+ provisioner(:hostsupdate) do
23
+ require File.expand_path("../provisioner", __FILE__)
24
+ Provisioner
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,241 @@
1
+ require 'tempfile'
2
+
3
+ module VagrantPlugins
4
+ module HostsProvisioner
5
+ class Provisioner < Vagrant.plugin('2', :provisioner)
6
+
7
+ def initialize(machine, config)
8
+ super
9
+ end
10
+
11
+ def provision
12
+ # Update the guest machine if manage_guest is enabled
13
+ if @config.manage_guest
14
+ update_guest
15
+ end
16
+
17
+ # Update the host machine if manage_host is enabled
18
+ if @config.manage_host
19
+ update_host
20
+ end
21
+ end
22
+
23
+ def update_guest
24
+ return unless @machine.communicate.ready?
25
+
26
+ handle_comm(:stdout, I18n.t("vagrant_hostsprovisioner.provisioner.update_guest"))
27
+
28
+ if (@machine.communicate.test("uname -s | grep SunOS"))
29
+ realhostfile = '/etc/inet/hosts'
30
+ move_cmd = 'mv'
31
+ elsif (@machine.communicate.test("test -d $Env:SystemRoot"))
32
+ windir = ""
33
+ @machine.communicate.execute("echo %SYSTEMROOT%", {:shell => :cmd}) do |type, contents|
34
+ windir << contents.gsub("\r\n", '') if type == :stdout
35
+ end
36
+ realhostfile = "#{windir}\\System32\\drivers\\etc\\hosts"
37
+ move_cmd = 'mv -force'
38
+ else
39
+ realhostfile = '/etc/hosts'
40
+ move_cmd = 'mv -f'
41
+ end
42
+
43
+ # download and modify file with Vagrant-managed entries
44
+ file = @machine.env.tmp_path.join("hosts.#{@machine.name}")
45
+ @machine.communicate.download(realhostfile, file)
46
+ if update_file(file, false)
47
+ # upload modified file and remove temporary file
48
+ @machine.communicate.upload(file, '/tmp/hosts')
49
+ @machine.communicate.sudo("#{move_cmd} /tmp/hosts #{realhostfile}")
50
+ handle_comm(:stdout, I18n.t("vagrant_hostsprovisioner.provisioner.hosts_file_updated", {:file => realhostfile}))
51
+ end
52
+
53
+ begin
54
+ FileUtils.rm(file)
55
+ rescue Exception => e
56
+ end
57
+ end
58
+
59
+ def update_host
60
+ # copy and modify hosts file on host with Vagrant-managed entries
61
+ file = @machine.env.tmp_path.join('hosts.local')
62
+
63
+ handle_comm(:stdout, I18n.t("vagrant_hostsprovisioner.provisioner.update_host"))
64
+
65
+ if WindowsSupport.windows?
66
+ # lazily include windows Module
67
+ class << self
68
+ include WindowsSupport unless include? WindowsSupport
69
+ end
70
+
71
+ hosts_location = "#{ENV['WINDIR']}\\System32\\drivers\\etc\\hosts"
72
+ copy_proc = Proc.new { windows_copy_file(file, hosts_location) }
73
+ else
74
+ hosts_location = '/etc/hosts'
75
+ copy_proc = Proc.new { `sudo cp #{file} #{hosts_location}` }
76
+ end
77
+
78
+ FileUtils.cp(hosts_location, file)
79
+ if update_file(file, true)
80
+ copy_proc.call
81
+ handle_comm(:stdout, I18n.t("vagrant_hostsprovisioner.provisioner.hosts_file_updated", {:file => hosts_location}))
82
+ end
83
+ end
84
+
85
+ def update_file(file, include_id)
86
+ file = Pathname.new(file)
87
+ old_file_content = file.read
88
+ new_file_content = update_content(old_file_content, include_id)
89
+ file.open('w') { |io| io.write(new_file_content) }
90
+ old_file_content != new_file_content
91
+ end
92
+
93
+ def update_content(file_content, include_id)
94
+ id = include_id ? " id: #{read_or_create_id}" : ""
95
+ header = "## vagrant-hosts-provisioner-start#{id}\n"
96
+ footer = "## vagrant-hosts-provisioner-end\n"
97
+ body = get_hosts_file_entry
98
+ get_new_content(header, footer, body, file_content)
99
+ end
100
+
101
+ def get_hosts_file_entry
102
+ # Get the vm ip address
103
+ ip = get_ip_address
104
+
105
+ # Return empy string if we don't have an ip address
106
+ if ip === nil
107
+ handle_comm(:stderr, I18n.t("vagrant_hostsprovisioner.error.no_vm_ip"))
108
+ return ''
109
+ end
110
+
111
+ # Add the machine hostname
112
+ hosts = []
113
+ unless @config.hostname === false
114
+ hosts.push(@config.hostname || @machine.config.vm.hostname || @machine.name)
115
+ end
116
+
117
+ # Add the defined aliases
118
+ hosts.concat(@config.aliases)
119
+
120
+ # Add the contents of the defined hosts files
121
+ if @config.files.count > 0
122
+ hosts.concat(get_files_data)
123
+ end
124
+
125
+ # Remove duplicates
126
+ hosts = hosts.uniq.join(' ').strip
127
+
128
+ "#{ip}\t#{hosts}\n"
129
+ end
130
+
131
+ def get_files_data
132
+ require 'json'
133
+ data = []
134
+ @config.files.each do |file|
135
+ file_path = File.join(@machine.env.root_path, file)
136
+ if File.exist?(file_path)
137
+ file_data = JSON.parse(File.read(file_path))
138
+ data.concat([ file_data ].flatten)
139
+ else
140
+ handle_comm(:stderr, I18n.t("vagrant_hostsprovisioner.error.file_not_found", {:file => file.to_s}))
141
+ end
142
+ end
143
+ data.collect(&:strip)
144
+ end
145
+
146
+ def get_ip_address
147
+ ip = nil
148
+ @machine.config.vm.networks.each do |network|
149
+ key, options = network[0], network[1]
150
+ ip = options[:ip] if key == :private_network
151
+ break if ip
152
+ end
153
+ # If no ip is defined in private_network then use the ssh host ip instead
154
+ ip || (@machine.ssh_info ? @machine.ssh_info[:host] : nil)
155
+ end
156
+
157
+ def get_new_content(header, footer, body, old_content)
158
+ if body.empty?
159
+ block = "\n"
160
+ else
161
+ block = "\n\n" + header + body + footer + "\n"
162
+ end
163
+ # Pattern for finding existing block
164
+ header_pattern = Regexp.quote(header)
165
+ footer_pattern = Regexp.quote(footer)
166
+ pattern = Regexp.new("\n*#{header_pattern}.*?#{footer_pattern}\n*", Regexp::MULTILINE)
167
+ # Replace existing block or append
168
+ old_content.match(pattern) ? old_content.sub(pattern, block) : old_content.rstrip + block
169
+ end
170
+
171
+ def read_or_create_id
172
+ file = Pathname.new("#{@machine.env.local_data_path}/hostsprovisioner/#{@machine.name}")
173
+ if (file.file?)
174
+ id = file.read.strip
175
+ else
176
+ id = SecureRandom.uuid
177
+ file.dirname.mkpath
178
+ file.open('w') { |f| f.write(id) }
179
+ end
180
+ id
181
+ end
182
+
183
+ ## Windows support for copying files, requesting elevated privileges if necessary
184
+ module WindowsSupport
185
+ require 'rbconfig'
186
+
187
+ def self.windows?
188
+ RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
189
+ end
190
+
191
+ require 'win32ole' if windows?
192
+
193
+ def windows_copy_file(source, dest)
194
+ begin
195
+ # First, try Ruby copy
196
+ FileUtils.cp(source, dest)
197
+ rescue Errno::EACCES
198
+ # Access denied, try with elevated privileges
199
+ windows_copy_file_elevated(source, dest)
200
+ end
201
+ end
202
+
203
+ private
204
+
205
+ def windows_copy_file_elevated(source, dest)
206
+ # copy command only supports backslashes as separators
207
+ source, dest = [source, dest].map { |s| s.to_s.gsub(/\//, '\\') }
208
+
209
+ # run 'cmd /C copy ...' with elevated privilege, minimized
210
+ copy_cmd = "copy \"#{source}\" \"#{dest}\""
211
+ WIN32OLE.new('Shell.Application').ShellExecute('cmd', "/C #{copy_cmd}", nil, 'runas', 7)
212
+
213
+ # Unfortunately, ShellExecute does not give us a status code,
214
+ # and it is non-blocking so we can't reliably compare the file contents
215
+ # to see if they were copied.
216
+ #
217
+ # If the user rejects the UAC prompt, vagrant will silently continue
218
+ # without updating the hostsfile.
219
+ end
220
+ end
221
+
222
+ # This handles outputting the communication data back to the UI
223
+ def handle_comm(type, data)
224
+ if [:stderr, :stdout].include?(type)
225
+ # Output the data with the proper color based on the stream.
226
+ color = type == :stdout ? :green : :red
227
+
228
+ # Clear out the newline since we add one
229
+ data = data.chomp
230
+ return if data.empty?
231
+
232
+ options = {}
233
+ options[:color] = color
234
+
235
+ @machine.ui.info(data.chomp, options)
236
+ end
237
+ end
238
+
239
+ end
240
+ end
241
+ end
@@ -0,0 +1,5 @@
1
+ module VagrantPlugins
2
+ module HostsProvisioner
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
data/locales/en.yml ADDED
@@ -0,0 +1,11 @@
1
+ en:
2
+ vagrant_hostsprovisioner:
3
+ provisioner:
4
+ update_guest: "Updating hosts file on the guest machine..."
5
+ update_host: "Updating hosts file on the host machine (password may be required)..."
6
+ hosts_file_updated: "'%{file}' file updated successfully"
7
+ error:
8
+ invalid_bool: "Invalid data type '%{invalid_class}' provided for %{config_key}, expected 'boolean' value"
9
+ not_an_array_or_string: "Invalid data type '%{invalid_class}' provided for %{config_key}, expected an Array or String"
10
+ no_vm_ip: "Unable to find the ip address of the guest machine"
11
+ file_not_found: "Unable to find the file '%{file}'"
@@ -0,0 +1,43 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ Vagrant.configure('2') do |config|
5
+
6
+ config.vm.box = 'ubuntu/trusty64'
7
+
8
+ config.vm.hostname = "multi-testbox"
9
+
10
+ config.vm.define :mark do |node|
11
+ node.vm.hostname = 'mark'
12
+ node.vm.network :private_network, :ip => '10.0.5.2'
13
+ node.vm.provision :hostsupdate do |provision|
14
+ provision.hostname = 'mark-hostname.dev'
15
+ provision.manage_guest = true
16
+ provision.manage_host = true
17
+ provision.aliases = ['mark-aliase1', 'mark-aliase2']
18
+ end
19
+ end
20
+
21
+ config.vm.define :john do |node|
22
+ node.vm.hostname = 'john'
23
+ node.vm.network :private_network, :ip => '10.0.5.3'
24
+ node.vm.provision :hostsupdate do |provision|
25
+ provision.hostname = 'john-hostname.dev'
26
+ provision.manage_guest = true
27
+ provision.manage_host = true
28
+ provision.aliases = ['john-aliase1', 'john-aliase2']
29
+ provision.files = ['config/hosts.json']
30
+ end
31
+ end
32
+
33
+ config.vm.define :brad do |node|
34
+ node.vm.hostname = 'brad'
35
+ node.vm.network :private_network, :ip => '10.0.5.4'
36
+ node.vm.provision :hostsupdate do |provision|
37
+ provision.manage_guest = true
38
+ provision.manage_host = true
39
+ provision.files = ['config/notfile.json']
40
+ end
41
+ end
42
+
43
+ end
@@ -0,0 +1 @@
1
+ ["local.dev","www.local.dev","localhost.dev","www.localhost.dev"]
@@ -0,0 +1,16 @@
1
+ cd test
2
+
3
+ vagrant up
4
+
5
+ echo "[mark] /etc/hosts file:"
6
+ vagrant ssh mark -c 'cat /etc/hosts'
7
+
8
+ echo "[john] /etc/hosts file:"
9
+ vagrant ssh john -c 'cat /etc/hosts'
10
+
11
+ echo "[brad] /etc/hosts file:"
12
+ vagrant ssh brad -c 'cat /etc/hosts'
13
+
14
+ vagrant destroy -f
15
+
16
+ cd ..
@@ -0,0 +1,18 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ Vagrant.configure('2') do |config|
5
+
6
+ config.vm.box = 'ubuntu/trusty64'
7
+
8
+ config.vm.hostname = "single-testbox"
9
+
10
+ config.vm.provision :hostsupdate do |host|
11
+ host.hostname = 'single-testbox-hostname'
12
+ host.manage_guest = true
13
+ host.manage_host = true
14
+ host.aliases = ['testbox-aliase1', 'testbox-aliase2']
15
+ host.files = ['config/hosts.json']
16
+ end
17
+
18
+ end
@@ -0,0 +1 @@
1
+ ["local.dev","www.local.dev","localhost.dev","www.localhost.dev"]
@@ -0,0 +1,10 @@
1
+ cd test
2
+
3
+ vagrant up
4
+
5
+ echo "/etc/hosts file:"
6
+ vagrant ssh -c 'cat /etc/hosts'
7
+
8
+ vagrant destroy -f
9
+
10
+ cd ..
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'vagrant-hosts-provisioner/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "vagrant-hosts-provisioner"
9
+ spec.version = VagrantPlugins::HostsProvisioner::VERSION
10
+ spec.authors = ["Mohamed Elkholy"]
11
+ spec.email = ["mkh117@gmail.com"]
12
+ spec.description = %q{A Vagrant provisioner for managing the /etc/hosts file of the host and guest machines.}
13
+ spec.summary = spec.description
14
+ spec.homepage = "https://github.com/mdkholy/Dashboard"
15
+ spec.license = "MIT"
16
+ spec.rubyforge_project = "vagrant-hosts-provisioner"
17
+
18
+ spec.files = `git ls-files`.split($/)
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_development_dependency 'bundler', '~> 1.3'
23
+ spec.add_development_dependency 'rake'
24
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vagrant-hosts-provisioner
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Mohamed Elkholy
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-31 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 provisioner for managing the /etc/hosts file of the host and
42
+ guest machines.
43
+ email:
44
+ - mkh117@gmail.com
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-hosts-provisioner.rb
55
+ - lib/vagrant-hosts-provisioner/config.rb
56
+ - lib/vagrant-hosts-provisioner/plugin.rb
57
+ - lib/vagrant-hosts-provisioner/provisioner.rb
58
+ - lib/vagrant-hosts-provisioner/version.rb
59
+ - locales/en.yml
60
+ - test/multi/Vagrantfile
61
+ - test/multi/config/hosts.json
62
+ - test/multi/test.sh
63
+ - test/single/Vagrantfile
64
+ - test/single/config/hosts.json
65
+ - test/single/test.sh
66
+ - vagrant-hosts-provisioner.gemspec
67
+ homepage: https://github.com/mdkholy/Dashboard
68
+ licenses:
69
+ - MIT
70
+ metadata: {}
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - '>='
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ requirements: []
86
+ rubyforge_project: vagrant-hosts-provisioner
87
+ rubygems_version: 2.4.1
88
+ signing_key:
89
+ specification_version: 4
90
+ summary: A Vagrant provisioner for managing the /etc/hosts file of the host and guest
91
+ machines.
92
+ test_files:
93
+ - test/multi/Vagrantfile
94
+ - test/multi/config/hosts.json
95
+ - test/multi/test.sh
96
+ - test/single/Vagrantfile
97
+ - test/single/config/hosts.json
98
+ - test/single/test.sh