vagrant-vmware-free 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.
Files changed (66) hide show
  1. data/.gitignore +5 -0
  2. data/.ruby-version +1 -0
  3. data/Gemfile +7 -0
  4. data/Gemfile.lock +57 -0
  5. data/LICENSE +21 -0
  6. data/README.md +10 -0
  7. data/Rakefile +3 -0
  8. data/lib/vagrant_vmware_free.rb +5 -0
  9. data/lib/vagrant_vmware_free/action.rb +214 -0
  10. data/lib/vagrant_vmware_free/action/boot.rb +23 -0
  11. data/lib/vagrant_vmware_free/action/check_accessible.rb +23 -0
  12. data/lib/vagrant_vmware_free/action/check_created.rb +21 -0
  13. data/lib/vagrant_vmware_free/action/check_guest_additions.rb +45 -0
  14. data/lib/vagrant_vmware_free/action/check_running.rb +21 -0
  15. data/lib/vagrant_vmware_free/action/check_virtualbox.rb +22 -0
  16. data/lib/vagrant_vmware_free/action/clean_machine_folder.rb +43 -0
  17. data/lib/vagrant_vmware_free/action/clear_forwarded_ports.rb +18 -0
  18. data/lib/vagrant_vmware_free/action/clear_network_interfaces.rb +31 -0
  19. data/lib/vagrant_vmware_free/action/clear_shared_folders.rb +17 -0
  20. data/lib/vagrant_vmware_free/action/created.rb +20 -0
  21. data/lib/vagrant_vmware_free/action/customize.rb +43 -0
  22. data/lib/vagrant_vmware_free/action/destroy.rb +19 -0
  23. data/lib/vagrant_vmware_free/action/destroy_unused_network_interfaces.rb +23 -0
  24. data/lib/vagrant_vmware_free/action/discard_state.rb +20 -0
  25. data/lib/vagrant_vmware_free/action/export.rb +57 -0
  26. data/lib/vagrant_vmware_free/action/forced_halt.rb +25 -0
  27. data/lib/vagrant_vmware_free/action/forward_ports.rb +89 -0
  28. data/lib/vagrant_vmware_free/action/get_network_address.rb +27 -0
  29. data/lib/vagrant_vmware_free/action/import.rb +56 -0
  30. data/lib/vagrant_vmware_free/action/is_paused.rb +20 -0
  31. data/lib/vagrant_vmware_free/action/is_running.rb +20 -0
  32. data/lib/vagrant_vmware_free/action/is_saved.rb +20 -0
  33. data/lib/vagrant_vmware_free/action/match_mac_address.rb +21 -0
  34. data/lib/vagrant_vmware_free/action/message_already_running.rb +16 -0
  35. data/lib/vagrant_vmware_free/action/message_not_created.rb +16 -0
  36. data/lib/vagrant_vmware_free/action/message_not_running.rb +16 -0
  37. data/lib/vagrant_vmware_free/action/message_will_not_destroy.rb +17 -0
  38. data/lib/vagrant_vmware_free/action/network.rb +424 -0
  39. data/lib/vagrant_vmware_free/action/package.rb +20 -0
  40. data/lib/vagrant_vmware_free/action/package_vagrantfile.rb +33 -0
  41. data/lib/vagrant_vmware_free/action/prepare_forwarded_port_collision_params.rb +35 -0
  42. data/lib/vagrant_vmware_free/action/prepare_nfs_settings.rb +69 -0
  43. data/lib/vagrant_vmware_free/action/prune_nfs_exports.rb +20 -0
  44. data/lib/vagrant_vmware_free/action/resume.rb +26 -0
  45. data/lib/vagrant_vmware_free/action/sane_defaults.rb +91 -0
  46. data/lib/vagrant_vmware_free/action/set_name.rb +52 -0
  47. data/lib/vagrant_vmware_free/action/set_network.rb +17 -0
  48. data/lib/vagrant_vmware_free/action/setup_package_files.rb +51 -0
  49. data/lib/vagrant_vmware_free/action/share_folders.rb +128 -0
  50. data/lib/vagrant_vmware_free/action/suspend.rb +20 -0
  51. data/lib/vagrant_vmware_free/action/wait_for_vm_tools.rb +19 -0
  52. data/lib/vagrant_vmware_free/config.rb +38 -0
  53. data/lib/vagrant_vmware_free/driver/base.rb +14 -0
  54. data/lib/vagrant_vmware_free/driver/fusion.rb +17 -0
  55. data/lib/vagrant_vmware_free/driver/fusion_6.rb +188 -0
  56. data/lib/vagrant_vmware_free/driver/meta.rb +122 -0
  57. data/lib/vagrant_vmware_free/driver/vix.rb +19 -0
  58. data/lib/vagrant_vmware_free/driver/vix/functions.rb +38 -0
  59. data/lib/vagrant_vmware_free/driver/vix/helpers.rb +63 -0
  60. data/lib/vagrant_vmware_free/driver/vix/types.rb +143 -0
  61. data/lib/vagrant_vmware_free/errors.rb +9 -0
  62. data/lib/vagrant_vmware_free/plugin.rb +43 -0
  63. data/lib/vagrant_vmware_free/provider.rb +62 -0
  64. data/lib/vagrant_vmware_free/util/vmx.rb +48 -0
  65. data/vagrant-vmware-free.gemspec +21 -0
  66. metadata +190 -0
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module ProviderVMwareFree
3
+ module Action
4
+ class Suspend
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ if env[:machine].provider.state.id == :running
11
+ env[:ui].info I18n.t("vagrant.actions.vm.suspend.suspending")
12
+ env[:machine].provider.driver.suspend
13
+ end
14
+
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ module VagrantPlugins
2
+ module ProviderVMwareFree
3
+ module Action
4
+ class WaitForVMTools
5
+ include VagrantPlugins::ProviderVMwareFree::Driver::VIX
6
+
7
+ def initialize(app, env)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ wait_for_vmtools(env[:machine].provider.driver.vm_handle)
13
+
14
+ @app.call(env)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,38 @@
1
+ module VagrantPlugins
2
+ module ProviderVMwareFree
3
+ class Config < Vagrant.plugin('2', :config)
4
+ attr_reader :name
5
+
6
+ def initialize
7
+ # @auto_nat_dns_proxy = UNSET_VALUE
8
+ # @customizations = []
9
+ # @destroy_unused_network_interfaces = UNSET_VALUE
10
+ @name = UNSET_VALUE
11
+ # @network_adapters = {}
12
+ # @gui = UNSET_VALUE
13
+
14
+ # We require that network adapter 1 is a NAT device.
15
+ # network_adapter(1, :nat)
16
+ end
17
+
18
+ def finalize!
19
+ # Default is to auto the DNS proxy
20
+ # @auto_nat_dns_proxy = true if @auto_nat_dns_proxy == UNSET_VALUE
21
+
22
+ # if @destroy_unused_network_interfaces == UNSET_VALUE
23
+ # @destroy_unused_network_interfaces = false
24
+ # end
25
+
26
+ # Default is to not show a GUI
27
+ # @gui = false if @gui == UNSET_VALUE
28
+
29
+ # The default name is just nothing, and we default it
30
+ @name = nil if @name == UNSET_VALUE
31
+ end
32
+
33
+ def validate(machine)
34
+ {}
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,14 @@
1
+ module VagrantPlugins
2
+ module ProviderVMwareFree
3
+ module Driver
4
+ class Base
5
+ include VIX
6
+
7
+ def initialize(uuid)
8
+ @uuid = uuid
9
+ @logger = Log4r::Logger.new('vagrant::provider::vmware-free::fusion')
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ require 'log4r'
2
+ require_relative 'base'
3
+
4
+ module VagrantPlugins
5
+ module ProviderVMwareFree
6
+ module Driver
7
+ class Fusion < Base
8
+ def initialize(uuid)
9
+ super(uuid)
10
+
11
+ @logger = Log4r::Logger.new('vagrant::provider::vmware-free::fusion')
12
+ @uuid = uuid
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,188 @@
1
+ require 'log4r'
2
+ require 'securerandom'
3
+ require 'yaml'
4
+
5
+ module VagrantPlugins
6
+ module ProviderVMwareFree
7
+ module Driver
8
+ class Fusion_6 < Fusion
9
+ include VagrantPlugins::ProviderVMwareFree::Util::VMX
10
+ include VagrantPlugins::ProviderVMwareFree::Driver::VIX
11
+ INVENTORY = File.join(ENV['HOME'], '.vagrant.d', 'vmware.yml')
12
+
13
+ attr_reader :vmx_path
14
+ attr_reader :vm_handle
15
+ attr_accessor :ip_address
16
+
17
+ def initialize(uuid)
18
+ super(uuid)
19
+ @logger = Log4r::Logger.new('vagrant::provider::vmware-free::fusion_6')
20
+ @host_handle = get_host_handle
21
+
22
+ if @uuid
23
+ read_vms.each do |k, v|
24
+ @vmx_path = v[:config] if k == uuid
25
+ end
26
+ @vm_handle = get_vm_handle(@host_handle, @uuid)
27
+ end
28
+ end
29
+
30
+ def import(vmx_file, dest_file)
31
+ box_handle = open_vmx(@host_handle, vmx_file)
32
+ jobHandle = VixVM_Clone(box_handle, :VIX_INVALID_HANDLE, :VIX_CLONETYPE_FULL, dest_file, 0, :VIX_INVALID_HANDLE, nil, nil)
33
+ code, values = wait(jobHandle)
34
+
35
+ raise VIXError, "VixError: #{code}" if (code != 0)
36
+ new_uuid = SecureRandom.uuid
37
+
38
+ inventory = YAML.load_file(INVENTORY)
39
+
40
+ inventory[new_uuid] = { config: dest_file }
41
+
42
+ File.open(INVENTORY, 'wb') do |f|
43
+ f.write(inventory.to_yaml)
44
+ end
45
+
46
+ new_uuid
47
+ end
48
+
49
+ def delete
50
+ job_handle = VixVM_Delete(@vm_handle, :VIX_VMDELETE_DISK_FILES, nil, nil)
51
+ code, values = wait(job_handle)
52
+ raise VIXError, code: code if (code != 0)
53
+
54
+ inventory = YAML.load_file(INVENTORY)
55
+ inventory.delete @uuid
56
+ File.open(INVENTORY, 'wb') do |f|
57
+ f.write(inventory.to_yaml)
58
+ end
59
+
60
+ nil
61
+ end
62
+
63
+ def resume(mode='headless')
64
+ start(mode)
65
+ end
66
+
67
+ def vm_exists?(uuid)
68
+ inventory = YAML.load_file(INVENTORY)
69
+ inventory.each do |k, v|
70
+ return true if k == uuid
71
+ end
72
+
73
+ false
74
+ end
75
+
76
+ # Follwing methods are stubs for now
77
+
78
+ def read_vms
79
+ YAML.load_file(INVENTORY)
80
+ end
81
+
82
+ def set_value(key, value)
83
+ vmx = vmx_parse(@vmx_path)
84
+ vmx[key] = value
85
+ vmx_save(@vmx_path, vmx)
86
+ nil
87
+ end
88
+
89
+ def set_name(name)
90
+ inventory = read_vms
91
+ inventory[@uuid]['name'] = name
92
+ File.open(INVENTORY, 'wb') do |f|
93
+ f.write(inventory.to_yaml)
94
+ end
95
+
96
+ set_value('displayName', name)
97
+ end
98
+
99
+ def clear_forwarded_ports
100
+ end
101
+
102
+ def read_forwarded_ports
103
+ {}
104
+ end
105
+
106
+ def read_used_ports
107
+ {}
108
+ end
109
+
110
+ def clear_shared_folders
111
+ end
112
+
113
+ def share_folders(folders)
114
+
115
+ end
116
+
117
+ def start(mode)
118
+ if mode == 'gui'
119
+ mode = :VIX_VMPOWEROP_LAUNCH_GUI
120
+ else
121
+ mode = :VIX_VMPOWEROP_NORMAL
122
+ end
123
+
124
+ jobHandle = VixVM_PowerOn(@vm_handle, :VIX_VMPOWEROP_NORMAL, :VIX_INVALID_HANDLE, nil, nil)
125
+ code, values = wait(jobHandle)
126
+ raise VIXError, code: code if (code != 0)
127
+ nil
128
+ end
129
+
130
+ def halt
131
+ code, values = wait(VixVM_PowerOff(@vm_handle, :VIX_VMPOWEROP_NORMAL, nil, nil))
132
+ end
133
+
134
+ def read_state
135
+ code, state = get_properties(@vm_handle, [:VIX_PROPERTY_VM_POWER_STATE])
136
+ state = state[:VIX_PROPERTY_VM_POWER_STATE]
137
+
138
+ raise VIXError, "VixError: #{code}" if (code != 0)
139
+ @logger.debug("VM_POWER_STATE: #{state}")
140
+
141
+ states_enum = VIX.enum_type(:VixPowerState)
142
+
143
+ if state & states_enum[:VIX_POWERSTATE_POWERED_OFF] != 0
144
+ :poweroff
145
+ elsif state & states_enum[:VIX_POWERSTATE_POWERED_ON] != 0
146
+ :running
147
+ elsif state & states_enum[:VIX_POWERSTATE_SUSPENDED] != 0
148
+ :saved
149
+ elsif state & states_enum[:VIX_POWERSTATE_SUSPENDING] != 0
150
+ :saving
151
+ elsif state & states_enum[:VIX_POWERSTATE_POWERING_ON] != 0
152
+ :booting
153
+ else
154
+ false
155
+ end
156
+ end
157
+
158
+ protected
159
+
160
+ def get_host_handle
161
+ @logger.debug('Connecting to VIX...')
162
+ jobHandle = VixHost_Connect(:VIX_API_VERSION, :VIX_SERVICEPROVIDER_VMWARE_WORKSTATION,
163
+ '', 0, '', '', 0, :VIX_INVALID_HANDLE, nil, nil)
164
+ code, values = wait(jobHandle, [:VIX_PROPERTY_JOB_RESULT_HANDLE])
165
+
166
+ raise VIXError, code: code if (code != 0)
167
+
168
+ values[:VIX_PROPERTY_JOB_RESULT_HANDLE]
169
+ end
170
+
171
+ def get_vm_handle(host_handle, uuid)
172
+ return nil if !uuid
173
+ return nil if !vm_exists?(uuid)
174
+ open_vmx(host_handle, @vmx_path)
175
+ end
176
+
177
+ def open_vmx(host_handle, vmx_path)
178
+ jobHandle = VixHost_OpenVM(host_handle, vmx_path, :VIX_VMOPEN_NORMAL, :VIX_INVALID_HANDLE, nil, nil)
179
+ code, values = wait(jobHandle, [:VIX_PROPERTY_JOB_RESULT_HANDLE])
180
+
181
+ raise VIXError, code if (code != 0)
182
+
183
+ values[:VIX_PROPERTY_JOB_RESULT_HANDLE]
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,122 @@
1
+ require 'forwardable'
2
+ require 'log4r'
3
+ require 'cfpropertylist'
4
+
5
+ require_relative('base')
6
+
7
+ module VagrantPlugins
8
+ module ProviderVMwareFree
9
+ module Driver
10
+ class Meta < Base
11
+ class VMNotFound < StandardError; end
12
+
13
+ extend Forwardable
14
+
15
+ attr_reader :uuid
16
+ attr_reader :version
17
+
18
+ def initialize(uuid=nil)
19
+ super(uuid)
20
+
21
+ @logger = Log4r::Logger::new('vagrant::provider::vmware-free::meta')
22
+ @uuid = uuid
23
+
24
+ begin
25
+ @host = read_host_type_and_version || ""
26
+ rescue ProviderVMwareFree::Errors::CommandUnavailable,
27
+ ProviderVMwareFree::Errors::CommandUnavailableWindows
28
+ # This means that VirtualBox was not found, so we raise this
29
+ # error here.
30
+ raise ProviderVMwareFree::Errors::VMWareNotDetected
31
+ end
32
+
33
+ @logger.debug("Using #{@host[:product]} version: #{@host[:version]}")
34
+
35
+ driver_map = {
36
+ fusion: {
37
+ '6.0' => Fusion_6,
38
+ },
39
+ }
40
+
41
+ driver_klass = nil
42
+ driver_map[@host[:product]].each do |key, klass|
43
+ if @host[:version].start_with? key
44
+ driver_klass = klass
45
+ break
46
+ end
47
+ end
48
+
49
+ if !driver_klass
50
+ raise ProviderVMwareFree::Errors::VMWareInvalidVersion
51
+ end
52
+
53
+ @logger.info("Using driver: #{driver_klass}")
54
+ @driver = driver_klass.new(@uuid)
55
+
56
+ @logger.debug("UUID: #{@uuid}")
57
+ if @uuid
58
+ # require 'debugger';debugger
59
+ raise VMNotFound if !@driver.vm_exists?(@uuid)
60
+ end
61
+ end
62
+
63
+ def_delegators :@driver, :clear_forwarded_ports,
64
+ :clear_shared_folders,
65
+ :create_dhcp_server,
66
+ :create_host_only_network,
67
+ :delete,
68
+ :delete_unused_host_only_networks,
69
+ :discard_saved_state,
70
+ :enable_adapters,
71
+ :execute_command,
72
+ :export,
73
+ :forward_ports,
74
+ :halt,
75
+ :import,
76
+ :ip_address,
77
+ :ip_address=,
78
+ :read_forwarded_ports,
79
+ :read_bridged_interfaces,
80
+ :read_guest_additions_version,
81
+ :read_host_only_interfaces,
82
+ :read_mac_address,
83
+ :read_mac_addresses,
84
+ :read_machine_folder,
85
+ :read_network_interfaces,
86
+ :read_state,
87
+ :read_used_ports,
88
+ :read_vms,
89
+ :resume,
90
+ :set_mac_address,
91
+ :set_name,
92
+ :set_value,
93
+ :share_folders,
94
+ :ssh_port,
95
+ :start,
96
+ :suspend,
97
+ :verify!,
98
+ :verify_image,
99
+ :vm_exists?,
100
+ :vm_handle,
101
+ :vmx_path
102
+
103
+ protected
104
+
105
+ def read_host_type_and_version
106
+ host = {}
107
+
108
+ if /darwin/ =~ RUBY_PLATFORM
109
+ host[:product] = :fusion
110
+
111
+ fusion_plist = CFPropertyList::List.new(file: '/Applications/VMware Fusion.app/Contents/Info.plist')
112
+ version = CFPropertyList.native_types(fusion_plist.value)['CFBundleShortVersionString']
113
+
114
+ host[:version] = version
115
+ end
116
+
117
+ host
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,19 @@
1
+ require 'ffi'
2
+
3
+ module VagrantPlugins
4
+ module ProviderVMwareFree
5
+ module Driver
6
+
7
+ module VIX
8
+ class VIXError < StandardError; end
9
+ extend FFI::Library
10
+
11
+ ffi_lib '/Applications/VMware Fusion.app/Contents/Public/libvixAllProducts.dylib'
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ require_relative('vix/types')
18
+ require_relative('vix/functions')
19
+ require_relative('vix/helpers')
@@ -0,0 +1,38 @@
1
+ module VagrantPlugins
2
+ module ProviderVMwareFree
3
+ module Driver
4
+ module VIX
5
+ attach_function :VixHost_Connect, [
6
+ :int, :VixServiceProvider, :string, :int,
7
+ :string, :string, :VixHostOptions, :VixHandle,
8
+ :VixEventProc, :pointer], :VixHandle
9
+
10
+ attach_function :VixHost_OpenVM, [
11
+ :VixHandle, :string, :VixVMOpenOptions,
12
+ :VixHandle, :VixEventProc, :pointer], :VixHandle
13
+
14
+ attach_function :VixVM_PowerOn, [
15
+ :VixHandle, :VixVMPowerOpOptions, :VixHandle,
16
+ :VixEventProc, :pointer], :VixHandle
17
+
18
+ attach_function :VixJob_Wait, [:VixHandle, :varargs], :VixError
19
+
20
+ attach_function :VixVM_PowerOff, [:VixHandle, :VixVMPowerOpOptions, :VixEventProc, :pointer], :VixHandle
21
+
22
+ attach_function :VixVM_Clone, [:VixHandle, :VixHandle, :VixCloneType, :string, :int, :VixHandle, :pointer, :pointer], :VixHandle
23
+
24
+ attach_function :Vix_ReleaseHandle, [:VixHandle], :void
25
+
26
+ attach_function :Vix_GetProperties, [:VixHandle, :varargs], :VixError
27
+
28
+ attach_function :VixVM_WaitForToolsInGuest, [:VixHandle, :int, :pointer, :pointer], :VixHandle
29
+
30
+ attach_function :VixVM_ReadVariable, [:VixHandle, :VixVariableType, :string, :int, :pointer, :pointer], :VixHandle
31
+
32
+ attach_function :VixVM_Delete, [:VixHandle, :VixVMDeleteOptions, :pointer, :pointer], :VixHandle
33
+
34
+ attach_function :VixVM_PowerOff, [:VixHandle, :VixVMPowerOpOptions, :pointer, :pointer], :VixHandle
35
+ end
36
+ end
37
+ end
38
+ end