FusionInventory-Agent
view release on metacpan or search on metacpan
lib/FusionInventory/Agent/Tools/Linux.pm view on Meta::CPAN
package FusionInventory::Agent::Tools::Linux;
use strict;
use warnings;
use parent 'Exporter';
# Constant for ethtool system call
use constant SIOCETHTOOL => 0x8946 ; # See linux/sockios.h
use constant ETHTOOL_GSET => 0x00000001 ; # See linux/ethtool.h
use constant SPEED_UNKNOWN => 65535 ; # See linux/ethtool.h, to be read as -1
use English qw(-no_match_vars);
use File::Basename qw(basename dirname);
use Memoize;
use Socket qw(PF_INET SOCK_DGRAM);
use FusionInventory::Agent::Tools;
use FusionInventory::Agent::Tools::Unix;
use FusionInventory::Agent::Tools::Network;
our @EXPORT = qw(
getDevicesFromUdev
getDevicesFromHal
getDevicesFromProc
getCPUsFromProc
getInfoFromSmartctl
getInterfacesFromIfconfig
getInterfacesFromIp
getInterfacesInfosFromIoctl
);
memoize('getDevicesFromUdev');
sub getDevicesFromUdev {
my (%params) = @_;
my @devices;
# We need to support dump params to permit full testing when root params is set
my $root = $params{root} || "";
foreach my $file (glob "$root/dev/.udev/db/*") {
if ($params{dump} && -e $file) {
my $base = basename($file);
my $content = getAllLines(file => $file);
$params{dump}->{dev}->{'.udev'}->{db}->{$base} = $content;
}
my $device = getFirstMatch(
file => $file,
pattern => qr/^N:(\S+)/
);
next unless $device;
next unless $device =~ /([hsv]d[a-z]+|sr\d+)$/;
my $parsed = _parseUdevEntry(
logger => $params{logger},
file => $file,
device => $device
);
push @devices, $parsed if $parsed;
}
foreach my $device (@devices) {
next if $device->{TYPE} && $device->{TYPE} eq 'cd';
$device->{DISKSIZE} = getDeviceCapacity(
device => '/dev/' . $device->{NAME},
%params
);
}
lib/FusionInventory/Agent/Tools/Linux.pm view on Meta::CPAN
$interface->{TYPE} = 'ethernet';
}
if ($line =~ /inet6 \s (\S+)/x) {
$interface->{IPADDRESS6} = $1;
}
if ($line =~ /inet addr:($ip_address_pattern)/i) {
$interface->{IPADDRESS} = $1;
}
if ($line =~ /Mask:($ip_address_pattern)/) {
$interface->{IPMASK} = $1;
}
if ($line =~ /inet6 addr: (\S+)/i) {
$interface->{IPADDRESS6} = $1;
}
if ($line =~ /hwadd?r\s+($mac_address_pattern)/i) {
$interface->{MACADDR} = $1;
}
if ($line =~ /^\s+UP\s/) {
$interface->{STATUS} = 'Up';
}
if ($line =~ /flags=.*[<,]UP[>,]/) {
$interface->{STATUS} = 'Up';
}
if ($line =~ /Link encap:(\S+)/) {
$interface->{TYPE} = $types{$1};
}
}
close $handle;
return @interfaces;
}
sub getInterfacesInfosFromIoctl {
my (%params) = (
interface => 'eth0',
@_
);
return unless $params{interface};
my $logger = $params{logger};
socket(my $socket, PF_INET, SOCK_DGRAM, 0)
or return ;
# Pack command in ethtool_cmd struct
my $cmd = pack("L3SC6L2SC2L3", ETHTOOL_GSET);
# Pack request for ioctl
my $request = pack("a16p", $params{interface}, $cmd);
my $retval = ioctl($socket, SIOCETHTOOL, $request) || -1;
return if ($retval < 0);
# Unpack returned datas
my @datas = unpack("L3SC6L2SC2L3", $cmd);
# Actually only speed value is requested and extracted
my $datas = {
SPEED => $datas[3]|$datas[12]<<16
};
# Forget speed value if got unknown speed special value
if ($datas->{SPEED} == SPEED_UNKNOWN) {
delete $datas->{SPEED};
$logger->debug2("Unknown speed found on $params{interface}")
if $logger;
}
return $datas;
}
sub getInterfacesFromIp {
my (%params) = (
command => '/sbin/ip addr show',
@_
);
my $handle = getFileHandle(%params);
return unless $handle;
my (@interfaces, @addresses, $interface);
while (my $line = <$handle>) {
if ($line =~ /^\d+:\s+(\S+): <([^>]+)>/) {
if (@addresses) {
push @interfaces, @addresses;
undef @addresses;
} elsif ($interface) {
push @interfaces, $interface;
}
my ($name, $flags) = ($1, $2);
my $status =
(any { $_ eq 'UP' } split(/,/, $flags)) ? 'Up' : 'Down';
$interface = {
DESCRIPTION => $name,
STATUS => $status
};
} elsif ($line =~ /link\/\S+ ($any_mac_address_pattern)?/) {
$interface->{MACADDR} = $1;
} elsif ($line =~ /inet6 (\S+)\/(\d{1,2})/) {
my $address = $1;
my $mask = getNetworkMaskIPv6($2);
my $subnet = getSubnetAddressIPv6($address, $mask);
push @addresses, {
IPADDRESS6 => $address,
IPMASK6 => $mask,
IPSUBNET6 => $subnet,
( run in 1.901 second using v1.01-cache-2.11-cpan-a49fcb8fa48 )