vagrant/plugins/guests/windows/cap/configure_networks.rb

73 lines
3.0 KiB
Ruby
Raw Normal View History

require "log4r"
require_relative '../../communication/guestnetwork'
require_relative '../../communication/winrmshell'
require_relative '../../errors'
require_relative '../../helper'
require_relative '../../windows_machine'
module VagrantPlugins
module GuestWindows
module Cap
module ConfigureNetworks
@@logger = Log4r::Logger.new("vagrant::guest::windows::configure_networks")
def self.configure_networks(machine, networks)
@@logger.debug("Networks: #{networks.inspect}")
windows_machine = VagrantWindows::WindowsMachine.new(machine)
guest_network = VagrantWindows::Communication::GuestNetwork.new(windows_machine.winrmshell)
if windows_machine.is_vmware?()
@@logger.warn('Configuring secondary network adapters through VMware is not yet supported.')
@@logger.warn('You will need to manually configure the network adapter.')
else
vm_interface_map = create_vm_interface_map(windows_machine, guest_network)
networks.each do |network|
interface = vm_interface_map[network[:interface]+1]
if interface.nil?
@@logger.warn("Could not find interface for network #{network.inspect}")
next
end
network_type = network[:type].to_sym
if network_type == :static
guest_network.configure_static_interface(
interface[:index],
interface[:net_connection_id],
network[:ip],
network[:netmask])
elsif network_type == :dhcp
guest_network.configure_dhcp_interface(
interface[:index],
interface[:net_connection_id])
else
raise WindowsError, "#{network_type} network type is not supported, try static or dhcp"
end
end
end
guest_network.set_all_networks_to_work() if windows_machine.windows_config.set_work_network
end
#{1=>{:name=>"Local Area Connection", :mac_address=>"0800275FAC5B", :interface_index=>"11", :index=>"7"}}
def self.create_vm_interface_map(windows_machine, guest_network)
vm_interface_map = {}
driver_mac_address = windows_machine.read_mac_addresses.invert
@@logger.debug("mac addresses: #{driver_mac_address.inspect}")
guest_network.network_adapters().each do |nic|
@@logger.debug("nic: #{nic.inspect}")
naked_mac = nic[:mac_address].gsub(':','')
if driver_mac_address[naked_mac]
vm_interface_map[driver_mac_address[naked_mac]] = {
:net_connection_id => nic[:net_connection_id],
:mac_address => naked_mac,
:interface_index => nic[:interface_index],
:index => nic[:index] }
end
end
@@logger.debug("vm_interface_map: #{vm_interface_map.inspect}")
vm_interface_map
end
end
end
end
end