vagrant-parallels 2.2.2 → 2.2.3
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 +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/vagrant-parallels/action/forward_ports.rb +19 -17
- data/lib/vagrant-parallels/action/network.rb +72 -75
- data/lib/vagrant-parallels/driver/base.rb +76 -96
- data/lib/vagrant-parallels/model/forwarded_port.rb +14 -2
- data/lib/vagrant-parallels/util/compile_forwarded_ports.rb +19 -17
- data/lib/vagrant-parallels/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4af52807cb579f4b1f18957178a8230186a4c0305bef6777879a05f48a4e26b
|
4
|
+
data.tar.gz: 130d7a27229008dbb74188269acb846199fe8001f0cb6e7694a954dc10316ddc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61c6ff36e06913bdca908f225357c3f250b8f27c06659145c6f8285d4a836e673d2f4b8ebc9aed62929ca34de1564a73992e1e6b5e3b9754c4f8c42cfabf8649
|
7
|
+
data.tar.gz: 619bbae811769347eef8580f2ef1781e708eeb5a5c59a429d0a509ba09aa37ab1bc584837ca97e7ddad8550ec35c766a1a242a7187ecdf89b5b2990f799821a8
|
data/CHANGELOG.md
CHANGED
@@ -5,7 +5,7 @@ module VagrantPlugins
|
|
5
5
|
include VagrantPlugins::Parallels::Util::CompileForwardedPorts
|
6
6
|
@@lock = Mutex.new
|
7
7
|
|
8
|
-
def initialize(app,
|
8
|
+
def initialize(app, _env)
|
9
9
|
@app = app
|
10
10
|
end
|
11
11
|
|
@@ -22,17 +22,15 @@ module VagrantPlugins
|
|
22
22
|
return @app.call(env) if env[:forwarded_ports].empty?
|
23
23
|
|
24
24
|
# Acquire both of class- and process-level locks so that we don't
|
25
|
-
# forward ports
|
25
|
+
# forward ports simultaneously with someone else.
|
26
26
|
@@lock.synchronize do
|
27
|
-
|
28
|
-
env[:
|
29
|
-
|
30
|
-
forward_ports
|
31
|
-
end
|
32
|
-
rescue Errors::EnvironmentLockedError
|
33
|
-
sleep 1
|
34
|
-
retry
|
27
|
+
env[:machine].env.lock('forward_ports') do
|
28
|
+
env[:ui].output(I18n.t('vagrant.actions.vm.forward_ports.forwarding'))
|
29
|
+
forward_ports
|
35
30
|
end
|
31
|
+
rescue Vagrant::Errors::EnvironmentLockedError
|
32
|
+
sleep 1
|
33
|
+
retry
|
36
34
|
end
|
37
35
|
|
38
36
|
@app.call(env)
|
@@ -46,7 +44,9 @@ module VagrantPlugins
|
|
46
44
|
@env[:forwarded_ports].each do |fp|
|
47
45
|
message_attributes = {
|
48
46
|
guest_port: fp.guest_port,
|
49
|
-
|
47
|
+
guest_ip: fp.guest_ip,
|
48
|
+
host_port: fp.host_port,
|
49
|
+
host_ip: fp.host_ip
|
50
50
|
}
|
51
51
|
|
52
52
|
# Assuming the only reason to establish port forwarding is
|
@@ -54,7 +54,7 @@ module VagrantPlugins
|
|
54
54
|
# bridged networking don't require port-forwarding and establishing
|
55
55
|
# forwarded ports on these attachment types has uncertain behaviour.
|
56
56
|
@env[:ui].detail(I18n.t('vagrant_parallels.actions.vm.forward_ports.forwarding_entry',
|
57
|
-
message_attributes))
|
57
|
+
**message_attributes))
|
58
58
|
|
59
59
|
# In Parallels Desktop the scope port forwarding rules is global,
|
60
60
|
# so we have to keep their names unique.
|
@@ -69,14 +69,16 @@ module VagrantPlugins
|
|
69
69
|
|
70
70
|
# Add the options to the ports array to send to the driver later
|
71
71
|
ports << {
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
72
|
+
guest_port: fp.guest_port,
|
73
|
+
guest_ip: fp.guest_ip,
|
74
|
+
host_port: fp.host_port,
|
75
|
+
host_ip: fp.host_ip,
|
76
|
+
name: unique_id,
|
77
|
+
protocol: fp.protocol
|
76
78
|
}
|
77
79
|
end
|
78
80
|
|
79
|
-
|
81
|
+
unless ports.empty?
|
80
82
|
# We only need to forward ports if there are any to forward
|
81
83
|
@env[:machine].provider.driver.forward_ports(ports)
|
82
84
|
end
|
@@ -16,7 +16,7 @@ module VagrantPlugins
|
|
16
16
|
include Vagrant::Util::ScopedHashOverride
|
17
17
|
@@lock = Mutex.new
|
18
18
|
|
19
|
-
def initialize(app,
|
19
|
+
def initialize(app, _env)
|
20
20
|
@app = app
|
21
21
|
@logger = Log4r::Logger.new('vagrant_parallels::action::network')
|
22
22
|
end
|
@@ -44,20 +44,20 @@ module VagrantPlugins
|
|
44
44
|
|
45
45
|
# Figure out the slot that this adapter will go into
|
46
46
|
slot = options[:adapter]
|
47
|
-
|
48
|
-
if available_slots.empty?
|
49
|
-
raise VagrantPlugins::Parallels::Errors::ParallelsNoRoomForHighLevelNetwork
|
50
|
-
end
|
47
|
+
unless slot
|
48
|
+
raise VagrantPlugins::Parallels::Errors::ParallelsNoRoomForHighLevelNetwork if available_slots.empty?
|
51
49
|
|
52
50
|
slot = available_slots.shift
|
53
51
|
end
|
54
52
|
|
55
53
|
# Configure it
|
56
54
|
data = nil
|
57
|
-
|
55
|
+
#noinspection RubyCaseWithoutElseBlockInspection
|
56
|
+
case type
|
57
|
+
when :private_network
|
58
58
|
# private_network = hostonly
|
59
59
|
data = [:hostonly, options]
|
60
|
-
|
60
|
+
when :public_network
|
61
61
|
# public_network = bridged
|
62
62
|
data = [:bridged, options]
|
63
63
|
end
|
@@ -103,16 +103,15 @@ module VagrantPlugins
|
|
103
103
|
networks << network
|
104
104
|
end
|
105
105
|
|
106
|
-
|
106
|
+
unless adapters.empty?
|
107
107
|
# Enable the adapters
|
108
108
|
@logger.info('Enabling adapters...')
|
109
109
|
env[:ui].output(I18n.t('vagrant.actions.vm.network.preparing'))
|
110
110
|
adapters.each do |adapter|
|
111
|
-
env[:ui].detail(I18n.t(
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
extra: '',
|
111
|
+
env[:ui].detail(I18n.t('vagrant_parallels.parallels.network_adapter',
|
112
|
+
adapter: adapter[:adapter].to_s,
|
113
|
+
type: adapter[:type].to_s,
|
114
|
+
extra: '',
|
116
115
|
))
|
117
116
|
end
|
118
117
|
|
@@ -124,12 +123,12 @@ module VagrantPlugins
|
|
124
123
|
|
125
124
|
# If we have networks to configure, then we configure it now, since
|
126
125
|
# that requires the machine to be up and running.
|
127
|
-
|
126
|
+
unless adapters.empty? && networks.empty?
|
128
127
|
assign_interface_numbers(networks, adapters)
|
129
128
|
|
130
129
|
# Only configure the networks the user requested us to configure
|
131
130
|
networks_to_configure = networks.select { |n| n[:auto_config] }
|
132
|
-
|
131
|
+
unless networks_to_configure.empty?
|
133
132
|
env[:ui].info I18n.t('vagrant.actions.vm.network.configuring')
|
134
133
|
env[:machine].guest.capability(:configure_networks, networks_to_configure)
|
135
134
|
end
|
@@ -138,10 +137,10 @@ module VagrantPlugins
|
|
138
137
|
|
139
138
|
def bridged_config(options)
|
140
139
|
{
|
141
|
-
auto_config:
|
142
|
-
bridge:
|
143
|
-
mac:
|
144
|
-
nic_type:
|
140
|
+
auto_config: true,
|
141
|
+
bridge: nil,
|
142
|
+
mac: nil,
|
143
|
+
nic_type: nil,
|
145
144
|
use_dhcp_assigned_default_route: false
|
146
145
|
}.merge(options || {})
|
147
146
|
end
|
@@ -162,17 +161,17 @@ module VagrantPlugins
|
|
162
161
|
Array(config[:bridge]).each do |bridge|
|
163
162
|
bridge = bridge.downcase if bridge.respond_to?(:downcase)
|
164
163
|
bridgedifs.each do |interface|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
164
|
+
next unless bridge === interface[:name].downcase
|
165
|
+
|
166
|
+
@logger.debug('Specific bridge found as configured in the Vagrantfile. Using it.')
|
167
|
+
chosen_bridge = interface[:name]
|
168
|
+
break
|
170
169
|
end
|
171
170
|
break if chosen_bridge
|
172
171
|
end
|
173
172
|
|
174
173
|
# If one wasn't found, then we notify the user here.
|
175
|
-
|
174
|
+
unless chosen_bridge
|
176
175
|
@env[:ui].info I18n.t(
|
177
176
|
'vagrant.actions.vm.bridged_networking.specific_not_found',
|
178
177
|
bridge: config[:bridge])
|
@@ -183,7 +182,7 @@ module VagrantPlugins
|
|
183
182
|
# specified in the Vagrantfile, or the bridge specified in the Vagrantfile
|
184
183
|
# wasn't found), then we fall back to the normal means of searching for a
|
185
184
|
# bridged network.
|
186
|
-
|
185
|
+
unless chosen_bridge
|
187
186
|
if bridgedifs.length == 1
|
188
187
|
# One bridgable interface? Just use it.
|
189
188
|
chosen_bridge = bridgedifs[0][:name]
|
@@ -197,15 +196,14 @@ module VagrantPlugins
|
|
197
196
|
interface = bridgedifs[index]
|
198
197
|
@env[:ui].info("#{index + 1}) #{interface[:name]}", prefix: false)
|
199
198
|
end
|
200
|
-
@env[:ui].info(I18n.t(
|
201
|
-
'vagrant.actions.vm.bridged_networking.choice_help')+"\n")
|
199
|
+
@env[:ui].info("#{I18n.t('vagrant.actions.vm.bridged_networking.choice_help')}\n")
|
202
200
|
|
203
201
|
# The range of valid choices
|
204
202
|
valid = Range.new(1, bridgedifs.length)
|
205
203
|
|
206
204
|
# The choice that the user has chosen as the bridging interface
|
207
205
|
choice = nil
|
208
|
-
|
206
|
+
until valid.include?(choice)
|
209
207
|
choice = @env[:ui].ask(
|
210
208
|
'Which interface should the network bridge to? Enter a number: ')
|
211
209
|
choice = choice.to_i
|
@@ -219,11 +217,11 @@ module VagrantPlugins
|
|
219
217
|
|
220
218
|
# Given the choice we can now define the adapter we're using
|
221
219
|
{
|
222
|
-
adapter:
|
223
|
-
type:
|
224
|
-
bridge:
|
220
|
+
adapter: config[:adapter],
|
221
|
+
type: :bridged,
|
222
|
+
bridge: chosen_bridge,
|
225
223
|
mac_address: config[:mac],
|
226
|
-
nic_type:
|
224
|
+
nic_type: config[:nic_type]
|
227
225
|
}
|
228
226
|
end
|
229
227
|
|
@@ -231,16 +229,16 @@ module VagrantPlugins
|
|
231
229
|
if config[:ip]
|
232
230
|
options = {
|
233
231
|
auto_config: true,
|
234
|
-
mac:
|
235
|
-
netmask:
|
236
|
-
type:
|
232
|
+
mac: nil,
|
233
|
+
netmask: '255.255.255.0',
|
234
|
+
type: :static
|
237
235
|
}.merge(config)
|
238
236
|
options[:type] = options[:type].to_sym
|
239
237
|
return options
|
240
238
|
end
|
241
239
|
|
242
240
|
{
|
243
|
-
type:
|
241
|
+
type: :dhcp,
|
244
242
|
use_dhcp_assigned_default_route: config[:use_dhcp_assigned_default_route]
|
245
243
|
}
|
246
244
|
end
|
@@ -248,10 +246,10 @@ module VagrantPlugins
|
|
248
246
|
def hostonly_config(options)
|
249
247
|
options = {
|
250
248
|
auto_config: true,
|
251
|
-
mac:
|
252
|
-
name:
|
253
|
-
nic_type:
|
254
|
-
type:
|
249
|
+
mac: nil,
|
250
|
+
name: nil,
|
251
|
+
nic_type: nil,
|
252
|
+
type: :static
|
255
253
|
}.merge(options)
|
256
254
|
|
257
255
|
# Make sure the type is a symbol
|
@@ -290,13 +288,14 @@ module VagrantPlugins
|
|
290
288
|
# network interface.
|
291
289
|
@env[:machine].provider.driver.read_bridged_interfaces.each do |interface|
|
292
290
|
next if interface[:status] == 'Down'
|
291
|
+
|
293
292
|
that_netaddr = IPAddr.new("#{interface[:ip]}/#{interface[:netmask]}")
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
293
|
+
next unless netaddr.include? that_netaddr
|
294
|
+
|
295
|
+
raise VagrantPlugins::Parallels::Errors::NetworkCollision,
|
296
|
+
hostonly_netaddr: netaddr,
|
297
|
+
bridge_netaddr: that_netaddr,
|
298
|
+
bridge_interface: interface[:name]
|
300
299
|
end
|
301
300
|
end
|
302
301
|
|
@@ -319,14 +318,14 @@ module VagrantPlugins
|
|
319
318
|
end
|
320
319
|
|
321
320
|
{
|
322
|
-
adapter_ip:
|
321
|
+
adapter_ip: options[:adapter_ip],
|
323
322
|
auto_config: options[:auto_config],
|
324
|
-
ip:
|
325
|
-
mac:
|
326
|
-
name:
|
327
|
-
netmask:
|
328
|
-
nic_type:
|
329
|
-
type:
|
323
|
+
ip: options[:ip],
|
324
|
+
mac: options[:mac],
|
325
|
+
name: options[:name],
|
326
|
+
netmask: options[:netmask],
|
327
|
+
nic_type: options[:nic_type],
|
328
|
+
type: options[:type]
|
330
329
|
}.merge(dhcp_options)
|
331
330
|
end
|
332
331
|
|
@@ -334,7 +333,7 @@ module VagrantPlugins
|
|
334
333
|
@logger.info("Searching for matching hostonly network: #{config[:ip]}")
|
335
334
|
interface = hostonly_find_matching_network(config)
|
336
335
|
|
337
|
-
|
336
|
+
unless interface
|
338
337
|
@logger.info('Network not found. Creating if we can.')
|
339
338
|
|
340
339
|
# Create a new network
|
@@ -343,25 +342,25 @@ module VagrantPlugins
|
|
343
342
|
end
|
344
343
|
|
345
344
|
{
|
346
|
-
adapter:
|
347
|
-
hostonly:
|
345
|
+
adapter: config[:adapter],
|
346
|
+
hostonly: interface[:name],
|
348
347
|
mac_address: config[:mac],
|
349
|
-
nic_type:
|
350
|
-
type:
|
348
|
+
nic_type: config[:nic_type],
|
349
|
+
type: :hostonly
|
351
350
|
}
|
352
351
|
end
|
353
352
|
|
354
353
|
def hostonly_network_config(config)
|
355
354
|
{
|
356
|
-
type:
|
355
|
+
type: config[:type],
|
357
356
|
adapter_ip: config[:adapter_ip],
|
358
|
-
ip:
|
359
|
-
netmask:
|
357
|
+
ip: config[:ip],
|
358
|
+
netmask: config[:netmask]
|
360
359
|
}
|
361
360
|
end
|
362
361
|
|
363
362
|
|
364
|
-
def shared_config(
|
363
|
+
def shared_config(_options)
|
365
364
|
{
|
366
365
|
auto_config: false
|
367
366
|
}
|
@@ -370,11 +369,11 @@ module VagrantPlugins
|
|
370
369
|
def shared_adapter(config)
|
371
370
|
{
|
372
371
|
adapter: config[:adapter],
|
373
|
-
type:
|
372
|
+
type: :shared
|
374
373
|
}
|
375
374
|
end
|
376
375
|
|
377
|
-
def shared_network_config(
|
376
|
+
def shared_network_config(_config)
|
378
377
|
{}
|
379
378
|
end
|
380
379
|
|
@@ -396,11 +395,11 @@ module VagrantPlugins
|
|
396
395
|
# Make a first pass to assign interface numbers by adapter location
|
397
396
|
vm_adapters = @env[:machine].provider.driver.read_network_interfaces
|
398
397
|
vm_adapters.sort.each do |number, adapter|
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
398
|
+
next unless adapter[:type] != :none
|
399
|
+
|
400
|
+
# Not used, so assign the interface number and increment
|
401
|
+
adapter_to_interface[number] = current
|
402
|
+
current += 1
|
404
403
|
end
|
405
404
|
|
406
405
|
# Make a pass through the adapters to assign the :interface
|
@@ -419,9 +418,7 @@ module VagrantPlugins
|
|
419
418
|
# Get the list of numbers
|
420
419
|
net_nums = []
|
421
420
|
@env[:machine].provider.driver.read_virtual_networks.each do |net|
|
422
|
-
if net['Network ID'] =~ /^vagrant-vnet(\d+)$/
|
423
|
-
net_nums << $1.to_i
|
424
|
-
end
|
421
|
+
net_nums << $1.to_i if net['Network ID'] =~ /^vagrant-vnet(\d+)$/
|
425
422
|
end
|
426
423
|
|
427
424
|
if net_nums.empty?
|
@@ -440,12 +437,12 @@ module VagrantPlugins
|
|
440
437
|
options = {
|
441
438
|
network_id: config[:name] || next_network_id,
|
442
439
|
adapter_ip: config[:adapter_ip],
|
443
|
-
netmask:
|
440
|
+
netmask: config[:netmask],
|
444
441
|
}
|
445
442
|
|
446
443
|
if config[:type] == :dhcp
|
447
444
|
options[:dhcp] = {
|
448
|
-
ip:
|
445
|
+
ip: config[:dhcp_ip],
|
449
446
|
lower: config[:dhcp_lower],
|
450
447
|
upper: config[:dhcp_upper]
|
451
448
|
}
|
@@ -27,11 +27,11 @@ module VagrantPlugins
|
|
27
27
|
# This flag is used to keep track of interrupted state (SIGINT)
|
28
28
|
@interrupted = false
|
29
29
|
|
30
|
-
@prlctl_path
|
30
|
+
@prlctl_path = util_path('prlctl')
|
31
31
|
@prlsrvctl_path = util_path('prlsrvctl')
|
32
32
|
@prldisktool_path = util_path('prl_disk_tool')
|
33
33
|
|
34
|
-
|
34
|
+
unless @prlctl_path
|
35
35
|
# This means that Parallels Desktop was not found, so we raise this
|
36
36
|
# error here.
|
37
37
|
raise VagrantPlugins::Parallels::Errors::ParallelsNotDetected
|
@@ -60,9 +60,7 @@ module VagrantPlugins
|
|
60
60
|
args.concat(["--nat-#{r[:protocol]}-del", r[:name]])
|
61
61
|
end
|
62
62
|
|
63
|
-
|
64
|
-
execute_prlsrvctl('net', 'set', read_shared_network_id, *args)
|
65
|
-
end
|
63
|
+
execute_prlsrvctl('net', 'set', read_shared_network_id, *args) unless args.empty?
|
66
64
|
end
|
67
65
|
|
68
66
|
# Clears the shared folders that have been set on the virtual machine.
|
@@ -78,7 +76,7 @@ module VagrantPlugins
|
|
78
76
|
# @param [String] src_name Name or UUID of the source VM or template.
|
79
77
|
# @param [<String => String>] options Options to clone virtual machine.
|
80
78
|
# @return [String] UUID of the new VM.
|
81
|
-
def clone_vm(src_name, options={})
|
79
|
+
def clone_vm(src_name, options = {})
|
82
80
|
dst_name = "vagrant_temp_#{(Time.now.to_f * 1000.0).to_i}_#{rand(100000)}"
|
83
81
|
|
84
82
|
args = ['clone', src_name, '--name', dst_name]
|
@@ -146,10 +144,10 @@ module VagrantPlugins
|
|
146
144
|
|
147
145
|
# Return the details
|
148
146
|
{
|
149
|
-
name:
|
150
|
-
ip:
|
147
|
+
name: options[:network_id],
|
148
|
+
ip: options[:adapter_ip],
|
151
149
|
netmask: options[:netmask],
|
152
|
-
dhcp:
|
150
|
+
dhcp: options[:dhcp]
|
153
151
|
}
|
154
152
|
end
|
155
153
|
|
@@ -160,9 +158,7 @@ module VagrantPlugins
|
|
160
158
|
# @return [String] ID of the created snapshot.
|
161
159
|
def create_snapshot(uuid, snapshot_name)
|
162
160
|
stdout = execute_prlctl('snapshot', uuid, '--name', snapshot_name)
|
163
|
-
if stdout =~
|
164
|
-
return Regexp.last_match(1)
|
165
|
-
end
|
161
|
+
return Regexp.last_match(1) if stdout =~ /{([\w-]+)}/
|
166
162
|
|
167
163
|
raise Errors::SnapshotIdNotDetected, stdout: stdout
|
168
164
|
end
|
@@ -222,7 +218,7 @@ module VagrantPlugins
|
|
222
218
|
# ['create-vm', 'add-vm', 'remove-vm', 'clone-vm']
|
223
219
|
def disable_password_restrictions(acts)
|
224
220
|
server_info = json { execute_prlsrvctl('info', '--json') }
|
225
|
-
server_info.fetch('Require password to',[]).each do |act|
|
221
|
+
server_info.fetch('Require password to', []).each do |act|
|
226
222
|
execute_prlsrvctl('set', '--require-pwd', "#{act}:off") if acts.include? act
|
227
223
|
end
|
228
224
|
end
|
@@ -251,34 +247,29 @@ module VagrantPlugins
|
|
251
247
|
|
252
248
|
# Disable all previously existing adapters (except shared 'vnet0')
|
253
249
|
existing_adapters.each do |adapter|
|
254
|
-
if adapter != 'vnet0'
|
255
|
-
execute_prlctl('set', @uuid, '--device-set', adapter, '--disable')
|
256
|
-
end
|
250
|
+
execute_prlctl('set', @uuid, '--device-set', adapter, '--disable') if adapter != 'vnet0'
|
257
251
|
end
|
258
252
|
|
259
253
|
adapters.each do |adapter|
|
260
254
|
args = []
|
261
255
|
if existing_adapters.include? "net#{adapter[:adapter]}"
|
262
|
-
args.concat(['--device-set',"net#{adapter[:adapter]}", '--enable'])
|
256
|
+
args.concat(['--device-set', "net#{adapter[:adapter]}", '--enable'])
|
263
257
|
else
|
264
|
-
args.concat([
|
258
|
+
args.concat(%w[--device-add net])
|
265
259
|
end
|
266
260
|
|
267
|
-
|
261
|
+
case adapter[:type]
|
262
|
+
when :hostonly
|
268
263
|
args.concat(['--type', 'host', '--iface', adapter[:hostonly]])
|
269
|
-
|
264
|
+
when :bridged
|
270
265
|
args.concat(['--type', 'bridged', '--iface', adapter[:bridge]])
|
271
|
-
|
272
|
-
args.concat([
|
266
|
+
when :shared
|
267
|
+
args.concat(%w[--type shared])
|
273
268
|
end
|
274
269
|
|
275
|
-
if adapter[:mac_address]
|
276
|
-
args.concat(['--mac', adapter[:mac_address]])
|
277
|
-
end
|
270
|
+
args.concat(['--mac', adapter[:mac_address]]) if adapter[:mac_address]
|
278
271
|
|
279
|
-
if adapter[:nic_type]
|
280
|
-
args.concat(['--adapter-type', adapter[:nic_type].to_s])
|
281
|
-
end
|
272
|
+
args.concat(['--adapter-type', adapter[:nic_type].to_s]) if adapter[:nic_type]
|
282
273
|
|
283
274
|
execute_prlctl('set', @uuid, *args)
|
284
275
|
end
|
@@ -308,9 +299,9 @@ module VagrantPlugins
|
|
308
299
|
protocol = options[:protocol] || 'tcp'
|
309
300
|
pf_builder = [
|
310
301
|
options[:name],
|
311
|
-
options[:
|
302
|
+
options[:host_port],
|
312
303
|
@uuid,
|
313
|
-
options[:
|
304
|
+
options[:guest_port]
|
314
305
|
]
|
315
306
|
|
316
307
|
args.concat(["--nat-#{protocol}-add", pf_builder.join(',')])
|
@@ -329,7 +320,7 @@ module VagrantPlugins
|
|
329
320
|
snap_config = File.join(settings.fetch('Home'), 'Snapshots.xml')
|
330
321
|
|
331
322
|
# There are no snapshots, exit
|
332
|
-
return {}
|
323
|
+
return {} unless File.exist?(snap_config)
|
333
324
|
|
334
325
|
xml = Nokogiri::XML(File.read(snap_config))
|
335
326
|
snapshots = {}
|
@@ -349,7 +340,7 @@ module VagrantPlugins
|
|
349
340
|
end
|
350
341
|
|
351
342
|
# Halts the virtual machine (pulls the plug).
|
352
|
-
def halt(force=false)
|
343
|
+
def halt(force = false)
|
353
344
|
args = ['stop', @uuid]
|
354
345
|
args << '--kill' if force
|
355
346
|
execute_prlctl(*args)
|
@@ -370,22 +361,18 @@ module VagrantPlugins
|
|
370
361
|
info = {}
|
371
362
|
ifconfig = execute('ifconfig', iface)
|
372
363
|
# Assign default values
|
373
|
-
info[:name]
|
374
|
-
info[:ip]
|
364
|
+
info[:name] = iface
|
365
|
+
info[:ip] = '0.0.0.0'
|
375
366
|
info[:netmask] = '0.0.0.0'
|
376
|
-
info[:status]
|
367
|
+
info[:status] = 'Down'
|
377
368
|
|
378
|
-
if ifconfig =~ /(?<=inet\s)(\S*)/
|
379
|
-
info[:ip] = $1.to_s
|
380
|
-
end
|
369
|
+
info[:ip] = $1.to_s if ifconfig =~ /(?<=inet\s)(\S*)/
|
381
370
|
if ifconfig =~ /(?<=netmask\s)(\S*)/
|
382
371
|
# Netmask will be converted from hex to dec:
|
383
372
|
# '0xffffff00' -> '255.255.255.0'
|
384
|
-
info[:netmask] = $1.hex.to_s(16).scan(/../).each.map{|octet| octet.hex}.join('.')
|
385
|
-
end
|
386
|
-
if ifconfig =~ /\W(UP)\W/ and ifconfig !~ /(?<=status:\s)inactive$/
|
387
|
-
info[:status] = 'Up'
|
373
|
+
info[:netmask] = $1.hex.to_s(16).scan(/../).each.map { |octet| octet.hex }.join('.')
|
388
374
|
end
|
375
|
+
info[:status] = 'Up' if ifconfig =~ /\W(UP)\W/ and ifconfig !~ /(?<=status:\s)inactive$/
|
389
376
|
|
390
377
|
bridged_ifaces << info
|
391
378
|
end
|
@@ -406,7 +393,7 @@ module VagrantPlugins
|
|
406
393
|
# @param [Boolean] global If true, returns all the rules on the host.
|
407
394
|
# Otherwise only rules related to the context VM will be returned.
|
408
395
|
# @return [Array<Symbol => String>]
|
409
|
-
def read_forwarded_ports(global=false)
|
396
|
+
def read_forwarded_ports(global = false)
|
410
397
|
all_rules = read_shared_interface[:nat]
|
411
398
|
|
412
399
|
if global
|
@@ -426,21 +413,21 @@ module VagrantPlugins
|
|
426
413
|
leases = {}
|
427
414
|
begin
|
428
415
|
File.open(leases_file).grep(/#{mac_addr}/) do |line|
|
429
|
-
_, ip, exp, dur,
|
416
|
+
_, ip, exp, dur, = line.split /([\d.]*)="(\d*),(\d*),(\w*),(\w*)".*/
|
430
417
|
leases[ip] = exp.to_i - dur.to_i
|
431
418
|
end
|
432
419
|
rescue Errno::EACCES
|
433
|
-
raise Errors::DhcpLeasesNotAccessible, :
|
420
|
+
raise Errors::DhcpLeasesNotAccessible, leases_file: leases_file.to_s
|
434
421
|
rescue Errno::ENOENT
|
435
422
|
# File does not exist
|
436
423
|
# Perhaps, it is the fist start of Parallels Desktop
|
437
|
-
return
|
424
|
+
return ''
|
438
425
|
end
|
439
426
|
|
440
|
-
return
|
427
|
+
return '' if leases.empty?
|
441
428
|
|
442
429
|
# Get the most resent lease and return an associated IP
|
443
|
-
leases.
|
430
|
+
leases.max_by { |_ip, lease_time| lease_time }.first
|
444
431
|
end
|
445
432
|
|
446
433
|
# Returns path to the Parallels Tools ISO file.
|
@@ -449,21 +436,19 @@ module VagrantPlugins
|
|
449
436
|
# @return [String] Path to the ISO.
|
450
437
|
def read_guest_tools_iso_path(guest_os)
|
451
438
|
guest_os = guest_os.to_sym
|
452
|
-
iso_name ={
|
439
|
+
iso_name = {
|
453
440
|
linux: 'prl-tools-lin.iso',
|
454
441
|
darwin: 'prl-tools-mac.iso',
|
455
442
|
windows: 'PTIAgent.exe'
|
456
443
|
}
|
457
|
-
return nil
|
444
|
+
return nil unless iso_name[guest_os]
|
458
445
|
|
459
|
-
bundle_id =
|
446
|
+
bundle_id = 'com.parallels.desktop.console'
|
460
447
|
bundle_path = execute('mdfind', "kMDItemCFBundleIdentifier == #{bundle_id}")
|
461
448
|
iso_path = File.expand_path("./Contents/Resources/Tools/#{iso_name[guest_os]}",
|
462
449
|
bundle_path.split("\n")[0])
|
463
450
|
|
464
|
-
|
465
|
-
raise Errors::ParallelsToolsIsoNotFound, :iso_path => iso_path
|
466
|
-
end
|
451
|
+
raise Errors::ParallelsToolsIsoNotFound, iso_path: iso_path unless File.exist?(iso_path)
|
467
452
|
|
468
453
|
iso_path
|
469
454
|
end
|
@@ -478,7 +463,7 @@ module VagrantPlugins
|
|
478
463
|
# @return [Symbol]
|
479
464
|
def read_guest_tools_state
|
480
465
|
state = read_settings.fetch('GuestTools', {}).fetch('state', nil)
|
481
|
-
state
|
466
|
+
state ||= 'not_installed'
|
482
467
|
state.to_sym
|
483
468
|
end
|
484
469
|
|
@@ -512,18 +497,18 @@ module VagrantPlugins
|
|
512
497
|
end
|
513
498
|
|
514
499
|
iface = {
|
515
|
-
name:
|
500
|
+
name: net_info['Network ID'],
|
516
501
|
status: 'Down'
|
517
502
|
}
|
518
503
|
|
519
504
|
adapter = net_info['Parallels adapter']
|
520
505
|
if adapter
|
521
|
-
iface[:ip]
|
522
|
-
iface[:netmask]
|
523
|
-
iface[:status]
|
506
|
+
iface[:ip] = adapter['IPv4 address']
|
507
|
+
iface[:netmask] = adapter['IPv4 subnet mask']
|
508
|
+
iface[:status] = 'Up'
|
524
509
|
|
525
510
|
if adapter['IPv6 address'] && adapter['IPv6 subnet mask']
|
526
|
-
iface[:ipv6]
|
511
|
+
iface[:ipv6] = adapter['IPv6 address']
|
527
512
|
iface[:ipv6_prefix] = adapter['IPv6 subnet mask']
|
528
513
|
end
|
529
514
|
end
|
@@ -542,9 +527,7 @@ module VagrantPlugins
|
|
542
527
|
name.start_with?('net') && params['type'] == 'shared'
|
543
528
|
end
|
544
529
|
|
545
|
-
if shared_ifaces.empty?
|
546
|
-
raise Errors::SharedInterfaceNotFound
|
547
|
-
end
|
530
|
+
raise Errors::SharedInterfaceNotFound if shared_ifaces.empty?
|
548
531
|
|
549
532
|
shared_ifaces.values.first.fetch('mac', nil)
|
550
533
|
end
|
@@ -570,14 +553,15 @@ module VagrantPlugins
|
|
570
553
|
adapter = name.match(/^net(\d+)$/)[1].to_i
|
571
554
|
nics[adapter] ||= {}
|
572
555
|
|
573
|
-
|
556
|
+
case params['type']
|
557
|
+
when 'shared'
|
574
558
|
nics[adapter][:type] = :shared
|
575
|
-
|
559
|
+
when 'host'
|
576
560
|
nics[adapter][:type] = :hostonly
|
577
|
-
nics[adapter][:hostonly] = params.fetch('iface','')
|
578
|
-
|
561
|
+
nics[adapter][:hostonly] = params.fetch('iface', '')
|
562
|
+
when 'bridged'
|
579
563
|
nics[adapter][:type] = :bridged
|
580
|
-
nics[adapter][:bridge] = params.fetch('iface','')
|
564
|
+
nics[adapter][:bridge] = params.fetch('iface', '')
|
581
565
|
end
|
582
566
|
end
|
583
567
|
nics
|
@@ -586,8 +570,8 @@ module VagrantPlugins
|
|
586
570
|
# Returns virtual machine settings
|
587
571
|
#
|
588
572
|
# @return [<String => String, Hash>]
|
589
|
-
def read_settings(uuid
|
590
|
-
vm = json { execute_prlctl('list', uuid, '--info', '--no-header', '--json')
|
573
|
+
def read_settings(uuid = @uuid)
|
574
|
+
vm = json { execute_prlctl('list', uuid, '--info', '--no-header', '--json') }
|
591
575
|
vm.last
|
592
576
|
end
|
593
577
|
|
@@ -609,20 +593,20 @@ module VagrantPlugins
|
|
609
593
|
end
|
610
594
|
|
611
595
|
iface = {
|
612
|
-
nat:
|
596
|
+
nat: [],
|
613
597
|
status: 'Down'
|
614
598
|
}
|
615
599
|
adapter = net_info['Parallels adapter']
|
616
600
|
|
617
601
|
if adapter
|
618
|
-
iface[:ip]
|
619
|
-
iface[:netmask]
|
620
|
-
iface[:status]
|
602
|
+
iface[:ip] = adapter['IPv4 address']
|
603
|
+
iface[:netmask] = adapter['IPv4 subnet mask']
|
604
|
+
iface[:status] = 'Up'
|
621
605
|
end
|
622
606
|
|
623
607
|
if net_info.key?('DHCPv4 server')
|
624
608
|
iface[:dhcp] = {
|
625
|
-
ip:
|
609
|
+
ip: net_info['DHCPv4 server']['Server address'],
|
626
610
|
lower: net_info['DHCPv4 server']['IP scope start address'],
|
627
611
|
upper: net_info['DHCPv4 server']['IP scope end address']
|
628
612
|
}
|
@@ -631,10 +615,10 @@ module VagrantPlugins
|
|
631
615
|
net_info['NAT server'].each do |group, rules|
|
632
616
|
rules.each do |name, params|
|
633
617
|
iface[:nat] << {
|
634
|
-
name:
|
635
|
-
protocol:
|
636
|
-
guest:
|
637
|
-
hostport:
|
618
|
+
name: name,
|
619
|
+
protocol: group == 'TCP rules' ? 'tcp' : 'udp',
|
620
|
+
guest: params['destination IP/VM id'],
|
621
|
+
hostport: params['source port'],
|
638
622
|
guestport: params['destination port']
|
639
623
|
}
|
640
624
|
end
|
@@ -650,7 +634,7 @@ module VagrantPlugins
|
|
650
634
|
def read_shared_folders
|
651
635
|
shf_info = read_settings.fetch('Host Shared Folders', {})
|
652
636
|
list = {}
|
653
|
-
shf_info.delete_if { |k,
|
637
|
+
shf_info.delete_if { |k, _v| k == 'enabled' }.each do |id, data|
|
654
638
|
list[id] = data.fetch('path')
|
655
639
|
end
|
656
640
|
|
@@ -686,11 +670,9 @@ module VagrantPlugins
|
|
686
670
|
# @param [String] option Name of option (See all: `prlctl list -L`)
|
687
671
|
# @param [String] uuid Virtual machine UUID
|
688
672
|
# @return [String]
|
689
|
-
def read_vm_option(option, uuid
|
690
|
-
out = execute_prlctl('list', uuid,'--no-header', '-o', option).strip
|
691
|
-
if out.empty?
|
692
|
-
raise Errors::ParallelsVMOptionNotFound, vm_option: option
|
693
|
-
end
|
673
|
+
def read_vm_option(option, uuid = @uuid)
|
674
|
+
out = execute_prlctl('list', uuid, '--no-header', '-o', option).strip
|
675
|
+
raise Errors::ParallelsVMOptionNotFound, vm_option: option if out.empty?
|
694
676
|
|
695
677
|
out
|
696
678
|
end
|
@@ -699,7 +681,7 @@ module VagrantPlugins
|
|
699
681
|
#
|
700
682
|
# @return [<String => String>]
|
701
683
|
def read_vms
|
702
|
-
args = %w
|
684
|
+
args = %w[list --all --no-header --json -o name,uuid]
|
703
685
|
vms_arr = json { execute_prlctl(*args) }
|
704
686
|
templates_arr = json { execute_prlctl(*args, '--template') }
|
705
687
|
|
@@ -711,7 +693,7 @@ module VagrantPlugins
|
|
711
693
|
#
|
712
694
|
# @return [Array <String => String>]
|
713
695
|
def read_vms_info
|
714
|
-
args = %w
|
696
|
+
args = %w[list --all --info --no-header --json]
|
715
697
|
vms_arr = json { execute_prlctl(*args) }
|
716
698
|
templates_arr = json { execute_prlctl(*args, '--template') }
|
717
699
|
|
@@ -722,7 +704,7 @@ module VagrantPlugins
|
|
722
704
|
#
|
723
705
|
# @param [String] pvm_file Path to the machine image (*.pvm)
|
724
706
|
# @param [Array<String>] opts List of options for "prlctl register"
|
725
|
-
def register(pvm_file, opts=[])
|
707
|
+
def register(pvm_file, opts = [])
|
726
708
|
execute_prlctl('register', pvm_file, *opts)
|
727
709
|
end
|
728
710
|
|
@@ -823,7 +805,7 @@ module VagrantPlugins
|
|
823
805
|
|
824
806
|
# Sometimes this happens. In this case, retry.
|
825
807
|
# If we don't see this text, the VM really doesn't exist.
|
826
|
-
return false
|
808
|
+
return false unless result.stderr.include?('Login failed:')
|
827
809
|
|
828
810
|
# Sleep a bit though to give Parallels Desktop time to fix itself
|
829
811
|
sleep 2
|
@@ -861,8 +843,8 @@ module VagrantPlugins
|
|
861
843
|
# If there was an error running command, show the error and the
|
862
844
|
# output.
|
863
845
|
raise VagrantPlugins::Parallels::Errors::ExecutionError,
|
864
|
-
|
865
|
-
|
846
|
+
command: command.inspect,
|
847
|
+
stderr: r.stderr
|
866
848
|
end
|
867
849
|
end
|
868
850
|
r.stdout
|
@@ -877,12 +859,10 @@ module VagrantPlugins
|
|
877
859
|
JSON.parse(data)
|
878
860
|
rescue JSON::JSONError
|
879
861
|
# We retried already, raise the issue and be done
|
880
|
-
if raise_error
|
881
|
-
raise VagrantPlugins::Parallels::Errors::JSONParseError, data: data
|
882
|
-
end
|
862
|
+
raise VagrantPlugins::Parallels::Errors::JSONParseError, data: data if raise_error
|
883
863
|
|
884
864
|
# Remove garbage before/after json string[GH-204]
|
885
|
-
data = data[/(
|
865
|
+
data = data[/({.*}|\[.*\])/m]
|
886
866
|
|
887
867
|
# Remove all control characters unsupported by JSON [GH-219]
|
888
868
|
data.tr!("\u0000-\u001f", '')
|
@@ -903,7 +883,7 @@ module VagrantPlugins
|
|
903
883
|
end
|
904
884
|
|
905
885
|
# Append in the options for subprocess
|
906
|
-
command << {notify: [:stdout, :stderr]}
|
886
|
+
command << { notify: [:stdout, :stderr] }
|
907
887
|
|
908
888
|
Vagrant::Util::Busy.busy(int_callback) do
|
909
889
|
Vagrant::Util::Subprocess.execute(*command, &block)
|
@@ -29,14 +29,26 @@ module VagrantPlugins
|
|
29
29
|
# @return [Integer]
|
30
30
|
attr_reader :host_port
|
31
31
|
|
32
|
-
|
32
|
+
# The ip of the guest to be used for the port.
|
33
|
+
#
|
34
|
+
# @return [String]
|
35
|
+
attr_reader :guest_ip
|
36
|
+
|
37
|
+
# The ip of the host used to access the port.
|
38
|
+
#
|
39
|
+
# @return [String]
|
40
|
+
attr_reader :host_ip
|
41
|
+
|
42
|
+
def initialize(id, host_port, guest_port, host_ip, guest_ip, **options)
|
33
43
|
@id = id
|
34
44
|
@guest_port = guest_port
|
45
|
+
@guest_ip = guest_ip
|
35
46
|
@host_port = host_port
|
47
|
+
@host_ip = host_ip
|
36
48
|
|
37
49
|
options ||= {}
|
38
50
|
@auto_correct = false
|
39
|
-
@auto_correct = options[:auto_correct] if options.
|
51
|
+
@auto_correct = options[:auto_correct] if options.key?(:auto_correct)
|
40
52
|
@protocol = options[:protocol] || 'tcp'
|
41
53
|
end
|
42
54
|
|
@@ -12,23 +12,25 @@ module VagrantPlugins
|
|
12
12
|
mappings = {}
|
13
13
|
|
14
14
|
config.vm.networks.each do |type, options|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
15
|
+
next unless type == :forwarded_port
|
16
|
+
|
17
|
+
guest_port = options[:guest]
|
18
|
+
guest_ip = options[:guest_ip]
|
19
|
+
host_port = options[:host]
|
20
|
+
host_ip = options[:host_ip]
|
21
|
+
protocol = options[:protocol] || 'tcp'
|
22
|
+
options = scoped_hash_override(options, :parallels)
|
23
|
+
id = options[:id]
|
24
|
+
|
25
|
+
# If the forwarded port was marked as disabled, ignore.
|
26
|
+
next if options[:disabled]
|
27
|
+
|
28
|
+
# Temporary disable automatically pre-configured forwarded ports
|
29
|
+
# for SSH, since it is working not so well [GH-146]
|
30
|
+
next if id == 'ssh'
|
31
|
+
|
32
|
+
mappings[host_port.to_s + protocol.to_s] =
|
33
|
+
Model::ForwardedPort.new(id, host_port, guest_port, host_ip, guest_ip, **options)
|
32
34
|
end
|
33
35
|
|
34
36
|
mappings.values
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-parallels
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mikhail Zholobov
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2021-
|
12
|
+
date: 2021-07-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|