diff --git a/plugins/guests/redhat/cap/configure_networks.rb b/plugins/guests/redhat/cap/configure_networks.rb index 58161e1be..eb30474c5 100644 --- a/plugins/guests/redhat/cap/configure_networks.rb +++ b/plugins/guests/redhat/cap/configure_networks.rb @@ -13,27 +13,28 @@ module VagrantPlugins def self.configure_networks(machine, networks) network_scripts_dir = machine.guest.capability("network_scripts_dir") - interface_names = machine.guest.capability("interfaces_list") - + # Accumulate the configurations to add to the interfaces file as # well as what interfaces we're actually configuring since we use that # later. interfaces = Set.new networks.each do |network| - interface = interface_names[network[:interface]] - interfaces.add(interface) - network[:device] = interface - + interfaces.add(network[:interface]) + + # Down the interface before munging the config file. This might fail + # if the interface is not actually set up yet so ignore errors. + machine.communicate.sudo( + "/sbin/ifdown eth#{network[:interface]} 2> /dev/null", error_check: false) + # Remove any previous vagrant configuration in this network interface's # configuration files. - machine.communicate.sudo("touch #{network_scripts_dir}/ifcfg-#{interface}") - machine.communicate.sudo("sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' #{network_scripts_dir}/ifcfg-#{interface} > /tmp/vagrant-ifcfg-#{interface}") - machine.communicate.sudo("cat /tmp/vagrant-ifcfg-#{interface} > #{network_scripts_dir}/ifcfg-#{interface}") - machine.communicate.sudo("rm /tmp/vagrant-ifcfg-#{interface}") - + machine.communicate.sudo("touch #{network_scripts_dir}/ifcfg-eth#{network[:interface]}") + machine.communicate.sudo("sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' #{network_scripts_dir}/ifcfg-eth#{network[:interface]} > /tmp/vagrant-ifcfg-eth#{network[:interface]}") + machine.communicate.sudo("cat /tmp/vagrant-ifcfg-eth#{network[:interface]} > #{network_scripts_dir}/ifcfg-eth#{network[:interface]}") + machine.communicate.sudo("rm -f /tmp/vagrant-ifcfg-eth#{network[:interface]}") + # Render and upload the network entry file to a deterministic # temporary location. - # use fedora for now entry = TemplateRenderer.render("guests/redhat/network_#{network[:type]}", :options => network) @@ -42,7 +43,7 @@ module VagrantPlugins temp.write(entry) temp.close - machine.communicate.upload(temp.path, "/tmp/vagrant-network-entry_#{interface}") + machine.communicate.upload(temp.path, "/tmp/vagrant-network-entry_#{network[:interface]}") end # Bring down all the interfaces we're reconfiguring. By bringing down @@ -50,11 +51,17 @@ module VagrantPlugins # SSH never dies. interfaces.each do |interface| retryable(:on => Vagrant::Errors::VagrantError, :tries => 3, :sleep => 2) do - machine.communicate.sudo("cat /tmp/vagrant-network-entry_#{interface} >> #{network_scripts_dir}/ifcfg-#{interface}") - machine.communicate.sudo("/sbin/ifdown #{interface}", :error_check => true) - machine.communicate.sudo("/sbin/ifup #{interface}") + # The interface should already be down so this probably + # won't do anything, so we run it with error_check false. + machine.communicate.sudo( + "/sbin/ifdown eth#{interface} 2> /dev/null", error_check: false) + + # Add the new interface and bring it up + machine.communicate.sudo("cat /tmp/vagrant-network-entry_#{interface} >> #{network_scripts_dir}/ifcfg-eth#{interface}") + machine.communicate.sudo("ARPCHECK=no /sbin/ifup eth#{interface} 2> /dev/null") end - machine.communicate.sudo("rm /tmp/vagrant-network-entry_#{interface}") + + machine.communicate.sudo("rm -f /tmp/vagrant-network-entry_#{interface}") end end end diff --git a/plugins/guests/redhat/cap/interfaces_list.rb b/plugins/guests/redhat/cap/interfaces_list.rb deleted file mode 100644 index d7e88702e..000000000 --- a/plugins/guests/redhat/cap/interfaces_list.rb +++ /dev/null @@ -1,32 +0,0 @@ -module VagrantPlugins - module GuestRedHat - module Cap - class InterfacesList - def self.interfaces_list(machine) - version = String.new - machine.communicate.sudo("cat /etc/redhat-release | sed -e 's/.*release\ //' | cut -f1 -d' '") do |_, result| - # Only care about the major version for now - version = result.split('.').first - end - - interface_names = Array.new - - # In theory this would work with even older versions as dmesg has been relatively static for a long time - if version.to_i < 6 - machine.communicate.sudo("dmesg | cut -f2 -d: | sed -e 's/^\ //' | sed -e 's/\ .*$//' | grep eth") do |_, result| - # It has two results ? - Quick hack to compensate - interface_names = result.split("\n").uniq.sort if interface_names.empty? - end - else - machine.communicate.sudo("biosdevname -d | grep Kernel | cut -f2 -d: | sed -e 's/ //;'") do |_, result| - # The previous had two results. This one never has. Do the same check for now. - interface_names = result.split("\n") if interface_names.empty? - end - end - - return interface_names - end - end - end - end -end \ No newline at end of file diff --git a/plugins/guests/redhat/plugin.rb b/plugins/guests/redhat/plugin.rb index e6155ca73..56e6b8031 100644 --- a/plugins/guests/redhat/plugin.rb +++ b/plugins/guests/redhat/plugin.rb @@ -35,11 +35,6 @@ module VagrantPlugins require_relative "cap/rsync" Cap::RSync end - - guest_capability("redhat", "interfaces_list") do - require_relative "cap/interfaces_list" - Cap::InterfacesList - end end end end diff --git a/templates/guests/redhat/network_dhcp.erb b/templates/guests/redhat/network_dhcp.erb index b15250cc2..8bbaa62e4 100644 --- a/templates/guests/redhat/network_dhcp.erb +++ b/templates/guests/redhat/network_dhcp.erb @@ -2,5 +2,5 @@ # The contents below are automatically generated by Vagrant. Do not modify. BOOTPROTO=dhcp ONBOOT=yes -DEVICE=<%= options[:device] %> +DEVICE=eth<%= options[:interface] %> #VAGRANT-END diff --git a/templates/guests/redhat/network_static.erb b/templates/guests/redhat/network_static.erb index 7af20cd7a..c28dd74cb 100644 --- a/templates/guests/redhat/network_static.erb +++ b/templates/guests/redhat/network_static.erb @@ -5,6 +5,6 @@ BOOTPROTO=none ONBOOT=yes IPADDR=<%= options[:ip] %> NETMASK=<%= options[:netmask] %> -DEVICE=<%= options[:device] %> +DEVICE=eth<%= options[:interface] %> PEERDNS=no #VAGRANT-END