plugins/guests/linux/cap/network_interfaces.rb in vagrant-unbundled-1.8.5.2 vs plugins/guests/linux/cap/network_interfaces.rb in vagrant-unbundled-1.9.1.1

- old
+ new

@@ -1,19 +1,67 @@ module VagrantPlugins module GuestLinux module Cap class NetworkInterfaces + # Valid ethernet device prefix values. + # eth - classic prefix + # en - predictable interface names prefix + POSSIBLE_ETHERNET_PREFIXES = ["eth".freeze, "en".freeze].freeze + + @@logger = Log4r::Logger.new("vagrant::guest::linux::network_interfaces") + # Get network interfaces as a list. The result will be something like: # # eth0\nenp0s8\nenp0s9 # # @return [Array<String>] def self.network_interfaces(machine, path = "/sbin/ip") s = "" machine.communicate.sudo("#{path} -o -0 addr | grep -v LOOPBACK | awk '{print $2}' | sed 's/://'") do |type, data| s << data if type == :stdout end - s.split("\n") + ifaces = s.split("\n") + @@logger.debug("Unsorted list: #{ifaces.inspect}") + # Break out integers from strings and sort the arrays to provide + # a natural sort for the interface names + # NOTE: Devices named with a hex value suffix will _not_ be sorted + # as expected. This is generally seen with veth* devices, and proper ordering + # is currently not required + ifaces = ifaces.map do |iface| + iface.scan(/(.+?)(\d+)/).flatten.map do |iface_part| + if iface_part.to_i.to_s == iface_part + iface_part.to_i + else + iface_part + end + end + end + ifaces = ifaces.sort do |lhs, rhs| + result = 0 + slice_length = [rhs.size, lhs.size].min + slice_length.times do |idx| + if(lhs[idx].is_a?(rhs[idx].class)) + result = lhs[idx] <=> rhs[idx] + elsif(lhs[idx].is_a?(String)) + result = 1 + else + result = -1 + end + break if result != 0 + end + result + end.map(&:join) + @@logger.debug("Sorted list: #{ifaces.inspect}") + # Extract ethernet devices and place at start of list + resorted_ifaces = [] + resorted_ifaces += ifaces.find_all do |iface| + POSSIBLE_ETHERNET_PREFIXES.any?{|prefix| iface.start_with?(prefix)} && + iface.match(/^[a-zA-Z0-9]+$/) + end + resorted_ifaces += ifaces - resorted_ifaces + ifaces = resorted_ifaces + @@logger.debug("Ethernet preferred sorted list: #{ifaces.inspect}") + ifaces end end end end end