lib/vagrant-windows/guest/windows.rb in vagrant-windows-0.1.2 vs lib/vagrant-windows/guest/windows.rb in vagrant-windows-1.0.0

- old
+ new

@@ -1,47 +1,54 @@ -module Vagrant +module VagrantWindows module Guest # A general Vagrant system implementation for "windows". # # Contributed by Chris McClimans <chris@hippiehacker.org> - class Windows < Base - # A custom config class which will be made accessible via `config.windows` - # Here for whenever it may be used. - class WindowsError < Errors::VagrantError - error_namespace("vagrant.guest.windows") + class Windows < Vagrant.plugin("2", :guest) + + attr_reader :machine + + def initialize(machine) + super(machine) + @machine = machine + @logger = Log4r::Logger.new("vagrant_windows::guest::windows") end def change_host_name(name) + @logger.info("change host name to: #{name}") #### on windows, renaming a computer seems to require a reboot - vm.channel.execute("wmic computersystem where name=\"%COMPUTERNAME%\" call rename name=\"#{name}\"") + @machine.communicate.execute( + "wmic computersystem where name=\"%COMPUTERNAME%\" call rename name=\"#{name}\"", + :shell => :cmd) end # TODO: I am sure that ciphering windows versions will be important at some point def distro_dispatch + @logger.info("distro_dispatch: windows") :windows end def halt - @vm.channel.execute("shutdown /s /t 1 /c \"Vagrant Halt\" /f /d p:4:1") + @machine.communicate.execute("shutdown /s /t 1 /c \"Vagrant Halt\" /f /d p:4:1") # Wait until the VM's state is actually powered off. If this doesn't # occur within a reasonable amount of time (15 seconds by default), # then simply return and allow Vagrant to kill the machine. count = 0 - while @vm.state != :poweroff + while @machine.state != :poweroff count += 1 - return if count >= @vm.config.windows.halt_timeout - sleep @vm.config.windows.halt_check_interval + return if count >= @machine.config.windows.halt_timeout + sleep @machine.config.windows.halt_check_interval end end def mount_shared_folder(name, guestpath, options) - mount_script = TemplateRenderer.render(File.expand_path("#{File.dirname(__FILE__)}/../scripts/mount_volume.ps1"), - :options => {:mount_point => guestpath, :name => name}) - - @vm.channel.execute(mount_script,{:shell => :powershell}) + @logger.info("mount_shared_folder: #{name}") + mount_script = VagrantWindows.load_script_template("mount_volume.ps1", + :options => {:mount_point => guestpath, :name => name}) + @machine.communicate.execute(mount_script, {:shell => :powershell}) end def mount_nfs(ip, folders) raise NotImplementedError, "Mounting NFS Shares on windows is not implemented" # TODO: Maybe check for nfs support on the guest, since its often @@ -49,56 +56,54 @@ #folders.each do |name, opts| # # Expand the guestpath, so we can handle things like "~/vagrant" # real_guestpath = expanded_guest_path(opts[:guestpath]) # Do the actual creating and mounting - # @vm.channel.sudo("mkdir -p #{real_guestpath}") - # @vm.channel.sudo("mount -o vers=#{opts[:nfs_version]} #{ip}:'#{opts[:hostpath]}' #{real_guestpath}", + # @machine.communicate.sudo("mkdir -p #{real_guestpath}") + # @machine.communicate.sudo("mount -o vers=#{opts[:nfs_version]} #{ip}:'#{opts[:hostpath]}' #{real_guestpath}", # :error_class => LinuxError, # :error_key => :mount_nfs_fail) #end end def configure_networks(networks) - ### HACK!!!!! - Nori.advanced_typecasting = false - if driver_mac_address = @vm.driver.read_mac_addresses - driver_mac_address = driver_mac_address.invert + @logger.info("configure_networks: #{networks.inspect}") + + # The VBox driver 4.0 and 4.1 implement read_mac_addresses, but 4.2 does not? + begin + driver_mac_address = @machine.provider.driver.read_mac_addresses.invert + rescue NoMethodError + driver_mac_address = {} + driver_mac_address[@machine.provider.driver.read_mac_address] = "macaddress1" end vm_interface_map = {} - @vm.channel.session.wql("SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionStatus=2")[:win32_network_adapter].each do |nic| + + # NetConnectionStatus=2 -- connected + wql = "SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionStatus=2" + @machine.communicate.session.wql(wql)[:win32_network_adapter].each do |nic| naked_mac = nic[:mac_address].gsub(':','') if driver_mac_address[naked_mac] - vm_interface_map[driver_mac_address[naked_mac]] = { :name => nic[:net_connection_id], :mac_address => naked_mac, :index => nic[:interface_index] } + vm_interface_map[driver_mac_address[naked_mac]] = + { :name => nic[:net_connection_id], :mac_address => naked_mac, :index => nic[:interface_index] } end end + networks.each do |network| + netsh = "netsh interface ip set address \"#{vm_interface_map[network[:interface]+1][:name]}\" " if network[:type].to_sym == :static - vm.channel.execute("netsh interface ip set address \"#{vm_interface_map[network[:interface]+1][:name]}\" static #{network[:ip]} #{network[:netmask]}") + netsh = "#{netsh} static #{network[:ip]} #{network[:netmask]}" elsif network[:type].to_sym == :dhcp - vm.channel.execute("netsh interface ip set address \"#{vm_interface_map[network[:interface]+1][:name]}\" dhcp") + netsh = "#{netsh} dhcp" + else + raise WindowsError, "#{network[:type]} network type is not supported, try static or dhcp" end + @machine.communicate.execute(netsh) end #netsh interface ip set address name="Local Area Connection" static 192.168.0.100 255.255.255.0 192.168.0.1 1 end - - def windows_path(path) - p = '' - if path =~ /^\// - p << 'C:\\' - end - p << path - p.gsub! /\//, "\\" - p.gsub /\\\\{0,}/, "\\" - end - - - end end end - -Vagrant.guests.register(:windows) { Vagrant::Guest::Windows } \ No newline at end of file