vagrant-vmware-free 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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