vagrant-parallels 1.1.0 → 1.2.0.rc1
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/CONTRIBUTING.md +61 -0
- data/README.md +2 -57
- data/lib/vagrant-parallels/action/clear_forwarded_ports.rb +25 -0
- data/lib/vagrant-parallels/action/customize.rb +2 -2
- data/lib/vagrant-parallels/action/export.rb +1 -1
- data/lib/vagrant-parallels/action/forward_ports.rb +78 -0
- data/lib/vagrant-parallels/action/handle_guest_tools.rb +1 -1
- data/lib/vagrant-parallels/action/import.rb +1 -1
- data/lib/vagrant-parallels/action/network.rb +47 -47
- data/lib/vagrant-parallels/action/prepare_forwarded_port_collision_params.rb +41 -0
- data/lib/vagrant-parallels/action/prepare_nfs_settings.rb +1 -1
- data/lib/vagrant-parallels/action/prepare_nfs_valid_ids.rb +1 -1
- data/lib/vagrant-parallels/action/sane_defaults.rb +55 -0
- data/lib/vagrant-parallels/action/set_name.rb +1 -1
- data/lib/vagrant-parallels/action/setup_package_files.rb +0 -1
- data/lib/vagrant-parallels/action.rb +16 -7
- data/lib/vagrant-parallels/cap/forwarded_ports.rb +22 -0
- data/lib/vagrant-parallels/driver/base.rb +8 -16
- data/lib/vagrant-parallels/driver/meta.rb +7 -7
- data/lib/vagrant-parallels/driver/pd_10.rb +279 -0
- data/lib/vagrant-parallels/driver/pd_8.rb +23 -15
- data/lib/vagrant-parallels/driver/pd_9.rb +1 -1
- data/lib/vagrant-parallels/guest_cap/linux/mount_parallels_shared_folder.rb +78 -22
- data/lib/vagrant-parallels/model/forwarded_port.rb +52 -0
- data/lib/vagrant-parallels/plugin.rb +14 -0
- data/lib/vagrant-parallels/provider.rb +12 -3
- data/lib/vagrant-parallels/synced_folder.rb +6 -1
- data/lib/vagrant-parallels/util/compile_forwarded_ports.rb +35 -0
- data/lib/vagrant-parallels/version.rb +1 -1
- data/locales/en.yml +3 -0
- data/test/unit/driver/pd_10_test.rb +228 -0
- data/test/unit/driver/pd_8_test.rb +27 -7
- data/test/unit/driver/pd_9_test.rb +28 -7
- data/test/unit/support/shared/parallels_context.rb +5 -4
- data/test/unit/support/shared/pd_driver_examples.rb +16 -37
- metadata +35 -27
- data/lib/vagrant-parallels/action/is_driver_version.rb +0 -28
- data/lib/vagrant-parallels/action/set_power_consumption.rb +0 -34
@@ -12,19 +12,20 @@ module VagrantPlugins
|
|
12
12
|
def self.action_boot
|
13
13
|
Vagrant::Action::Builder.new.tap do |b|
|
14
14
|
b.use SetName
|
15
|
+
b.use ClearForwardedPorts
|
15
16
|
b.use Provision
|
17
|
+
b.use EnvSet, port_collision_repair: true
|
18
|
+
b.use PrepareForwardedPortCollisionParams
|
19
|
+
b.use HandleForwardedPortCollisions
|
16
20
|
b.use PrepareNFSValidIds
|
17
21
|
b.use SyncedFolderCleanup
|
18
22
|
b.use SyncedFolders
|
19
23
|
b.use PrepareNFSSettings
|
20
24
|
b.use Network
|
21
25
|
b.use ClearNetworkInterfaces
|
26
|
+
b.use ForwardPorts
|
22
27
|
b.use SetHostname
|
23
|
-
b.use
|
24
|
-
if env1[:result]
|
25
|
-
b1.use SetPowerConsumption
|
26
|
-
end
|
27
|
-
end
|
28
|
+
b.use SaneDefaults
|
28
29
|
b.use Customize, "pre-boot"
|
29
30
|
b.use Boot
|
30
31
|
b.use Customize, "post-boot"
|
@@ -85,6 +86,8 @@ module VagrantPlugins
|
|
85
86
|
b2.use ForcedHalt
|
86
87
|
end
|
87
88
|
end
|
89
|
+
|
90
|
+
b1.use ClearForwardedPorts
|
88
91
|
end
|
89
92
|
end
|
90
93
|
end
|
@@ -101,6 +104,7 @@ module VagrantPlugins
|
|
101
104
|
|
102
105
|
b1.use SetupPackageFiles
|
103
106
|
b1.use action_halt
|
107
|
+
b1.use ClearForwardedPorts
|
104
108
|
b1.use PrepareNFSValidIds
|
105
109
|
b1.use SyncedFolderCleanup
|
106
110
|
b1.use Package
|
@@ -161,6 +165,9 @@ module VagrantPlugins
|
|
161
165
|
next
|
162
166
|
end
|
163
167
|
|
168
|
+
b1.use EnvSet, port_collision_repair: false
|
169
|
+
b1.use PrepareForwardedPortCollisionParams
|
170
|
+
b1.use HandleForwardedPortCollisions
|
164
171
|
b1.use Resume
|
165
172
|
b1.use WaitForCommunicator, [:resuming, :running]
|
166
173
|
end
|
@@ -282,22 +289,24 @@ module VagrantPlugins
|
|
282
289
|
autoload :Boot, File.expand_path("../action/boot", __FILE__)
|
283
290
|
autoload :HandleGuestTools, File.expand_path("../action/handle_guest_tools", __FILE__)
|
284
291
|
autoload :ClearNetworkInterfaces, File.expand_path("../action/clear_network_interfaces", __FILE__)
|
292
|
+
autoload :ClearForwardedPorts, File.expand_path("../action/clear_forwarded_ports", __FILE__)
|
285
293
|
autoload :Customize, File.expand_path("../action/customize", __FILE__)
|
286
294
|
autoload :Destroy, File.expand_path("../action/destroy", __FILE__)
|
287
295
|
autoload :DestroyUnusedNetworkInterfaces, File.expand_path("../action/destroy_unused_network_interfaces", __FILE__)
|
288
296
|
autoload :Export, File.expand_path("../action/export", __FILE__)
|
289
297
|
autoload :ForcedHalt, File.expand_path("../action/forced_halt", __FILE__)
|
298
|
+
autoload :ForwardPorts, File.expand_path("../action/forward_ports", __FILE__)
|
290
299
|
autoload :Import, File.expand_path("../action/import", __FILE__)
|
291
|
-
autoload :IsDriverVersion, File.expand_path("../action/is_driver_version", __FILE__)
|
292
300
|
autoload :Network, File.expand_path("../action/network", __FILE__)
|
293
301
|
autoload :Package, File.expand_path("../action/package", __FILE__)
|
294
302
|
autoload :PackageConfigFiles, File.expand_path("../action/package_config_files", __FILE__)
|
303
|
+
autoload :PrepareForwardedPortCollisionParams, File.expand_path("../action/prepare_forwarded_port_collision_params", __FILE__)
|
295
304
|
autoload :PrepareNFSSettings, File.expand_path("../action/prepare_nfs_settings", __FILE__)
|
296
305
|
autoload :PrepareNFSValidIds, File.expand_path("../action/prepare_nfs_valid_ids", __FILE__)
|
297
306
|
autoload :Resume, File.expand_path("../action/resume", __FILE__)
|
307
|
+
autoload :SaneDefaults, File.expand_path("../action/sane_defaults",__FILE__)
|
298
308
|
autoload :SetupPackageFiles, File.expand_path("../action/setup_package_files", __FILE__)
|
299
309
|
autoload :SetName, File.expand_path("../action/set_name", __FILE__)
|
300
|
-
autoload :SetPowerConsumption, File.expand_path("../action/set_power_consumption", __FILE__)
|
301
310
|
autoload :Suspend, File.expand_path("../action/suspend", __FILE__)
|
302
311
|
end
|
303
312
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module Parallels
|
3
|
+
module Cap
|
4
|
+
module ForwardedPorts
|
5
|
+
# Reads the forwarded ports that currently exist on the machine
|
6
|
+
# itself.
|
7
|
+
#
|
8
|
+
# This also may not match up with configured forwarded ports, because
|
9
|
+
# Vagrant auto port collision fixing may have taken place.
|
10
|
+
#
|
11
|
+
# @return [Hash<Integer, Integer>] Host => Guest port mappings.
|
12
|
+
def self.forwarded_ports(machine)
|
13
|
+
{}.tap do |result|
|
14
|
+
machine.provider.driver.read_forwarded_ports.each do |_, _, h, g|
|
15
|
+
result[h] = g
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -18,7 +18,7 @@ module VagrantPlugins
|
|
18
18
|
include Vagrant::Util::NetworkIP
|
19
19
|
|
20
20
|
def initialize
|
21
|
-
@logger = Log4r::Logger.new(
|
21
|
+
@logger = Log4r::Logger.new('vagrant_parallels::driver::base')
|
22
22
|
|
23
23
|
# This flag is used to keep track of interrupted state (SIGINT)
|
24
24
|
@interrupted = false
|
@@ -58,6 +58,12 @@ module VagrantPlugins
|
|
58
58
|
def delete_unused_host_only_networks
|
59
59
|
end
|
60
60
|
|
61
|
+
# Disables requiring password on such operations as creating, adding,
|
62
|
+
# removing or cloning the virtual machine.
|
63
|
+
#
|
64
|
+
def disable_password_restrictions
|
65
|
+
end
|
66
|
+
|
61
67
|
# Enables network adapters on the VM.
|
62
68
|
#
|
63
69
|
# The format of each adapter specification should be like so:
|
@@ -75,20 +81,6 @@ module VagrantPlugins
|
|
75
81
|
def enable_adapters(adapters)
|
76
82
|
end
|
77
83
|
|
78
|
-
# Execute a raw command straight through to 'prlctl' utility
|
79
|
-
#
|
80
|
-
# Accepts a :prlsrvctl as a first element of command if the command
|
81
|
-
# should be executed through to 'prlsrvctl' utility
|
82
|
-
#
|
83
|
-
# Accepts a :retryable => true option if the command should be retried
|
84
|
-
# upon failure.
|
85
|
-
#
|
86
|
-
# Raises a prlctl error if it fails.
|
87
|
-
#
|
88
|
-
# @param [Array] command Command to execute.
|
89
|
-
def execute_prlctl(command)
|
90
|
-
end
|
91
|
-
|
92
84
|
# Exports the virtual machine to the given path.
|
93
85
|
#
|
94
86
|
# @param [String] path Path to the OVF file.
|
@@ -296,7 +288,7 @@ module VagrantPlugins
|
|
296
288
|
end
|
297
289
|
|
298
290
|
# Append in the options for subprocess
|
299
|
-
command << {
|
291
|
+
command << {notify: [:stdout, :stderr]}
|
300
292
|
|
301
293
|
Vagrant::Util::Busy.busy(int_callback) do
|
302
294
|
Vagrant::Util::Subprocess.execute(*command, &block)
|
@@ -25,7 +25,7 @@ module VagrantPlugins
|
|
25
25
|
# Setup the base
|
26
26
|
super()
|
27
27
|
|
28
|
-
@logger = Log4r::Logger.new(
|
28
|
+
@logger = Log4r::Logger.new('vagrant_parallels::driver::meta')
|
29
29
|
@uuid = uuid
|
30
30
|
|
31
31
|
# Read and assign the version of Parallels Desktop we know which
|
@@ -44,7 +44,7 @@ module VagrantPlugins
|
|
44
44
|
driver_map = {
|
45
45
|
"8" => PD_8,
|
46
46
|
"9" => PD_9,
|
47
|
-
"10" =>
|
47
|
+
"10" => PD_10
|
48
48
|
}
|
49
49
|
|
50
50
|
driver_klass = nil
|
@@ -58,10 +58,6 @@ module VagrantPlugins
|
|
58
58
|
if !driver_klass
|
59
59
|
supported_versions = driver_map.keys.sort
|
60
60
|
|
61
|
-
# TODO: Remove this after PD 10 release
|
62
|
-
# Don't show unreleased version in the error message
|
63
|
-
supported_versions.delete("10")
|
64
|
-
|
65
61
|
raise VagrantPlugins::Parallels::Errors::ParallelsInvalidVersion,
|
66
62
|
supported_versions: supported_versions.join(", ")
|
67
63
|
end
|
@@ -77,21 +73,24 @@ module VagrantPlugins
|
|
77
73
|
end
|
78
74
|
|
79
75
|
def_delegators :@driver,
|
76
|
+
:clear_forwarded_ports,
|
80
77
|
:clear_shared_folders,
|
81
78
|
:compact,
|
82
79
|
:create_host_only_network,
|
83
80
|
:delete,
|
84
81
|
:delete_disabled_adapters,
|
85
82
|
:delete_unused_host_only_networks,
|
83
|
+
:disable_password_restrictions,
|
86
84
|
:enable_adapters,
|
87
85
|
:execute_prlctl,
|
88
86
|
:export,
|
87
|
+
:forward_ports,
|
89
88
|
:halt,
|
90
89
|
:import,
|
91
90
|
:read_bridged_interfaces,
|
91
|
+
:read_forwarded_ports,
|
92
92
|
:read_guest_tools_state,
|
93
93
|
:read_guest_tools_iso_path,
|
94
|
-
:read_guest_ip,
|
95
94
|
:read_host_only_interfaces,
|
96
95
|
:read_mac_address,
|
97
96
|
:read_mac_addresses,
|
@@ -112,6 +111,7 @@ module VagrantPlugins
|
|
112
111
|
:set_mac_address,
|
113
112
|
:set_name,
|
114
113
|
:share_folders,
|
114
|
+
:ssh_ip,
|
115
115
|
:ssh_port,
|
116
116
|
:start,
|
117
117
|
:suspend,
|
@@ -0,0 +1,279 @@
|
|
1
|
+
require 'log4r'
|
2
|
+
|
3
|
+
require 'vagrant/util/platform'
|
4
|
+
|
5
|
+
require File.expand_path('../pd_9', __FILE__)
|
6
|
+
|
7
|
+
module VagrantPlugins
|
8
|
+
module Parallels
|
9
|
+
module Driver
|
10
|
+
# Driver for Parallels Desktop 10.
|
11
|
+
class PD_10 < PD_9
|
12
|
+
def initialize(uuid)
|
13
|
+
super(uuid)
|
14
|
+
|
15
|
+
@logger = Log4r::Logger.new('vagrant_parallels::driver::pd_10')
|
16
|
+
end
|
17
|
+
|
18
|
+
def clear_forwarded_ports
|
19
|
+
args = []
|
20
|
+
read_forwarded_ports.each do |r|
|
21
|
+
args.concat(["--nat-#{r[:protocol]}-del", r[:rule_name]])
|
22
|
+
end
|
23
|
+
|
24
|
+
if !args.empty?
|
25
|
+
execute_prlsrvctl('net', 'set', read_shared_network_id, *args)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_host_only_network(options)
|
30
|
+
# Create the interface
|
31
|
+
execute_prlsrvctl('net', 'add', options[:network_id], '--type', 'host-only')
|
32
|
+
|
33
|
+
# Configure it
|
34
|
+
args = ["--ip", "#{options[:adapter_ip]}/#{options[:netmask]}"]
|
35
|
+
if options[:dhcp]
|
36
|
+
args.concat(["--dhcp-ip", options[:dhcp][:ip],
|
37
|
+
"--ip-scope-start", options[:dhcp][:lower],
|
38
|
+
"--ip-scope-end", options[:dhcp][:upper]])
|
39
|
+
end
|
40
|
+
|
41
|
+
execute_prlsrvctl('net', 'set', options[:network_id], *args)
|
42
|
+
|
43
|
+
# Return the details
|
44
|
+
{
|
45
|
+
name: options[:network_id],
|
46
|
+
ip: options[:adapter_ip],
|
47
|
+
netmask: options[:netmask],
|
48
|
+
dhcp: options[:dhcp]
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def delete_unused_host_only_networks
|
53
|
+
networks = read_virtual_networks
|
54
|
+
# 'Shared'(vnic0) and 'Host-Only'(vnic1) are default in Parallels Desktop
|
55
|
+
# They should not be deleted anyway.
|
56
|
+
networks.keep_if do |net|
|
57
|
+
net['Type'] == "host-only" &&
|
58
|
+
net['Bound To'].match(/^(?>vnic|Parallels Host-Only #)(\d+)$/)[1].to_i >= 2
|
59
|
+
end
|
60
|
+
|
61
|
+
read_vms_info.each do |vm|
|
62
|
+
used_nets = vm.fetch('Hardware', {}).select { |name, _| name.start_with? 'net' }
|
63
|
+
used_nets.each_value do |net_params|
|
64
|
+
networks.delete_if { |net| net['Network ID'] == net_params.fetch('iface', nil) }
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
networks.each do |net|
|
69
|
+
# Delete the actual host only network interface.
|
70
|
+
execute_prlsrvctl('net', 'del', net['Network ID'])
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def disable_password_restrictions
|
75
|
+
server_info = json { execute_prlsrvctl('info', '--json') }
|
76
|
+
server_info.fetch('Require password to',[]).each do |act|
|
77
|
+
execute_prlsrvctl('set', '--require-pwd', "#{act}:off")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def enable_adapters(adapters)
|
82
|
+
# Get adapters which have already configured for this VM
|
83
|
+
# Such adapters will be just overridden
|
84
|
+
existing_adapters = read_settings.fetch('Hardware', {}).keys.select do |name|
|
85
|
+
name.start_with? 'net'
|
86
|
+
end
|
87
|
+
|
88
|
+
# Disable all previously existing adapters (except shared 'vnet0')
|
89
|
+
existing_adapters.each do |adapter|
|
90
|
+
if adapter != 'vnet0'
|
91
|
+
execute_prlctl('set', @uuid, '--device-set', adapter, '--disable')
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
adapters.each do |adapter|
|
96
|
+
args = []
|
97
|
+
if existing_adapters.include? "net#{adapter[:adapter]}"
|
98
|
+
args.concat(["--device-set","net#{adapter[:adapter]}", "--enable"])
|
99
|
+
else
|
100
|
+
args.concat(["--device-add", "net"])
|
101
|
+
end
|
102
|
+
|
103
|
+
if adapter[:type] == :hostonly
|
104
|
+
args.concat(["--type", "host", "--iface", adapter[:hostonly]])
|
105
|
+
elsif adapter[:type] == :bridged
|
106
|
+
args.concat(["--type", "bridged", "--iface", adapter[:bridge]])
|
107
|
+
elsif adapter[:type] == :shared
|
108
|
+
args.concat(["--type", "shared"])
|
109
|
+
end
|
110
|
+
|
111
|
+
if adapter[:mac_address]
|
112
|
+
args.concat(["--mac", adapter[:mac_address]])
|
113
|
+
end
|
114
|
+
|
115
|
+
if adapter[:nic_type]
|
116
|
+
args.concat(["--adapter-type", adapter[:nic_type].to_s])
|
117
|
+
end
|
118
|
+
|
119
|
+
execute_prlctl("set", @uuid, *args)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def forward_ports(ports)
|
124
|
+
args = []
|
125
|
+
ports.each do |options|
|
126
|
+
protocol = options[:protocol] || 'tcp'
|
127
|
+
pf_builder = [
|
128
|
+
options[:name],
|
129
|
+
options[:hostport],
|
130
|
+
@uuid,
|
131
|
+
options[:guestport]
|
132
|
+
]
|
133
|
+
|
134
|
+
args.concat(["--nat-#{protocol}-add", pf_builder.join(',')])
|
135
|
+
end
|
136
|
+
|
137
|
+
execute_prlsrvctl('net', 'set', read_shared_network_id, *args)
|
138
|
+
end
|
139
|
+
|
140
|
+
def read_forwarded_ports(global=false)
|
141
|
+
all_rules = read_shared_interface[:nat]
|
142
|
+
|
143
|
+
if global
|
144
|
+
all_rules
|
145
|
+
else
|
146
|
+
all_rules.select { |r| r[:guest].include?(@uuid) }
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def read_host_only_interfaces
|
151
|
+
net_list = read_virtual_networks
|
152
|
+
net_list.keep_if { |net| net['Type'] == "host-only" }
|
153
|
+
|
154
|
+
hostonly_ifaces = []
|
155
|
+
net_list.each do |iface|
|
156
|
+
info = {}
|
157
|
+
net_info = json { execute_prlsrvctl('net', 'info', iface['Network ID'], '--json') }
|
158
|
+
# Really we need to work with bounded virtual interface
|
159
|
+
info[:name] = net_info['Network ID']
|
160
|
+
info[:ip] = net_info['Parallels adapter']['IP address']
|
161
|
+
info[:netmask] = net_info['Parallels adapter']['Subnet mask']
|
162
|
+
# Such interfaces are always in 'Up'
|
163
|
+
info[:status] = "Up"
|
164
|
+
|
165
|
+
# There may be a fake DHCPv4 parameters
|
166
|
+
# We can trust them only if adapter IP and DHCP IP are in the same subnet
|
167
|
+
dhcp_ip = net_info['DHCPv4 server']['Server address']
|
168
|
+
if network_address(info[:ip], info[:netmask]) ==
|
169
|
+
network_address(dhcp_ip, info[:netmask])
|
170
|
+
info[:dhcp] = {
|
171
|
+
ip: dhcp_ip,
|
172
|
+
lower: net_info['DHCPv4 server']['IP scope start address'],
|
173
|
+
upper: net_info['DHCPv4 server']['IP scope end address']
|
174
|
+
}
|
175
|
+
end
|
176
|
+
hostonly_ifaces << info
|
177
|
+
end
|
178
|
+
hostonly_ifaces
|
179
|
+
end
|
180
|
+
|
181
|
+
def read_network_interfaces
|
182
|
+
nics = {}
|
183
|
+
|
184
|
+
# Get enabled VM's network interfaces
|
185
|
+
ifaces = read_settings.fetch('Hardware', {}).keep_if do |dev, params|
|
186
|
+
dev.start_with?('net') and params.fetch("enabled", true)
|
187
|
+
end
|
188
|
+
ifaces.each do |name, params|
|
189
|
+
adapter = name.match(/^net(\d+)$/)[1].to_i
|
190
|
+
nics[adapter] ||= {}
|
191
|
+
|
192
|
+
if params['type'] == "shared"
|
193
|
+
nics[adapter][:type] = :shared
|
194
|
+
elsif params['type'] == "host"
|
195
|
+
nics[adapter][:type] = :hostonly
|
196
|
+
nics[adapter][:hostonly] = params.fetch('iface','')
|
197
|
+
elsif params['type'] == "bridged"
|
198
|
+
nics[adapter][:type] = :bridged
|
199
|
+
nics[adapter][:bridge] = params.fetch('iface','')
|
200
|
+
end
|
201
|
+
end
|
202
|
+
nics
|
203
|
+
end
|
204
|
+
|
205
|
+
def read_shared_interface
|
206
|
+
net_info = json do
|
207
|
+
execute_prlsrvctl('net', 'info', read_shared_network_id, '--json')
|
208
|
+
end
|
209
|
+
info = {
|
210
|
+
name: net_info['Bound To'],
|
211
|
+
ip: net_info['Parallels adapter']['IP address'],
|
212
|
+
netmask: net_info['Parallels adapter']['Subnet mask'],
|
213
|
+
status: 'Up',
|
214
|
+
nat: []
|
215
|
+
}
|
216
|
+
|
217
|
+
if net_info.key?('DHCPv4 server')
|
218
|
+
info[:dhcp] = {
|
219
|
+
ip: net_info['DHCPv4 server']['Server address'],
|
220
|
+
lower: net_info['DHCPv4 server']['IP scope start address'],
|
221
|
+
upper: net_info['DHCPv4 server']['IP scope end address']
|
222
|
+
}
|
223
|
+
end
|
224
|
+
|
225
|
+
net_info['NAT server'].each do |group, rules|
|
226
|
+
rules.each do |name, params|
|
227
|
+
info[:nat] << {
|
228
|
+
rule_name: name,
|
229
|
+
protocol: group == 'TCP rules' ? 'tcp' : 'udp',
|
230
|
+
guest: params['destination IP/VM id'],
|
231
|
+
hostport: params['source port'],
|
232
|
+
guestport: params['destination port']
|
233
|
+
}
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
info
|
238
|
+
end
|
239
|
+
|
240
|
+
# Parse the JSON from *all* VMs and templates.
|
241
|
+
# Then return an array of objects (without duplicates)
|
242
|
+
def read_vms_info
|
243
|
+
vms_arr = json([]) do
|
244
|
+
execute_prlctl('list', '--all','--info', '--json')
|
245
|
+
end
|
246
|
+
templates_arr = json([]) do
|
247
|
+
execute_prlctl('list', '--all','--info', '--json', '--template')
|
248
|
+
end
|
249
|
+
vms_arr | templates_arr
|
250
|
+
end
|
251
|
+
|
252
|
+
def read_used_ports
|
253
|
+
# Ignore our own used ports
|
254
|
+
read_forwarded_ports(true).reject { |r| r[:guest].include?(@uuid) }
|
255
|
+
end
|
256
|
+
|
257
|
+
def set_power_consumption_mode(optimized)
|
258
|
+
state = optimized ? 'on' : 'off'
|
259
|
+
execute_prlctl('set', @uuid, '--longer-battery-life', state)
|
260
|
+
end
|
261
|
+
|
262
|
+
def ssh_ip
|
263
|
+
'127.0.0.1'
|
264
|
+
end
|
265
|
+
|
266
|
+
def ssh_port(expected_port)
|
267
|
+
@logger.debug("Searching for SSH port: #{expected_port.inspect}")
|
268
|
+
|
269
|
+
# Look for the forwarded port only by comparing the guest port
|
270
|
+
read_forwarded_ports.each do |r|
|
271
|
+
return r[:hostport] if r[:guestport] == expected_port
|
272
|
+
end
|
273
|
+
|
274
|
+
nil
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
279
|
+
end
|
@@ -12,7 +12,7 @@ module VagrantPlugins
|
|
12
12
|
def initialize(uuid)
|
13
13
|
super()
|
14
14
|
|
15
|
-
@logger = Log4r::Logger.new(
|
15
|
+
@logger = Log4r::Logger.new('vagrant_parallels::driver::pd_8')
|
16
16
|
@uuid = uuid
|
17
17
|
end
|
18
18
|
|
@@ -60,10 +60,10 @@ module VagrantPlugins
|
|
60
60
|
|
61
61
|
# Return the details
|
62
62
|
return {
|
63
|
-
:
|
64
|
-
:
|
65
|
-
:
|
66
|
-
:
|
63
|
+
name: iface_name,
|
64
|
+
ip: options[:adapter_ip],
|
65
|
+
netmask: options[:netmask],
|
66
|
+
dhcp: options[:dhcp]
|
67
67
|
}
|
68
68
|
end
|
69
69
|
|
@@ -240,9 +240,9 @@ module VagrantPlugins
|
|
240
240
|
def read_guest_tools_iso_path(guest_os)
|
241
241
|
guest_os = guest_os.to_sym
|
242
242
|
iso_name ={
|
243
|
-
:
|
244
|
-
:
|
245
|
-
:
|
243
|
+
linux: "prl-tools-lin.iso",
|
244
|
+
darwin: "prl-tools-mac.iso",
|
245
|
+
windows: "prl-tools-win.iso"
|
246
246
|
}
|
247
247
|
return nil if !iso_name[guest_os]
|
248
248
|
|
@@ -289,9 +289,9 @@ module VagrantPlugins
|
|
289
289
|
if network_address(info[:ip], info[:netmask]) ==
|
290
290
|
network_address(dhcp_ip, info[:netmask])
|
291
291
|
info[:dhcp] = {
|
292
|
-
:
|
293
|
-
:
|
294
|
-
:
|
292
|
+
ip: dhcp_ip,
|
293
|
+
lower: net_info['DHCPv4 server']['IP scope start address'],
|
294
|
+
upper: net_info['DHCPv4 server']['IP scope end address']
|
295
295
|
}
|
296
296
|
end
|
297
297
|
hostonly_ifaces << info
|
@@ -349,13 +349,17 @@ module VagrantPlugins
|
|
349
349
|
vm.last
|
350
350
|
end
|
351
351
|
|
352
|
-
def
|
352
|
+
def read_shared_network_id
|
353
353
|
# There should be only one Shared interface
|
354
|
-
shared_net = read_virtual_networks.detect
|
355
|
-
|
354
|
+
shared_net = read_virtual_networks.detect do |net|
|
355
|
+
net['Type'] == 'shared'
|
356
|
+
end
|
357
|
+
shared_net.fetch('Network ID')
|
358
|
+
end
|
356
359
|
|
360
|
+
def read_shared_interface
|
357
361
|
net_info = json do
|
358
|
-
execute_prlsrvctl('net', 'info',
|
362
|
+
execute_prlsrvctl('net', 'info', read_shared_network_id, '--json')
|
359
363
|
end
|
360
364
|
info = {
|
361
365
|
name: net_info['Bound To'],
|
@@ -468,6 +472,10 @@ module VagrantPlugins
|
|
468
472
|
end
|
469
473
|
end
|
470
474
|
|
475
|
+
def ssh_ip
|
476
|
+
read_guest_ip
|
477
|
+
end
|
478
|
+
|
471
479
|
def ssh_port(expected_port)
|
472
480
|
expected_port
|
473
481
|
end
|