vagrant-parallels 1.0.9.rc1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/vagrant-parallels/action.rb +121 -122
- data/lib/vagrant-parallels/action/customize.rb +2 -3
- data/lib/vagrant-parallels/action/handle_guest_tools.rb +51 -0
- data/lib/vagrant-parallels/action/import.rb +1 -1
- data/lib/vagrant-parallels/action/is_driver_version.rb +28 -0
- data/lib/vagrant-parallels/action/set_power_consumption.rb +2 -6
- data/lib/vagrant-parallels/config.rb +6 -0
- data/lib/vagrant-parallels/driver/base.rb +42 -57
- data/lib/vagrant-parallels/driver/meta.rb +4 -5
- data/lib/vagrant-parallels/driver/pd_8.rb +80 -50
- data/lib/vagrant-parallels/driver/pd_9.rb +7 -7
- data/lib/vagrant-parallels/errors.rb +8 -4
- data/lib/vagrant-parallels/guest_cap/linux/install_parallels_tools.rb +53 -0
- data/lib/vagrant-parallels/plugin.rb +7 -2
- data/lib/vagrant-parallels/version.rb +1 -1
- data/locales/en.yml +34 -29
- data/test/unit/driver/pd_8_test.rb +3 -0
- data/test/unit/driver/pd_9_test.rb +3 -0
- data/test/unit/support/shared/pd_driver_examples.rb +33 -9
- metadata +5 -14
- data/lib/vagrant-parallels/action/check_accessible.rb +0 -23
- data/lib/vagrant-parallels/action/check_created.rb +0 -21
- data/lib/vagrant-parallels/action/check_guest_tools.rb +0 -37
- data/lib/vagrant-parallels/action/check_parallels.rb +0 -22
- data/lib/vagrant-parallels/action/check_running.rb +0 -21
- data/lib/vagrant-parallels/action/created.rb +0 -20
- data/lib/vagrant-parallels/action/is_running.rb +0 -20
- data/lib/vagrant-parallels/action/is_suspended.rb +0 -21
- data/lib/vagrant-parallels/action/message_already_running.rb +0 -16
- data/lib/vagrant-parallels/action/message_not_created.rb +0 -16
- data/lib/vagrant-parallels/action/message_not_running.rb +0 -16
- data/lib/vagrant-parallels/action/message_will_not_destroy.rb +0 -17
@@ -15,7 +15,7 @@ module VagrantPlugins
|
|
15
15
|
unregister_template
|
16
16
|
|
17
17
|
# Flag as erroneous and return if import failed
|
18
|
-
raise
|
18
|
+
raise VagrantPlugins::Parallels::Errors::VMImportFailure if !env[:machine].id
|
19
19
|
|
20
20
|
# Import completed successfully. Continue the chain
|
21
21
|
@app.call(env)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Parallels
|
3
|
+
module Action
|
4
|
+
# This middleware is meant to be used with Call and can check if
|
5
|
+
# a version of Parallels Desktop satisfies the given constraint.
|
6
|
+
class IsDriverVersion
|
7
|
+
# @param [String] requirement Can be a full requirement specification,
|
8
|
+
# like ">= 9.0.24229", or a list of them, like [">= 9","< 10.0.2"].
|
9
|
+
def initialize(app, env, requirement, **opts)
|
10
|
+
@app = app
|
11
|
+
@logger = Log4r::Logger.new("vagrant::plugins::parallels::is_driver_version")
|
12
|
+
@requirement = Gem::Requirement.new(requirement)
|
13
|
+
@invert = !!opts[:invert]
|
14
|
+
end
|
15
|
+
|
16
|
+
def call(env)
|
17
|
+
@logger.debug("Checking if 'prlctl' driver version satisfies '#{@requirement}'")
|
18
|
+
driver_version = Gem::Version.new(env[:machine].provider.driver.version)
|
19
|
+
@logger.debug("-- 'prlctl' driver version: #{driver_version}")
|
20
|
+
|
21
|
+
env[:result] = @requirement.satisfied_by?(driver_version)
|
22
|
+
env[:result] = !env[:result] if @invert
|
23
|
+
@app.call(env)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module VagrantPlugins
|
2
2
|
module Parallels
|
3
3
|
module Action
|
4
|
+
# Important: It works only with Parallels Desktop >= 9 !
|
5
|
+
# Use "IsDriverVersion" middleware to wrap it.
|
4
6
|
class SetPowerConsumption
|
5
7
|
def initialize(app, env)
|
6
8
|
@logger = Log4r::Logger.new("vagrant::plugins::parallels::power_consumption")
|
@@ -8,12 +10,6 @@ module VagrantPlugins
|
|
8
10
|
end
|
9
11
|
|
10
12
|
def call(env)
|
11
|
-
pd_version = env[:machine].provider.driver.version
|
12
|
-
if Gem::Version.new(pd_version) < Gem::Version.new("9")
|
13
|
-
@logger.info("Power consumption management is available only for Parallels Desktop >= 9")
|
14
|
-
return @app.call(env)
|
15
|
-
end
|
16
|
-
|
17
13
|
# Optimization of power consumption is defined by "Longer Battery Life" state.
|
18
14
|
vm_settings = env[:machine].provider.driver.read_settings
|
19
15
|
|
@@ -8,6 +8,7 @@ module VagrantPlugins
|
|
8
8
|
attr_accessor :optimize_power_consumption
|
9
9
|
attr_accessor :name
|
10
10
|
attr_reader :network_adapters
|
11
|
+
attr_accessor :update_guest_tools
|
11
12
|
|
12
13
|
|
13
14
|
# Compatibility with virtualbox provider's syntax
|
@@ -21,6 +22,7 @@ module VagrantPlugins
|
|
21
22
|
@network_adapters = {}
|
22
23
|
@name = UNSET_VALUE
|
23
24
|
@optimize_power_consumption = UNSET_VALUE
|
25
|
+
@update_guest_tools = UNSET_VALUE
|
24
26
|
|
25
27
|
network_adapter(0, :shared)
|
26
28
|
end
|
@@ -70,6 +72,10 @@ module VagrantPlugins
|
|
70
72
|
end
|
71
73
|
|
72
74
|
@name = nil if @name == UNSET_VALUE
|
75
|
+
|
76
|
+
if @update_guest_tools == UNSET_VALUE
|
77
|
+
@update_guest_tools = false
|
78
|
+
end
|
73
79
|
end
|
74
80
|
|
75
81
|
def validate(machine)
|
@@ -3,7 +3,6 @@ require 'log4r'
|
|
3
3
|
require 'vagrant/util/busy'
|
4
4
|
require 'vagrant/util/network_ip'
|
5
5
|
require 'vagrant/util/platform'
|
6
|
-
require 'vagrant/util/retryable'
|
7
6
|
require 'vagrant/util/subprocess'
|
8
7
|
|
9
8
|
module VagrantPlugins
|
@@ -24,17 +23,11 @@ module VagrantPlugins
|
|
24
23
|
# This flag is used to keep track of interrupted state (SIGINT)
|
25
24
|
@interrupted = false
|
26
25
|
|
27
|
-
|
28
|
-
@
|
29
|
-
:prlctl => "prlctl",
|
30
|
-
:prlsrvctl => "prlsrvctl",
|
31
|
-
:prl_disk_tool => "prl_disk_tool",
|
32
|
-
:ifconfig => "ifconfig"
|
33
|
-
}
|
26
|
+
@prlctl_path = "prlctl"
|
27
|
+
@prlsrvctl_path = "prlsrvctl"
|
34
28
|
|
35
|
-
@
|
36
|
-
|
37
|
-
end
|
29
|
+
@logger.info("prlctl path: #{@prlctl_path}")
|
30
|
+
@logger.info("prlsrvctl path: #{@prlsrvctl_path}")
|
38
31
|
end
|
39
32
|
|
40
33
|
# Clears the shared folders that have been set on the virtual machine.
|
@@ -93,7 +86,7 @@ module VagrantPlugins
|
|
93
86
|
# Raises a prlctl error if it fails.
|
94
87
|
#
|
95
88
|
# @param [Array] command Command to execute.
|
96
|
-
def
|
89
|
+
def execute_prlctl(command)
|
97
90
|
end
|
98
91
|
|
99
92
|
# Exports the virtual machine to the given path.
|
@@ -131,10 +124,22 @@ module VagrantPlugins
|
|
131
124
|
def read_bridged_interfaces
|
132
125
|
end
|
133
126
|
|
134
|
-
# Returns the guest tools
|
127
|
+
# Returns the state of guest tools that is installed on this VM.
|
128
|
+
# Can be any of:
|
129
|
+
# * "installed"
|
130
|
+
# * "not_installed"
|
131
|
+
# * "possibly_installed"
|
132
|
+
# * "outdated"
|
135
133
|
#
|
136
134
|
# @return [String]
|
137
|
-
def
|
135
|
+
def read_guest_tools_state
|
136
|
+
end
|
137
|
+
|
138
|
+
# Returns path to the Parallels Tools ISO file.
|
139
|
+
#
|
140
|
+
# @param [String] guest_os Guest os type: "linux", "darwin" or "windows"
|
141
|
+
# @return [String] Path to the ISO.
|
142
|
+
def read_guest_tools_iso_path(guest_os)
|
138
143
|
end
|
139
144
|
|
140
145
|
# Returns a list of available host only interfaces.
|
@@ -244,50 +249,35 @@ module VagrantPlugins
|
|
244
249
|
def unshare_folders(names)
|
245
250
|
end
|
246
251
|
|
247
|
-
# Verifies that the driver is ready to accept work.
|
248
|
-
#
|
249
|
-
# This should raise a VagrantError if things are not ready.
|
250
|
-
def verify!
|
251
|
-
end
|
252
|
-
|
253
252
|
# Checks if a VM with the given UUID exists.
|
254
253
|
#
|
255
254
|
# @return [Boolean]
|
256
255
|
def vm_exists?(uuid)
|
257
256
|
end
|
258
257
|
|
259
|
-
#
|
260
|
-
def
|
261
|
-
|
262
|
-
|
263
|
-
opts = command.pop if command.last.is_a?(Hash)
|
264
|
-
|
265
|
-
tries = opts[:retryable] ? 3 : 0
|
266
|
-
|
267
|
-
# Variable to store our execution result
|
268
|
-
r = nil
|
269
|
-
|
270
|
-
retryable(:on => VagrantPlugins::Parallels::Errors::PrlCtlError, :tries => tries, :sleep => 1) do
|
271
|
-
# If there is an error with PrlCtl, this gets set to true
|
272
|
-
errored = false
|
273
|
-
|
274
|
-
# Execute the command
|
275
|
-
r = raw(*command, &block)
|
276
|
-
|
277
|
-
# If the command was a failure, then raise an exception that is
|
278
|
-
# nicely handled by Vagrant.
|
279
|
-
if r.exit_code != 0
|
280
|
-
if @interrupted
|
281
|
-
@logger.info("Exit code != 0, but interrupted. Ignoring.")
|
282
|
-
else
|
283
|
-
errored = true
|
284
|
-
end
|
285
|
-
end
|
258
|
+
# Wraps 'execute' and returns the output of given 'prlctl' subcommand.
|
259
|
+
def execute_prlctl(*command, &block)
|
260
|
+
execute(@prlctl_path, *command, &block)
|
261
|
+
end
|
286
262
|
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
263
|
+
#Wraps 'execute' and returns the output of given 'prlsrvctl' subcommand.
|
264
|
+
def execute_prlsrvctl(*command, &block)
|
265
|
+
execute(@prlsrvctl_path, *command, &block)
|
266
|
+
end
|
267
|
+
|
268
|
+
# Execute the given command and return the output.
|
269
|
+
def execute(*command, &block)
|
270
|
+
r = raw(*command, &block)
|
271
|
+
|
272
|
+
# If the command was a failure, then raise an exception that is
|
273
|
+
# nicely handled by Vagrant.
|
274
|
+
if r.exit_code != 0
|
275
|
+
if @interrupted
|
276
|
+
@logger.info("Exit code != 0, but interrupted. Ignoring.")
|
277
|
+
else
|
278
|
+
# If there was an error running command, show the error and the
|
279
|
+
# output.
|
280
|
+
raise VagrantPlugins::Parallels::Errors::ExecutionError,
|
291
281
|
:command => command.inspect,
|
292
282
|
:stderr => r.stderr
|
293
283
|
end
|
@@ -308,13 +298,8 @@ module VagrantPlugins
|
|
308
298
|
# Append in the options for subprocess
|
309
299
|
command << { :notify => [:stdout, :stderr] }
|
310
300
|
|
311
|
-
# Get the utility from the first argument:
|
312
|
-
# 'prlctl' by default
|
313
|
-
util = @cli_paths.has_key?(command.first) ? command.delete_at(0) : :prlctl
|
314
|
-
cli = @cli_paths[util]
|
315
|
-
|
316
301
|
Vagrant::Util::Busy.busy(int_callback) do
|
317
|
-
Vagrant::Util::Subprocess.execute(
|
302
|
+
Vagrant::Util::Subprocess.execute(*command, &block)
|
318
303
|
end
|
319
304
|
end
|
320
305
|
end
|
@@ -84,14 +84,14 @@ module VagrantPlugins
|
|
84
84
|
:delete_disabled_adapters,
|
85
85
|
:delete_unused_host_only_networks,
|
86
86
|
:enable_adapters,
|
87
|
-
:
|
87
|
+
:execute_prlctl,
|
88
88
|
:export,
|
89
89
|
:halt,
|
90
90
|
:import,
|
91
91
|
:read_bridged_interfaces,
|
92
|
-
:
|
92
|
+
:read_guest_tools_state,
|
93
|
+
:read_guest_tools_iso_path,
|
93
94
|
:read_guest_ip,
|
94
|
-
:read_guest_property,
|
95
95
|
:read_host_only_interfaces,
|
96
96
|
:read_mac_address,
|
97
97
|
:read_mac_addresses,
|
@@ -116,7 +116,6 @@ module VagrantPlugins
|
|
116
116
|
:start,
|
117
117
|
:suspend,
|
118
118
|
:unregister,
|
119
|
-
:verify!,
|
120
119
|
:vm_exists?
|
121
120
|
|
122
121
|
protected
|
@@ -133,7 +132,7 @@ module VagrantPlugins
|
|
133
132
|
#
|
134
133
|
# But we need exactly the first 3 numbers: "x.x.x"
|
135
134
|
|
136
|
-
if execute('--version'
|
135
|
+
if execute('prlctl', '--version') =~ /prlctl version (\d+\.\d+.\d+)/
|
137
136
|
return $1
|
138
137
|
else
|
139
138
|
return nil
|
@@ -18,9 +18,11 @@ module VagrantPlugins
|
|
18
18
|
|
19
19
|
|
20
20
|
def compact(uuid)
|
21
|
-
used_drives = read_settings.fetch('Hardware', {}).select
|
21
|
+
used_drives = read_settings.fetch('Hardware', {}).select do |name, _|
|
22
|
+
name.start_with? 'hdd'
|
23
|
+
end
|
22
24
|
used_drives.each_value do |drive_params|
|
23
|
-
execute(
|
25
|
+
execute('prl_disk_tool', 'compact', '--hdd', drive_params['image']) do |type, data|
|
24
26
|
lines = data.split("\r")
|
25
27
|
# The progress of the compact will be in the last line. Do a greedy
|
26
28
|
# regular expression to find what we're looking for.
|
@@ -34,13 +36,13 @@ module VagrantPlugins
|
|
34
36
|
def clear_shared_folders
|
35
37
|
share_ids = read_shared_folders.keys
|
36
38
|
share_ids.each do |id|
|
37
|
-
|
39
|
+
execute_prlctl('set', @uuid, '--shf-host-del', id)
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
41
43
|
def create_host_only_network(options)
|
42
44
|
# Create the interface
|
43
|
-
|
45
|
+
execute_prlsrvctl('net', 'add', options[:network_id], '--type', 'host-only')
|
44
46
|
|
45
47
|
# Configure it
|
46
48
|
args = ["--ip", "#{options[:adapter_ip]}/#{options[:netmask]}"]
|
@@ -50,10 +52,10 @@ module VagrantPlugins
|
|
50
52
|
"--ip-scope-end", options[:dhcp][:upper]])
|
51
53
|
end
|
52
54
|
|
53
|
-
|
55
|
+
execute_prlsrvctl('net', 'set', options[:network_id], *args)
|
54
56
|
|
55
57
|
# Determine interface to which it has been bound
|
56
|
-
net_info = json {
|
58
|
+
net_info = json { execute_prlsrvctl('net', 'info', options[:network_id], '--json') }
|
57
59
|
iface_name = net_info['Bound To']
|
58
60
|
|
59
61
|
# Return the details
|
@@ -66,13 +68,13 @@ module VagrantPlugins
|
|
66
68
|
end
|
67
69
|
|
68
70
|
def delete
|
69
|
-
|
71
|
+
execute_prlctl('delete', @uuid)
|
70
72
|
end
|
71
73
|
|
72
74
|
def delete_disabled_adapters
|
73
75
|
read_settings.fetch('Hardware', {}).each do |adapter, params|
|
74
|
-
if adapter.start_with?('net') and !params.fetch(
|
75
|
-
|
76
|
+
if adapter.start_with?('net') and !params.fetch('enabled', true)
|
77
|
+
execute_prlctl('set', @uuid, '--device-del', adapter)
|
76
78
|
end
|
77
79
|
end
|
78
80
|
end
|
@@ -97,19 +99,21 @@ module VagrantPlugins
|
|
97
99
|
|
98
100
|
networks.each do |net|
|
99
101
|
# Delete the actual host only network interface.
|
100
|
-
|
102
|
+
execute_prlsrvctl('net', 'del', net['Network ID'])
|
101
103
|
end
|
102
104
|
end
|
103
105
|
|
104
106
|
def enable_adapters(adapters)
|
105
107
|
# Get adapters which have already configured for this VM
|
106
108
|
# Such adapters will be just overridden
|
107
|
-
existing_adapters = read_settings.fetch('Hardware', {}).keys.select
|
109
|
+
existing_adapters = read_settings.fetch('Hardware', {}).keys.select do |name|
|
110
|
+
name.start_with? 'net'
|
111
|
+
end
|
108
112
|
|
109
113
|
# Disable all previously existing adapters (except shared 'vnet0')
|
110
114
|
existing_adapters.each do |adapter|
|
111
115
|
if adapter != 'vnet0'
|
112
|
-
|
116
|
+
execute_prlctl('set', @uuid, '--device-set', adapter, '--disable')
|
113
117
|
end
|
114
118
|
end
|
115
119
|
|
@@ -141,16 +145,15 @@ module VagrantPlugins
|
|
141
145
|
args.concat(["--adapter-type", adapter[:nic_type].to_s])
|
142
146
|
end
|
143
147
|
|
144
|
-
|
148
|
+
execute_prlctl("set", @uuid, *args)
|
145
149
|
end
|
146
150
|
end
|
147
151
|
|
148
|
-
def execute_command(command)
|
149
|
-
execute(*command)
|
150
|
-
end
|
151
|
-
|
152
152
|
def export(path, tpl_name)
|
153
|
-
|
153
|
+
execute_prlctl('clone', @uuid,
|
154
|
+
'--name', tpl_name,
|
155
|
+
'--template',
|
156
|
+
'--dst', path.to_s) do |type, data|
|
154
157
|
lines = data.split("\r")
|
155
158
|
# The progress of the export will be in the last line. Do a greedy
|
156
159
|
# regular expression to find what we're looking for.
|
@@ -162,7 +165,7 @@ module VagrantPlugins
|
|
162
165
|
end
|
163
166
|
|
164
167
|
def halt(force=false)
|
165
|
-
args = ['stop', @uuid]
|
168
|
+
args = ['prlctl', 'stop', @uuid]
|
166
169
|
args << '--kill' if force
|
167
170
|
execute(*args)
|
168
171
|
end
|
@@ -171,7 +174,7 @@ module VagrantPlugins
|
|
171
174
|
template_name = read_vms.key(template_uuid)
|
172
175
|
vm_name = "#{template_name}_#{(Time.now.to_f * 1000.0).to_i}_#{rand(100000)}"
|
173
176
|
|
174
|
-
|
177
|
+
execute_prlctl('clone', template_uuid, '--name', vm_name) do |type, data|
|
175
178
|
lines = data.split("\r")
|
176
179
|
# The progress of the import will be in the last line. Do a greedy
|
177
180
|
# regular expression to find what we're looking for.
|
@@ -192,7 +195,7 @@ module VagrantPlugins
|
|
192
195
|
bridged_ifaces = []
|
193
196
|
net_list.keys.each do |iface|
|
194
197
|
info = {}
|
195
|
-
ifconfig = execute(
|
198
|
+
ifconfig = execute('ifconfig', iface)
|
196
199
|
# Assign default values
|
197
200
|
info[:name] = iface
|
198
201
|
info[:ip] = "0.0.0.0"
|
@@ -234,13 +237,35 @@ module VagrantPlugins
|
|
234
237
|
nil
|
235
238
|
end
|
236
239
|
|
237
|
-
def
|
238
|
-
|
239
|
-
|
240
|
+
def read_guest_tools_iso_path(guest_os)
|
241
|
+
guest_os = guest_os.to_sym
|
242
|
+
iso_name ={
|
243
|
+
:linux => "prl-tools-lin.iso",
|
244
|
+
:darwin => "prl-tools-mac.iso",
|
245
|
+
:windows => "prl-tools-win.iso"
|
246
|
+
}
|
247
|
+
return nil if !iso_name[guest_os]
|
248
|
+
|
249
|
+
bundle_id = 'com.parallels.desktop.console'
|
250
|
+
bundle_path = execute('mdfind', "kMDItemCFBundleIdentifier == #{bundle_id}")
|
251
|
+
iso_path = File.expand_path("./Contents/Resources/Tools/#{iso_name[guest_os]}",
|
252
|
+
bundle_path.split("\n")[0])
|
253
|
+
|
254
|
+
if !File.exist?(iso_path)
|
255
|
+
raise Errors::ParallelsToolsIsoNotFound, :iso_path => iso_path
|
256
|
+
end
|
257
|
+
|
258
|
+
iso_path
|
259
|
+
end
|
260
|
+
|
261
|
+
def read_guest_tools_state
|
262
|
+
state = read_settings.fetch('GuestTools', {}).fetch('state', nil)
|
263
|
+
state = "not_installed" if !state
|
264
|
+
state.to_sym
|
240
265
|
end
|
241
266
|
|
242
267
|
def read_host_info
|
243
|
-
json {
|
268
|
+
json { execute_prlctl('server', 'info', '--json') }
|
244
269
|
end
|
245
270
|
|
246
271
|
def read_host_only_interfaces
|
@@ -250,7 +275,7 @@ module VagrantPlugins
|
|
250
275
|
hostonly_ifaces = []
|
251
276
|
net_list.each do |iface|
|
252
277
|
info = {}
|
253
|
-
net_info = json {
|
278
|
+
net_info = json { execute_prlsrvctl('net', 'info', iface['Network ID'], '--json') }
|
254
279
|
# Really we need to work with bounded virtual interface
|
255
280
|
info[:name] = net_info['Bound To']
|
256
281
|
info[:ip] = net_info['Parallels adapter']['IP address']
|
@@ -261,7 +286,8 @@ module VagrantPlugins
|
|
261
286
|
# There may be a fake DHCPv4 parameters
|
262
287
|
# We can trust them only if adapter IP and DHCP IP are in the same subnet
|
263
288
|
dhcp_ip = net_info['DHCPv4 server']['Server address']
|
264
|
-
if network_address(info[:ip], info[:netmask]) ==
|
289
|
+
if network_address(info[:ip], info[:netmask]) ==
|
290
|
+
network_address(dhcp_ip, info[:netmask])
|
265
291
|
info[:dhcp] = {
|
266
292
|
:ip => dhcp_ip,
|
267
293
|
:lower => net_info['DHCPv4 server']['IP scope start address'],
|
@@ -319,7 +345,7 @@ module VagrantPlugins
|
|
319
345
|
end
|
320
346
|
|
321
347
|
def read_settings
|
322
|
-
vm = json {
|
348
|
+
vm = json { execute_prlctl('list', @uuid, '--info', '--json').gsub(/^INFO/, '') }
|
323
349
|
vm.last
|
324
350
|
end
|
325
351
|
|
@@ -328,7 +354,9 @@ module VagrantPlugins
|
|
328
354
|
shared_net = read_virtual_networks.detect { |net| net['Type'] == 'shared' }
|
329
355
|
return nil if !shared_net
|
330
356
|
|
331
|
-
net_info = json
|
357
|
+
net_info = json do
|
358
|
+
execute_prlsrvctl('net', 'info', shared_net['Network ID'], '--json')
|
359
|
+
end
|
332
360
|
info = {
|
333
361
|
name: net_info['Bound To'],
|
334
362
|
ip: net_info['Parallels adapter']['IP address'],
|
@@ -358,22 +386,22 @@ module VagrantPlugins
|
|
358
386
|
end
|
359
387
|
|
360
388
|
def read_state
|
361
|
-
vm = json {
|
389
|
+
vm = json { execute_prlctl('list', @uuid, '--json').gsub(/^INFO/, '') }
|
362
390
|
return nil if !vm.last
|
363
391
|
vm.last.fetch('status').to_sym
|
364
392
|
end
|
365
393
|
|
366
394
|
def read_virtual_networks
|
367
|
-
json {
|
395
|
+
json { execute_prlsrvctl('net', 'list', '--json') }
|
368
396
|
end
|
369
397
|
|
370
398
|
def read_vms
|
371
399
|
results = {}
|
372
400
|
vms_arr = json([]) do
|
373
|
-
|
401
|
+
execute_prlctl('list', '--all', '--json').gsub(/^INFO/, '')
|
374
402
|
end
|
375
403
|
templates_arr = json([]) do
|
376
|
-
|
404
|
+
execute_prlctl('list', '--all', '--json', '--template').gsub(/^INFO/, '')
|
377
405
|
end
|
378
406
|
vms = vms_arr | templates_arr
|
379
407
|
vms.each do |item|
|
@@ -383,13 +411,14 @@ module VagrantPlugins
|
|
383
411
|
results
|
384
412
|
end
|
385
413
|
|
386
|
-
# Parse the JSON from *all* VMs and templates.
|
414
|
+
# Parse the JSON from *all* VMs and templates.
|
415
|
+
# Then return an array of objects (without duplicates)
|
387
416
|
def read_vms_info
|
388
417
|
vms_arr = json([]) do
|
389
|
-
|
418
|
+
execute_prlctl('list', '--all','--info', '--json').gsub(/^INFO/, '')
|
390
419
|
end
|
391
420
|
templates_arr = json([]) do
|
392
|
-
|
421
|
+
execute_prlctl('list', '--all','--info', '--json', '--template').gsub(/^INFO/, '')
|
393
422
|
end
|
394
423
|
vms_arr | templates_arr
|
395
424
|
end
|
@@ -406,7 +435,7 @@ module VagrantPlugins
|
|
406
435
|
end
|
407
436
|
|
408
437
|
def register(pvm_file, regen_src_uuid=false)
|
409
|
-
args = ['register', pvm_file]
|
438
|
+
args = ['prlctl', 'register', pvm_file]
|
410
439
|
args << '--regenerate-src-uuid' if regen_src_uuid
|
411
440
|
execute(*args)
|
412
441
|
end
|
@@ -416,21 +445,26 @@ module VagrantPlugins
|
|
416
445
|
end
|
417
446
|
|
418
447
|
def resume
|
419
|
-
|
448
|
+
execute_prlctl('resume', @uuid)
|
420
449
|
end
|
421
450
|
|
422
451
|
def set_mac_address(mac)
|
423
|
-
|
452
|
+
execute_prlctl('set', @uuid,
|
453
|
+
'--device-set', 'net0',
|
454
|
+
'--type', 'shared',
|
455
|
+
'--mac', mac)
|
424
456
|
end
|
425
457
|
|
426
458
|
def set_name(name)
|
427
|
-
|
459
|
+
execute_prlctl('set', @uuid, '--name', name)
|
428
460
|
end
|
429
461
|
|
430
462
|
def share_folders(folders)
|
431
463
|
folders.each do |folder|
|
432
464
|
# Add the shared folder
|
433
|
-
|
465
|
+
execute_prlctl('set', @uuid,
|
466
|
+
'--shf-host-add', folder[:name],
|
467
|
+
'--path', folder[:hostpath])
|
434
468
|
end
|
435
469
|
end
|
436
470
|
|
@@ -439,29 +473,25 @@ module VagrantPlugins
|
|
439
473
|
end
|
440
474
|
|
441
475
|
def start
|
442
|
-
|
476
|
+
execute_prlctl('start', @uuid)
|
443
477
|
end
|
444
478
|
|
445
479
|
def suspend
|
446
|
-
|
480
|
+
execute_prlctl('suspend', @uuid)
|
447
481
|
end
|
448
482
|
|
449
483
|
def unregister(uuid)
|
450
|
-
|
484
|
+
execute_prlctl('unregister', uuid)
|
451
485
|
end
|
452
486
|
|
453
487
|
def unshare_folders(names)
|
454
488
|
names.each do |name|
|
455
|
-
|
489
|
+
execute_prlctl('set', @uuid, '--shf-host-del', name)
|
456
490
|
end
|
457
491
|
end
|
458
492
|
|
459
|
-
def verify!
|
460
|
-
execute('--version', retryable: true)
|
461
|
-
end
|
462
|
-
|
463
493
|
def vm_exists?(uuid)
|
464
|
-
raw(
|
494
|
+
raw('prlctl', 'list', uuid).exit_code == 0
|
465
495
|
end
|
466
496
|
end
|
467
497
|
end
|