diff -Nur e-smith-lib-2.4.0/root/usr/share/perl5/vendor_perl/esmith/ethernet.pm e-smith-lib-2.4.0-nokudzu/root/usr/share/perl5/vendor_perl/esmith/ethernet.pm --- e-smith-lib-2.4.0/root/usr/share/perl5/vendor_perl/esmith/ethernet.pm 2013-01-25 17:09:11.000000000 +0100 +++ e-smith-lib-2.4.0-nokudzu/root/usr/share/perl5/vendor_perl/esmith/ethernet.pm 2013-01-31 18:22:05.610588921 +0100 @@ -9,6 +9,7 @@ #---------------------------------------------------------------------- use strict; +use File::Basename; =head1 NAME @@ -37,36 +38,52 @@ sub probeAdapters () { - my @devs; - my $r; - local $ENV{PATH} = "/bin:/sbin:/usr/bin:/usr/sbin"; - unless (open(HWC, "/usr/sbin/kudzu --probe --class network|")) - { - warn "Could not run kudzu probe: $!"; - return ""; - } - while () - { - if (/^-/) - { - $r = {}; - push @devs, $r; - } - if (/(.+): (.+)/) - { - $r->{$1} = $2; - } - } - close HWC; - - my @nics = grep { $_->{device} && $_->{device} =~ /^eth/ } @devs; - my $adapters = ''; + opendir(my $dh, "/sys/class/net") or die "Couldn't open /sys/class/net: $!"; + my @nics = grep { $_ !~ m/^\./ } readdir($dh); + closedir($dh); + my $adapters = ''; my $index = 1; - foreach my $nic (@nics) - { - $adapters .= - "EthernetDriver" . $index++ . "\t" . $nic->{driver} . "\t" - . $nic->{'network.hwaddr'} . "\t" . $nic->{desc} . "\n"; + foreach my $nic (@nics){ + next if ( + # skip loopback + $nic eq 'lo' || + # skip non links + !-l "/sys/class/net/$nic" || + # skip wireless nics + -d "/sys/class/net/$nic/wireless" || + -l "/sys/class/net/$nic/phy80211" || + # skip bridges + -d "/sys/class/net/$nic/bridge" || + # skip vlans + -f "/proc/net/vlan/$nic" || + # skip bonds + -d "/sys/class/net/$nic/bonding" || + # skip tun/tap + -f "/sys/class/net/$nic/tun_flags" || + # skip dummy + -d "/sys/devices/virtual/net/$nic" + ); + # Now we should be left only wth ethernet adapters + open HW, "/sys/class/net/$nic/address"; + my $mac = join("", ); + chomp($mac); + close HW; + my $driver = basename (readlink "/sys/class/net/$nic/device/driver"); + my $bus = basename (readlink "/sys/class/net/$nic/device/subsystem"); + my $desc = $nic; + if ($bus eq 'pci'){ + my $dev = basename (readlink "/sys/class/net/$nic/device"); + $desc = `/sbin/lspci -s $dev`; + # Extract only description + $desc =~ m/^.*:.*:\s+(.*)\s*/; + $desc = $1; + } + elsif ($bus eq 'virtio'){ + $desc = 'Virtio Network Device'; + } + # TODO: we should also try to get the description of USB devices + $adapters .= "EthernetDriver" . $index++ . "\t" . $driver . "\t" . + $mac . "\t" . "\"$desc\"" . "\n"; } return $adapters; }