vagrant-mount 0.0.1
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 +7 -0
- data/.gitignore +17 -0
- data/.rbenv-gemsets +1 -0
- data/.rspec +1 -0
- data/Gemfile +72 -0
- data/LICENSE.txt +22 -0
- data/README.md +2 -0
- data/Rakefile +31 -0
- data/lib/vagrant-mount/actions/providers/virtualbox/action/message_not_mounted.rb +16 -0
- data/lib/vagrant-mount/actions/providers/virtualbox/action/message_not_unmounted.rb +16 -0
- data/lib/vagrant-mount/actions/providers/virtualbox/action/mount.rb +19 -0
- data/lib/vagrant-mount/actions/providers/virtualbox/action/unmount.rb +28 -0
- data/lib/vagrant-mount/actions/providers/virtualbox/action.rb +48 -0
- data/lib/vagrant-mount/actions/providers/virtualbox/driver/base.rb +155 -0
- data/lib/vagrant-mount/actions/providers/virtualbox/driver/meta.rb +9 -0
- data/lib/vagrant-mount/actions/providers/virtualbox/driver.rb +2 -0
- data/lib/vagrant-mount/actions/providers/vmware-fusion/action/message_not_mounted.rb +16 -0
- data/lib/vagrant-mount/actions/providers/vmware-fusion/action/message_not_unmounted.rb +16 -0
- data/lib/vagrant-mount/actions/providers/vmware-fusion/action/mount.rb +19 -0
- data/lib/vagrant-mount/actions/providers/vmware-fusion/action/unmount.rb +27 -0
- data/lib/vagrant-mount/actions/providers/vmware-fusion/action.rb +47 -0
- data/lib/vagrant-mount/actions/providers/vmware-fusion/driver/base.rb +84 -0
- data/lib/vagrant-mount/actions/providers/vmware-fusion/driver.rb +1 -0
- data/lib/vagrant-mount/commands/mount.rb +39 -0
- data/lib/vagrant-mount/commands/unmount.rb +39 -0
- data/lib/vagrant-mount/plugin.rb +78 -0
- data/lib/vagrant-mount/version.rb +5 -0
- data/lib/vagrant-mount.rb +18 -0
- data/locales/en.yml +26 -0
- data/spec/Vagrantfile +27 -0
- data/spec/command_spec.rb +28 -0
- data/spec/dummy.iso +0 -0
- data/spec/helpers/isolated_environment.rb +52 -0
- data/vagrant-mount.gemspec +28 -0
- metadata +138 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 656e36f4eda550bc886cd4ffc1491e7b014e47dc
|
4
|
+
data.tar.gz: 47c9ebc0ae2a0060aea61a82abddd39b1c55afea
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e1995672d620827690a0f8b917c70f5d311820ab9e71d676fba566ffece9d2b3df2c1d2876bb52ed43f77fcfd6f7e43852f97b73c40efa13811dc20741e5593f
|
7
|
+
data.tar.gz: a45c015231cff289e972136212c6fffe1384ebae4c93ac61a03736ef6b3abb7e1a7e50609276a3ad2eb459b52b0fba142c48de4a836210ba4aaab25cbb3461af
|
data/.gitignore
ADDED
data/.rbenv-gemsets
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
.gems
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color --format documentation
|
data/Gemfile
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
source 'http://rubygems.org'
|
2
|
+
|
3
|
+
def which(command, *additional_paths)
|
4
|
+
extensions = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
5
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).push(*additional_paths).each do |path|
|
6
|
+
extensions.each do |extension|
|
7
|
+
filepath = File.join(path, "#{command}#{extension}")
|
8
|
+
return filepath if File.executable?(filepath) && !File.directory?(filepath)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
return nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def has_vmware_fusion?
|
15
|
+
return ! which('vmrun', '/Applications/VMware Fusion.app/Contents/Library').nil?
|
16
|
+
end
|
17
|
+
|
18
|
+
vagrant_locations = %w{ /Applications/Vagrant/embedded /opt/vagrant/embedded C:/HashiCorp/Vagrant/embedded }
|
19
|
+
vagrant_location = vagrant_locations.find {|location| File.directory? location }
|
20
|
+
|
21
|
+
if vagrant_location
|
22
|
+
ENV['VAGRANT_INSTALLER_EMBEDDED_DIR'] = vagrant_location
|
23
|
+
puts "Using vagrant from #{vagrant_location}" if $DEBUG
|
24
|
+
else
|
25
|
+
STDERR.puts 'Could not find an official install of vagrant! The RubyEncoder libraries will not work.'
|
26
|
+
exit 1
|
27
|
+
end
|
28
|
+
|
29
|
+
puts "We can use VMWare Fusion" if has_vmware_fusion? && $DEBUG
|
30
|
+
|
31
|
+
group :development do
|
32
|
+
gem 'winrm', '~> 1.1.3'
|
33
|
+
gem 'vagrant', github: 'mitchellh/vagrant', tag: 'v1.7.2'
|
34
|
+
gem 'rake'
|
35
|
+
|
36
|
+
if has_vmware_fusion?
|
37
|
+
require 'fileutils'
|
38
|
+
|
39
|
+
begin
|
40
|
+
STDERR.puts "Loading gem vagrant-vmware-fusion" if $DEBUG
|
41
|
+
gem 'vagrant-vmware-fusion', source: 'http://gems.hashicorp.com'
|
42
|
+
STDERR.puts "Finding where gem vagrant-vmware-fusion is installed" if $DEBUG
|
43
|
+
fusion_location = Gem::Specification.find_by_name('vagrant-vmware-fusion').gem_dir
|
44
|
+
puts "VMWare fusion gem is in #{fusion_location}" if $DEBUG
|
45
|
+
|
46
|
+
gem 'rgloader'
|
47
|
+
unless Dir.exists? File.join(fusion_location, 'rgloader')
|
48
|
+
STDERR.puts "Linking local 'rgloader' file to embedded installer" if $DEBUG
|
49
|
+
FileUtils.ln_s(
|
50
|
+
File.join(ENV['VAGRANT_INSTALLER_EMBEDDED_DIR'], 'rgloader'),
|
51
|
+
File.join(fusion_location, 'rgloader')
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
unless File.symlink?(File.join(fusion_location, 'license-vagrant-vmware-fusion.lic'))
|
56
|
+
STDERR.puts "Linking your license file for vmware plugin" if $DEBUG
|
57
|
+
vagrant_home = ENV["VAGRANT_HOME"] || File.join(ENV['HOME'], '.vagrant.d')
|
58
|
+
FileUtils.ln_s(
|
59
|
+
File.join(vagrant_home, 'license-vagrant-vmware-fusion.lic'),
|
60
|
+
File.join(fusion_location, 'license-vagrant-vmware-fusion.lic')
|
61
|
+
)
|
62
|
+
end
|
63
|
+
rescue Gem::LoadError
|
64
|
+
STDERR.puts "Cannot load Vagrant VMWare plugin. #{$!}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
group :plugins do
|
70
|
+
gem 'vagrant-vmware-fusion', source: 'http://gems.hashicorp.com' if has_vmware_fusion?
|
71
|
+
gemspec
|
72
|
+
end
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Gildas Cherruel
|
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
data/Rakefile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'yard'
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
|
7
|
+
$stdout.sync = true
|
8
|
+
$stderr.sync = true
|
9
|
+
|
10
|
+
# Change to the directory of this file
|
11
|
+
Dir.chdir(File.expand_path("../", __FILE__))
|
12
|
+
|
13
|
+
# Tasks to help with gem creation and publishing
|
14
|
+
Bundler::GemHelper.install_tasks
|
15
|
+
|
16
|
+
# Test tasks with RSpec
|
17
|
+
RSpec::Core::RakeTask.new
|
18
|
+
|
19
|
+
# Documentation tasks
|
20
|
+
YARD::Rake::YardocTask.new do |t|
|
21
|
+
t.files = ['lib/**/*.rb']
|
22
|
+
end
|
23
|
+
|
24
|
+
# Build the ctags fo vim
|
25
|
+
desc "Builds the tags"
|
26
|
+
task :ctags do
|
27
|
+
%x[ git ls-files | ctags --tag-relative --sort=no --exclude=.idea -L - -f ".git/tags" ]
|
28
|
+
end
|
29
|
+
|
30
|
+
# By default we test the gem
|
31
|
+
task :default => 'spec'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ProviderVirtualBox
|
3
|
+
module Action
|
4
|
+
class MessageNotMounted
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
env[:ui].info(I18n.t('vagrant_mount.errors.vm.mount.not_mounted', mount: env[:mount_point]))
|
11
|
+
@app.call(env)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ProviderVirtualBox
|
3
|
+
module Action
|
4
|
+
class MessageNotUnmounted
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
env[:ui].info(I18n.t('vagrant_mount.errors.vm.unmount.not_unmounted', mount: env[:mount_point]))
|
11
|
+
@app.call(env)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ProviderVirtualBox
|
3
|
+
module Action
|
4
|
+
class Mount
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
@env = env
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
env[:ui].info(I18n.t('vagrant_mount.actions.vm.mount.mounting', mount: env[:mount_point]))
|
12
|
+
env[:result] = env[:machine].provider.driver.mount(env[:mount_point])
|
13
|
+
env[:ui].info(I18n.t('vagrant_mount.actions.vm.mount.mounted', mount: env[:mount_point]))
|
14
|
+
@app.call(env)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
module VagrantPlugins
|
3
|
+
module ProviderVirtualBox
|
4
|
+
module Action
|
5
|
+
class Unmount
|
6
|
+
def initialize(app, env)
|
7
|
+
@app = app
|
8
|
+
@env = env
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
if env[:mount_point]
|
13
|
+
env[:ui].info(I18n.t('vagrant_mount.actions.vm.unmount.unmounting', mount: env[:mount_point]))
|
14
|
+
else
|
15
|
+
env[:ui].info(I18n.t('vagrant_mount.actions.vm.unmount.unmounting_all'))
|
16
|
+
end
|
17
|
+
env[:result] = env[:machine].provider.driver.unmount(env[:mount_point], env[:remove_device])
|
18
|
+
if env[:mount_point]
|
19
|
+
env[:ui].info(I18n.t('vagrant_mount.actions.vm.unmount.unmounted', mount: env[:mount_point]))
|
20
|
+
else
|
21
|
+
env[:ui].info(I18n.t('vagrant_mount.actions.vm.unmount.unmounted_all'))
|
22
|
+
end
|
23
|
+
@app.call(env)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
require 'vagrant/action/builder'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module ProviderVirtualBox
|
6
|
+
module Action
|
7
|
+
autoload :Mount, File.expand_path("../action/mount.rb", __FILE__)
|
8
|
+
autoload :Unmount, File.expand_path("../action/unmount.rb", __FILE__)
|
9
|
+
autoload :MessageNotMounted, File.expand_path("../action/message_not_mounted.rb", __FILE__)
|
10
|
+
|
11
|
+
def self.action_mount
|
12
|
+
Vagrant::Action::Builder.new.tap do |builder|
|
13
|
+
builder.use CheckVirtualbox
|
14
|
+
builder.use Call, Created do |created_env, created_builder|
|
15
|
+
if created_env[:result]
|
16
|
+
created_builder.use CheckAccessible
|
17
|
+
created_builder.use Call, Mount do |mount_env, mount_builder|
|
18
|
+
unless mount_env[:result]
|
19
|
+
mount_builder.use MessageNotMounted
|
20
|
+
end
|
21
|
+
end
|
22
|
+
else
|
23
|
+
created_builder.use MessageNotCreated
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.action_unmount
|
30
|
+
Vagrant::Action::Builder.new.tap do |builder|
|
31
|
+
builder.use CheckVirtualbox
|
32
|
+
builder.use Call, Created do |created_env, created_builder|
|
33
|
+
if created_env[:result]
|
34
|
+
created_builder.use CheckAccessible
|
35
|
+
created_builder.use Call, Unmount do |unmount_env, unmount_builder|
|
36
|
+
unless unmount_env[:result]
|
37
|
+
unmount_builder.use MessageNotUnmounted
|
38
|
+
end
|
39
|
+
end
|
40
|
+
else
|
41
|
+
created_builder.use MessageNotCreated
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ProviderVirtualBox
|
3
|
+
module Driver
|
4
|
+
class Base
|
5
|
+
def mount(mount_point)
|
6
|
+
# Find an IDE or SCSI controller
|
7
|
+
@logger.debug "Mounting #{mount_point}"
|
8
|
+
info = get_vm_info(@uuid)
|
9
|
+
begin
|
10
|
+
controller_name, device_id, port_id = find_iso(info, mount_point)
|
11
|
+
@logger.debug "Already mounted on #{controller_name}, device: #{device_id}, port: #{port_id}"
|
12
|
+
return 1
|
13
|
+
rescue KeyError
|
14
|
+
@logger.debug "Not mounted yet, we are good to go"
|
15
|
+
end
|
16
|
+
ide_types = ['PIIX3', 'PIIX4', 'ICH6']
|
17
|
+
controller_name, device_id, port_id = find_free_port(info, ide_types)
|
18
|
+
execute('storageattach', @uuid,
|
19
|
+
'--storagectl', controller_name,
|
20
|
+
'--device', device_id.to_s,
|
21
|
+
'--port', port_id.to_s,
|
22
|
+
'--type', 'dvddrive',
|
23
|
+
'--medium', mount_point
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
def unmount(mount_point, remove_device=false)
|
28
|
+
# Find an IDE or SCSI controller
|
29
|
+
@logger.debug "Mounting #{mount_point}"
|
30
|
+
info = get_vm_info(@uuid)
|
31
|
+
begin
|
32
|
+
if mount_point
|
33
|
+
controller_name, device_id, port_id = find_iso(info, mount_point)
|
34
|
+
else
|
35
|
+
controller_name, device_id, port_id = find_first_iso(info)
|
36
|
+
end
|
37
|
+
@logger.debug "Mounted on #{controller_name}, device: #{device_id}, port: #{port_id}"
|
38
|
+
if remove_device
|
39
|
+
execute('storageattach', @uuid,
|
40
|
+
'--storagectl', controller_name,
|
41
|
+
'--device', device_id.to_s,
|
42
|
+
'--port', port_id.to_s,
|
43
|
+
'--medium', 'none'
|
44
|
+
)
|
45
|
+
else
|
46
|
+
execute('storageattach', @uuid,
|
47
|
+
'--storagectl', controller_name,
|
48
|
+
'--device', device_id.to_s,
|
49
|
+
'--port', port_id.to_s,
|
50
|
+
'--type', 'dvddrive',
|
51
|
+
'--medium', 'emptydrive'
|
52
|
+
)
|
53
|
+
end
|
54
|
+
rescue KeyError
|
55
|
+
@logger.debug "Not mounted, we cannot proceed"
|
56
|
+
return 0
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def find_iso(vm_info, mount_point)
|
61
|
+
device_id = port_id = nil
|
62
|
+
controller = vm_info[:storagecontrollers].find do |ctrl|
|
63
|
+
device_id = ctrl[:devices].find_index do |device|
|
64
|
+
port_id = device[:ports].find_index do |port|
|
65
|
+
port[:mount].include? mount_point if port
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
raise KeyError unless controller
|
70
|
+
@logger.debug "Found ISO on Storage: #{controller[:name]}, device ##{device_id}, port ##{port_id}"
|
71
|
+
return [controller[:name], device_id, port_id]
|
72
|
+
end
|
73
|
+
|
74
|
+
def find_first_iso(vm_info)
|
75
|
+
device_id = port_id = nil
|
76
|
+
controller = vm_info[:storagecontrollers].find do |ctrl|
|
77
|
+
device_id = ctrl[:devices].find_index do |device|
|
78
|
+
port_id = device[:ports].find_index do |port|
|
79
|
+
port[:mount] =~ /\.iso$/i if port
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
raise KeyError unless controller
|
84
|
+
@logger.debug "Found ISO on Storage: #{controller[:name]}, device ##{device_id}, port ##{port_id}"
|
85
|
+
return [controller[:name], device_id, port_id]
|
86
|
+
end
|
87
|
+
|
88
|
+
def find_free_port(vm_info, controller_types)
|
89
|
+
device_id = port_id = nil
|
90
|
+
controller = vm_info[:storagecontrollers].find do |ctrl|
|
91
|
+
device_id = ctrl[:devices].find_index do |device|
|
92
|
+
port_id = device[:ports].find_index do |port|
|
93
|
+
port.nil? || port[:mount] == 'emptydrive'
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
raise KeyError, "No suitable Controller on VM #{@uuid}" unless controller
|
98
|
+
@logger.debug "Found a suitable Storage: #{controller[:name]}, device ##{device_id}, port ##{port_id}"
|
99
|
+
return [controller[:name], device_id, port_id]
|
100
|
+
end
|
101
|
+
|
102
|
+
def get_vm_info(name_or_uuid)
|
103
|
+
@logger.debug "Fetching info for VM #{name_or_uuid}"
|
104
|
+
output = execute('showvminfo', name_or_uuid, '--machinereadable', retryable: true)
|
105
|
+
nic_index = nil
|
106
|
+
output.split("\n").inject({storagecontrollers: [], nics: [], lpts: [], uarts: []}) do |hash, line|
|
107
|
+
if line =~ /^"?([^="]+)"?="?(|[^"]+)"?$/
|
108
|
+
key = $1
|
109
|
+
value = $2.to_s
|
110
|
+
case key
|
111
|
+
when /^storagecontroller([a-z]+)(\d+)$/
|
112
|
+
key = $1.tr('- ', '__').to_sym
|
113
|
+
controller = hash[:storagecontrollers][$2.to_i]
|
114
|
+
if controller
|
115
|
+
controller[key] = value
|
116
|
+
if key == :portcount
|
117
|
+
controller[:devices] = value.to_i.times.inject([]) {|array| array << { ports: [nil, nil] } }
|
118
|
+
end
|
119
|
+
else
|
120
|
+
hash[:storagecontrollers] << { key => value }
|
121
|
+
end
|
122
|
+
when /^([a-zA-Z ]+)(?:-([a-zA-Z]+))?-(\d+)-(\d+)$/
|
123
|
+
unless value == 'none'
|
124
|
+
key = ($2 || 'mount').tr('- ', '__').to_sym
|
125
|
+
controller = hash[:storagecontrollers].find { |s| s[:name] == $1 }
|
126
|
+
raise KeyError, $1 unless controller
|
127
|
+
device = controller[:devices][$4.to_i]
|
128
|
+
raise IndexError, $4.to_i unless device
|
129
|
+
raise IndexError, $3.to_i unless $3.to_i < 2
|
130
|
+
device[:ports][$3.to_i] ||= {}
|
131
|
+
device[:ports][$3.to_i][key] = value
|
132
|
+
end
|
133
|
+
when /^natnet(\d+)$/
|
134
|
+
nic_index = $1.to_i - 1
|
135
|
+
hash[:nics][nic_index] ||= { forwardings: [] }
|
136
|
+
hash[:nics][nic_index][:natnet] = value
|
137
|
+
when /^(cableconnected|macaddress|nic|nictype|nicspeed)(\d+)$/
|
138
|
+
hash[:nics][$2.to_i - 1][$1.to_sym] = value unless value == 'none'
|
139
|
+
when /^(mtu|sockSnd|sockRcv|tcpWndSnd|tcpWndRcv)$/
|
140
|
+
hash[:nics][nic_index][$1.to_sym] = value
|
141
|
+
when /^Forwarding\((\d+)\)$/
|
142
|
+
hash[:nics][nic_index][:forwardings][$1.to_i] = value
|
143
|
+
when /^(lpt|uart)(\d+)$/
|
144
|
+
hash[($1 << 's').to_sym][$2.to_i - 1] = value
|
145
|
+
else
|
146
|
+
hash[key.tr('- ','__').to_sym] = value
|
147
|
+
end
|
148
|
+
end
|
149
|
+
hash
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module HashiCorp
|
2
|
+
module VagrantVMwarefusion
|
3
|
+
module Action
|
4
|
+
class MessageNotMounted
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
env[:ui].info(I18n.t('vagrant_mount.errors.vm.mount.not_mounted', mount: env[:mount_point]))
|
11
|
+
@app.call(env)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module HashiCorp
|
2
|
+
module VagrantVMwarefusion
|
3
|
+
module Action
|
4
|
+
class MessageNotUnmounted
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
env[:ui].info(I18n.t('vagrant_mount.errors.vm.unmount.not_unmounted', mount: env[:mount_point]))
|
11
|
+
@app.call(env)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module HashiCorp
|
2
|
+
module VagrantVMwarefusion
|
3
|
+
module Action
|
4
|
+
class Mount
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
@env = env
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
env[:ui].info(I18n.t('vagrant_mount.actions.vm.mount.mounting', mount: env[:mount_point]))
|
12
|
+
env[:result] = env[:machine].provider.driver.mount(env[:mount_point])
|
13
|
+
env[:ui].info(I18n.t('vagrant_mount.actions.vm.mount.mounted', mount: env[:mount_point]))
|
14
|
+
@app.call(env)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module HashiCorp
|
2
|
+
module VagrantVMwarefusion
|
3
|
+
module Action
|
4
|
+
class Unmount
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
@env = env
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
if env[:mount_point]
|
12
|
+
env[:ui].info(I18n.t('vagrant_mount.actions.vm.unmount.unmounting', mount: env[:mount_point]))
|
13
|
+
else
|
14
|
+
env[:ui].info(I18n.t('vagrant_mount.actions.vm.unmount.unmounting_all'))
|
15
|
+
end
|
16
|
+
env[:result] = env[:machine].provider.driver.unmount(env[:mount_point], env[:remove_device])
|
17
|
+
if env[:mount_point]
|
18
|
+
env[:ui].info(I18n.t('vagrant_mount.actions.vm.unmount.unmounted', mount: env[:mount_point]))
|
19
|
+
else
|
20
|
+
env[:ui].info(I18n.t('vagrant_mount.actions.vm.unmount.unmounted_all'))
|
21
|
+
end
|
22
|
+
@app.call(env)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'vagrant'
|
2
|
+
require 'vagrant/action/builder'
|
3
|
+
|
4
|
+
module HashiCorp
|
5
|
+
module VagrantVMwarefusion
|
6
|
+
module Action
|
7
|
+
autoload :Mount, File.expand_path("../action/mount.rb", __FILE__)
|
8
|
+
autoload :Unmount, File.expand_path("../action/unmount.rb", __FILE__)
|
9
|
+
autoload :MessageNotMounted, File.expand_path("../action/message_not_mounted.rb", __FILE__)
|
10
|
+
autoload :MessageNotUnmounted, File.expand_path("../action/message_not_unmounted.rb", __FILE__)
|
11
|
+
|
12
|
+
def self.action_mount
|
13
|
+
Vagrant::Action::Builder.new.tap do |builder|
|
14
|
+
builder.use CheckVMware
|
15
|
+
builder.use Call, Created do |created_env, created_builder|
|
16
|
+
if created_env[:result]
|
17
|
+
created_builder.use Call, Mount do |mount_env, mount_builder|
|
18
|
+
unless mount_env[:result]
|
19
|
+
mount_builder.use MessageNotMounted
|
20
|
+
end
|
21
|
+
end
|
22
|
+
else
|
23
|
+
created_builder.use MessageNotCreated
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.action_unmount
|
30
|
+
Vagrant::Action::Builder.new.tap do |builder|
|
31
|
+
builder.use CheckVMware
|
32
|
+
builder.use Call, Created do |created_env, created_builder|
|
33
|
+
if created_env[:result]
|
34
|
+
created_builder.use Call, Unmount do |unmount_env, unmount_builder|
|
35
|
+
unless unmount_env[:result]
|
36
|
+
unmount_builder.use MessageNotUnmounted
|
37
|
+
end
|
38
|
+
end
|
39
|
+
else
|
40
|
+
created_builder.use MessageNotCreated
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
module HashiCorp
|
4
|
+
module VagrantVMwarefusion
|
5
|
+
module Driver
|
6
|
+
class Base
|
7
|
+
def mount(mount_point)
|
8
|
+
@logger.info "Mounting #{mount_point}"
|
9
|
+
info = vminfo(vmx_path)
|
10
|
+
begin
|
11
|
+
controller_name = find_iso(info, mount_point)
|
12
|
+
@logger.debug "Already mounted on #{controller_name}"
|
13
|
+
return 1
|
14
|
+
rescue KeyError
|
15
|
+
@logger.debug "Not mounted, we are good to go"
|
16
|
+
end
|
17
|
+
begin
|
18
|
+
controller_name = find_free_port(info)
|
19
|
+
@logger.info "Mounting on: #{controller_name}"
|
20
|
+
info["#{controller_name}.devicetype"] = "cdrom-image"
|
21
|
+
info["#{controller_name}.filename"] = Pathname.new(mount_point).realpath.to_s
|
22
|
+
info["#{controller_name}.present"] = "TRUE"
|
23
|
+
info["#{controller_name}.autodetect"] = "TRUE"
|
24
|
+
info["#{controller_name}.startconnected"] = "TRUE"
|
25
|
+
vmsave(vmx_path, info)
|
26
|
+
return 1
|
27
|
+
rescue KeyError
|
28
|
+
@logger.error "Could not find any free port"
|
29
|
+
return 0
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def unmount(mount_point, remove_device=false)
|
34
|
+
@logger.info "Unmounting #{mount_point}"
|
35
|
+
info = vminfo(vmx_path)
|
36
|
+
begin
|
37
|
+
controller_name = find_iso(info, mount_point)
|
38
|
+
@logger.info "Mounted on #{controller_name}"
|
39
|
+
info["#{controller_name}.devicetype"] = "cdrom-raw"
|
40
|
+
info["#{controller_name}.filename"] = "auto detect"
|
41
|
+
info["#{controller_name}.present"] = "TRUE"
|
42
|
+
info["#{controller_name}.autodetect"] = "TRUE"
|
43
|
+
info["#{controller_name}.startconnected"] = "FALSE"
|
44
|
+
vmsave(vmx_path, info)
|
45
|
+
return 1
|
46
|
+
rescue KeyError
|
47
|
+
@logger.debug "Not mounted, nothing to do"
|
48
|
+
return 0
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def vminfo(path)
|
53
|
+
return Hash[*File.readlines(path).map {|line| line.scan(/^(.+?) = "(.*?)"$/m)}.flatten]
|
54
|
+
end
|
55
|
+
|
56
|
+
def vmsave(path, vm_info)
|
57
|
+
temp_path="#{path}.new"
|
58
|
+
@logger.debug "Saving in: #{temp_path}"
|
59
|
+
File.open("#{temp_path}", "w") { |f| vm_info.each{|k,v| f.puts "#{k} = \"#{v}\""}}
|
60
|
+
FileUtils.mv temp_path, path, force: true
|
61
|
+
end
|
62
|
+
|
63
|
+
def find_iso(vm_info, mount_point)
|
64
|
+
data = vm_info.find {|k, v| v =~ /.*\/#{mount_point}/ }
|
65
|
+
raise KeyError unless data
|
66
|
+
@logger.debug "Found data: #{data.inspect}"
|
67
|
+
data[0] =~ /([a-z]+)(\d+):(\d+)\.filename/
|
68
|
+
raise KeyError unless data[0] =~ /([a-z]+)(\d+):(\d+)\.filename/
|
69
|
+
@logger.debug "type: #{$1}, device: #{$2}, port: #{$3}"
|
70
|
+
"#{$1}#{$2}:#{$3}"
|
71
|
+
end
|
72
|
+
|
73
|
+
def find_free_port(vm_info)
|
74
|
+
data = vm_info.find {|k, v| v == 'cdrom-raw' }
|
75
|
+
raise KeyError unless data
|
76
|
+
@logger.debug "Found data: #{data.inspect}"
|
77
|
+
raise KeyError unless data[0] =~ /([a-z]+)(\d+):(\d+)\.devicetype/
|
78
|
+
@logger.debug "type: #{$1}, device: #{$2}, port: #{$3}"
|
79
|
+
"#{$1}#{$2}:#{$3}"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'driver/base'
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'vagrant'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module Mount
|
6
|
+
module Command
|
7
|
+
class Mount < Vagrant.plugin('2', :command)
|
8
|
+
def self.synopsis
|
9
|
+
'Mount ISO in Virtual Machine'
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(argv, env)
|
13
|
+
@env=env
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
def execute
|
18
|
+
options = {}
|
19
|
+
parser = OptionParser.new do |opts|
|
20
|
+
opts.banner = 'Usage: vagrant mount [options] [vm-name]'
|
21
|
+
opts.separator ''
|
22
|
+
opts.separator ' Options:'
|
23
|
+
opts.on("--iso path", "The path of the ISO to mount") { |arg| options[:path] = arg }
|
24
|
+
end
|
25
|
+
|
26
|
+
argv = parse_options(parser)
|
27
|
+
return unless argv
|
28
|
+
argv << "default" if argv.empty?
|
29
|
+
|
30
|
+
raise Vagrant::Errors::CLIInvalidUsage, { help: parser.help.chomp } unless options[:path]
|
31
|
+
with_target_vms(argv) do |vm|
|
32
|
+
vm.action(:mount, mount_point: options[:path])
|
33
|
+
end
|
34
|
+
0
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'vagrant'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module Mount
|
6
|
+
module Command
|
7
|
+
class Unmount < Vagrant.plugin('2', :command)
|
8
|
+
def self.synopsis
|
9
|
+
'Unmount ISO from Virtual Machine'
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(argv, env)
|
13
|
+
@env=env
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
def execute
|
18
|
+
options = { remove_device: false }
|
19
|
+
parser = OptionParser.new do |opts|
|
20
|
+
opts.banner = 'Usage: vagrant unmount [options] [vm-name]'
|
21
|
+
opts.separator ''
|
22
|
+
opts.separator ' Options:'
|
23
|
+
opts.on("--iso path", "The path of the ISO to unmount") { |arg| options[:path] = arg }
|
24
|
+
opts.on("--remove-device", "Remove the controller/device/port after unmounting") { |arg| options[:remove_device] = true }
|
25
|
+
end
|
26
|
+
|
27
|
+
argv = parse_options(parser)
|
28
|
+
return unless argv
|
29
|
+
argv << "default" if argv.empty?
|
30
|
+
|
31
|
+
with_target_vms(argv) do |vm|
|
32
|
+
vm.action(:unmount, mount_point: options[:path], remove_device: options[:remove_device])
|
33
|
+
end
|
34
|
+
0
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
begin
|
2
|
+
require 'vagrant'
|
3
|
+
rescue LoadError
|
4
|
+
raise 'The Vagrant Mount plugin must be run within Vagrant.'
|
5
|
+
end
|
6
|
+
|
7
|
+
raise 'The Vagrant Mount plugin is only compatible with Vagrant 1.2+' if Vagrant::VERSION < '1.2.0'
|
8
|
+
|
9
|
+
module VagrantPlugins
|
10
|
+
module Mount
|
11
|
+
class Plugin < Vagrant.plugin('2')
|
12
|
+
name 'mount'
|
13
|
+
description <<-DESC
|
14
|
+
This plugin mount ISO files inside Virtual Machines as DVD/CD
|
15
|
+
DESC
|
16
|
+
# @logger.info "Loading command :mount"
|
17
|
+
command(:mount) do
|
18
|
+
require_relative 'commands/mount'
|
19
|
+
Command::Mount
|
20
|
+
end
|
21
|
+
|
22
|
+
# @logger.info "Loading command :unmount"
|
23
|
+
command(:unmount) do
|
24
|
+
require_relative 'commands/unmount'
|
25
|
+
Command::Unmount
|
26
|
+
end
|
27
|
+
|
28
|
+
# VirtualBox
|
29
|
+
begin
|
30
|
+
require_relative 'actions/providers/virtualbox/action'
|
31
|
+
require_relative 'actions/providers/virtualbox/driver'
|
32
|
+
rescue LoadError
|
33
|
+
# If plugin cannot be loaded, silently ignore
|
34
|
+
end
|
35
|
+
|
36
|
+
# Hyper-V
|
37
|
+
begin
|
38
|
+
require_relative 'actions/providers/hyperv/mount'
|
39
|
+
require_relative 'actions/providers/hyperv/driver'
|
40
|
+
rescue LoadError
|
41
|
+
# If plugin cannot be loaded, silently ignore
|
42
|
+
end
|
43
|
+
|
44
|
+
# VMWare Fusion
|
45
|
+
begin
|
46
|
+
require 'vagrant-vmware-fusion/action'
|
47
|
+
require 'vagrant-vmware-fusion/driver'
|
48
|
+
|
49
|
+
require_relative 'actions/providers/vmware-fusion/action'
|
50
|
+
require_relative 'actions/providers/vmware-fusion/driver'
|
51
|
+
rescue LoadError
|
52
|
+
# If plugin cannot be loaded, silently ignore
|
53
|
+
end
|
54
|
+
|
55
|
+
# VMWare Workstation
|
56
|
+
begin
|
57
|
+
require 'vagrant-vmware-workstation/action'
|
58
|
+
require 'vagrant-vmware-workstation/driver'
|
59
|
+
|
60
|
+
require_relative 'actions/providers/vmware-workstation/mount'
|
61
|
+
require_relative 'actions/providers/vmware-workstation/driver'
|
62
|
+
rescue LoadError
|
63
|
+
# If plugin cannot be loaded, silently ignore
|
64
|
+
end
|
65
|
+
|
66
|
+
# Parallels Desktop
|
67
|
+
begin
|
68
|
+
require 'vagrant-parallels/action'
|
69
|
+
require 'vagrant-parallels/driver'
|
70
|
+
|
71
|
+
require_relative 'actions/providers/parallels/mount'
|
72
|
+
require_relative 'actions/providers/parallels/driver'
|
73
|
+
rescue LoadError
|
74
|
+
# If plugin cannot be loaded, silently ignore
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'vagrant-mount/version'
|
2
|
+
require 'vagrant-mount/plugin'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module Mount
|
6
|
+
lib_path = Pathname.new(File.expand_path('../vagrant-mount', __FILE__))
|
7
|
+
autoload :Errors, lib_path.join('errors')
|
8
|
+
|
9
|
+
def self.source_root
|
10
|
+
@source_root ||= Pathname.new(File.expand_path('../../', __FILE__))
|
11
|
+
end
|
12
|
+
|
13
|
+
Dir.glob(File.expand_path('locales/*.yml', Mount.source_root)).each do |lang|
|
14
|
+
I18n.load_path << File.expand_path(lang)
|
15
|
+
end
|
16
|
+
I18n.reload!
|
17
|
+
end
|
18
|
+
end
|
data/locales/en.yml
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
en:
|
2
|
+
vagrant_mount:
|
3
|
+
actions:
|
4
|
+
vm:
|
5
|
+
mount:
|
6
|
+
mounting: |-
|
7
|
+
Mounting ISO %{mount}...
|
8
|
+
mounted: |-
|
9
|
+
Successfully mounted ISO %{mount}
|
10
|
+
unmount:
|
11
|
+
unmounting: |-
|
12
|
+
Unmounting ISO %{mount}...
|
13
|
+
unmounting_all: |-
|
14
|
+
Unmounting all ISOs...
|
15
|
+
unmounted: |-
|
16
|
+
Successfully unmounted ISO %{mount}
|
17
|
+
unmounted_all: |-
|
18
|
+
Successfully unmounted all ISOs
|
19
|
+
errors:
|
20
|
+
vm:
|
21
|
+
mount:
|
22
|
+
not_mounted: |-
|
23
|
+
Failed to mount %{mount}
|
24
|
+
unmount:
|
25
|
+
not_unmounted: |-
|
26
|
+
Failed to unmount %{mount}
|
data/spec/Vagrantfile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
Vagrant.configure(2) do |config|
|
5
|
+
config.vm.define :centos, primary: true do |centos|
|
6
|
+
centos.vm.box = "box-cutter/centos70"
|
7
|
+
end
|
8
|
+
|
9
|
+
config.vm.define :ubuntu, autostart: false do |ubuntu|
|
10
|
+
ubuntu.vm.box = "box-cutter/ubuntu1404"
|
11
|
+
end
|
12
|
+
|
13
|
+
config.vm.define :windows, autostart: false do |windows|
|
14
|
+
windows.vm.box = "windows-2012R2-full-standard-eval"
|
15
|
+
windows.vm.box_check_update = false
|
16
|
+
windows.vm.guest = :windows
|
17
|
+
windows.vm.communicator = :winrm
|
18
|
+
|
19
|
+
windows.vm.provider :virtualbox do |provider, override|
|
20
|
+
provider.gui = true
|
21
|
+
provider.customize ['modifyvm', :id, '--ioapic', 'on'] # So we can assign multiple CPUs to the VM
|
22
|
+
provider.customize ['modifyvm', :id, '--memory', 2048]
|
23
|
+
provider.customize ['modifyvm', :id, '--cpus', 2]
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'helpers/isolated_environment'
|
3
|
+
require 'vagrant-mount/commands/mount'
|
4
|
+
|
5
|
+
describe VagrantPlugins::Mount::Command::Mount do
|
6
|
+
describe 'help' do
|
7
|
+
let (:argv) { [] }
|
8
|
+
let (:env) do
|
9
|
+
IsolatedEnvironment.new.create_environment
|
10
|
+
end
|
11
|
+
|
12
|
+
subject { described_class.new(argv, env) }
|
13
|
+
|
14
|
+
context 'with no arguments' do
|
15
|
+
it 'shows help' do
|
16
|
+
expect { subject.execute }.to raise_error(Vagrant::Errors::CLIInvalidUsage)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'with an ISO' do
|
21
|
+
let(:argv) { [ 'dummy.iso' ] }
|
22
|
+
|
23
|
+
it 'mounts it' do
|
24
|
+
expect(subject.execute).to eq(0)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/spec/dummy.iso
ADDED
Binary file
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'pathname'
|
3
|
+
require 'tmpdir'
|
4
|
+
require 'logger'
|
5
|
+
|
6
|
+
class IsolatedEnvironment
|
7
|
+
attr_reader :homedir
|
8
|
+
attr_reader :workdir
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
Dir.mkdir 'tmp' unless Dir.exists? 'tmp'
|
12
|
+
@logger = Logger.new(File.open('tmp/isolated_environment.log', 'a'))
|
13
|
+
@tempdir = Dir.mktmpdir('vagrant')
|
14
|
+
@logger.info("Initialized Isolated Environment in #{@tempdir}")
|
15
|
+
@homedir = Pathname.new(File.join(@tempdir, 'home'))
|
16
|
+
@workdir = Pathname.new(File.join(@tempdir, 'work'))
|
17
|
+
@homedir.mkdir
|
18
|
+
@workdir.mkdir
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_environment(options=nil)
|
22
|
+
Vagrant::Environment.new({cwd: workdir, home_path: homedir}.merge(options || {}))
|
23
|
+
end
|
24
|
+
|
25
|
+
def close
|
26
|
+
@logger.info("Removing Isolated Environment from #{@tempdir}")
|
27
|
+
FileUtils.rm_rf(@tempdir)
|
28
|
+
end
|
29
|
+
|
30
|
+
def file(name, contents, root=nil)
|
31
|
+
(root || @workdir).join(name).open('w+') { |f| f.write(contents) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def vagrantfile(contents, root=nil)
|
35
|
+
file('Vagrantfile', contents, root)
|
36
|
+
end
|
37
|
+
|
38
|
+
def box(name, vagrantfile_contents='')
|
39
|
+
box_dir=boxes_dir.join(name)
|
40
|
+
box_dir.mkpath
|
41
|
+
|
42
|
+
box_dir.join('box.ovf').open('w') { |f| f.write('') }
|
43
|
+
vagrantfile(vagrantfile_contents, box_dir)
|
44
|
+
box_dir
|
45
|
+
end
|
46
|
+
|
47
|
+
def boxes_dir
|
48
|
+
dir=@homedir.join('boxes')
|
49
|
+
dir.mkpath
|
50
|
+
dir
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'vagrant-mount/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'vagrant-mount'
|
8
|
+
spec.version = VagrantPlugins::Mount::VERSION
|
9
|
+
spec.authors = ['Gildas Cherruel']
|
10
|
+
spec.email = ['gildas@breizh.org']
|
11
|
+
spec.summary = %q{Mounts ISO in Virtual Machines}
|
12
|
+
spec.description = %q{Mounts ISO in Virtual Machines via the provider}
|
13
|
+
spec.homepage = 'http://www.vagrantup.com'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.required_rubygems_version = '>= 1.3.6'
|
17
|
+
spec.rubyforge_project = 'vagrant-mount'
|
18
|
+
|
19
|
+
spec.files = `git ls-files -z`.split("\x0")
|
20
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
21
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
22
|
+
spec.require_paths = ['lib']
|
23
|
+
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
25
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
26
|
+
spec.add_development_dependency 'rspec', '~> 3.1'
|
27
|
+
spec.add_development_dependency 'yard'
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vagrant-mount
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gildas Cherruel
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-04-20 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.7'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.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: '3.1'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: yard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Mounts ISO in Virtual Machines via the provider
|
70
|
+
email:
|
71
|
+
- gildas@breizh.org
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".gitignore"
|
77
|
+
- ".rbenv-gemsets"
|
78
|
+
- ".rspec"
|
79
|
+
- Gemfile
|
80
|
+
- LICENSE.txt
|
81
|
+
- README.md
|
82
|
+
- Rakefile
|
83
|
+
- lib/vagrant-mount.rb
|
84
|
+
- lib/vagrant-mount/actions/providers/virtualbox/action.rb
|
85
|
+
- lib/vagrant-mount/actions/providers/virtualbox/action/message_not_mounted.rb
|
86
|
+
- lib/vagrant-mount/actions/providers/virtualbox/action/message_not_unmounted.rb
|
87
|
+
- lib/vagrant-mount/actions/providers/virtualbox/action/mount.rb
|
88
|
+
- lib/vagrant-mount/actions/providers/virtualbox/action/unmount.rb
|
89
|
+
- lib/vagrant-mount/actions/providers/virtualbox/driver.rb
|
90
|
+
- lib/vagrant-mount/actions/providers/virtualbox/driver/base.rb
|
91
|
+
- lib/vagrant-mount/actions/providers/virtualbox/driver/meta.rb
|
92
|
+
- lib/vagrant-mount/actions/providers/vmware-fusion/action.rb
|
93
|
+
- lib/vagrant-mount/actions/providers/vmware-fusion/action/message_not_mounted.rb
|
94
|
+
- lib/vagrant-mount/actions/providers/vmware-fusion/action/message_not_unmounted.rb
|
95
|
+
- lib/vagrant-mount/actions/providers/vmware-fusion/action/mount.rb
|
96
|
+
- lib/vagrant-mount/actions/providers/vmware-fusion/action/unmount.rb
|
97
|
+
- lib/vagrant-mount/actions/providers/vmware-fusion/driver.rb
|
98
|
+
- lib/vagrant-mount/actions/providers/vmware-fusion/driver/base.rb
|
99
|
+
- lib/vagrant-mount/commands/mount.rb
|
100
|
+
- lib/vagrant-mount/commands/unmount.rb
|
101
|
+
- lib/vagrant-mount/plugin.rb
|
102
|
+
- lib/vagrant-mount/version.rb
|
103
|
+
- locales/en.yml
|
104
|
+
- spec/Vagrantfile
|
105
|
+
- spec/command_spec.rb
|
106
|
+
- spec/dummy.iso
|
107
|
+
- spec/helpers/isolated_environment.rb
|
108
|
+
- vagrant-mount.gemspec
|
109
|
+
homepage: http://www.vagrantup.com
|
110
|
+
licenses:
|
111
|
+
- MIT
|
112
|
+
metadata: {}
|
113
|
+
post_install_message:
|
114
|
+
rdoc_options: []
|
115
|
+
require_paths:
|
116
|
+
- lib
|
117
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: '0'
|
122
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: 1.3.6
|
127
|
+
requirements: []
|
128
|
+
rubyforge_project: vagrant-mount
|
129
|
+
rubygems_version: 2.2.2
|
130
|
+
signing_key:
|
131
|
+
specification_version: 4
|
132
|
+
summary: Mounts ISO in Virtual Machines
|
133
|
+
test_files:
|
134
|
+
- spec/Vagrantfile
|
135
|
+
- spec/command_spec.rb
|
136
|
+
- spec/dummy.iso
|
137
|
+
- spec/helpers/isolated_environment.rb
|
138
|
+
has_rdoc:
|