/usr/share/fusioninventory/lib/FusionInventory/Agent/Task/Inventory/Linux/Storages.pm is in fusioninventory-agent 1:2.3.10.1-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | package FusionInventory::Agent::Task::Inventory::Linux::Storages;
use strict;
use warnings;
use English qw(-no_match_vars);
use FusionInventory::Agent::Tools;
use FusionInventory::Agent::Tools::Linux;
sub isEnabled {
return 1;
}
sub doInventory {
my (%params) = @_;
my $inventory = $params{inventory};
my $logger = $params{logger};
# get devices list from hal, if available, from sysfs otherwise
my @devices = canRun('lshal') ?
getDevicesFromHal(logger => $logger) :
getDevicesFromProc(logger => $logger);
# complete with udev for missing bits, if available
if (-d '/dev/.udev/db/') {
my %udev_devices = map { $_->{NAME} => $_ }
getDevicesFromUdev(logger => $logger);
foreach my $device (@devices) {
# find corresponding udev entry
my $udev_device = $udev_devices{$device->{NAME}};
next unless $udev_device;
foreach my $key (keys %$udev_device) {
next if $device->{$key};
$device->{$key} = $udev_device->{$key};
}
}
}
# get serial & firmware numbers from hdparm, if available
if (_correctHdparmAvailable()) {
foreach my $device (@devices) {
next if $device->{SERIALNUMBER} && $device->{FIRMWARE};
my $handle = getFileHandle(
command => "hdparm -I /dev/$device->{NAME}",
logger => $logger
);
next unless $handle;
while (my $line = <$handle>) {
if ($line =~ /^\s+Serial Number\s*:\s*(.+)/i) {
my $value = $1;
$value =~ s/\s+$//;
$device->{SERIALNUMBER} = $value
if !$device->{SERIALNUMBER};
next;
} elsif ($line =~ /^\s+Firmware Revision\s*:\s*(.+)/i) {
my $value = $1;
$value =~ s/\s+$//;
$device->{FIRMWARE} = $value
if !$device->{FIRMWARE};
next;
} elsif ($line =~ /^\s*Transport:.*(SCSI|SATA|USB)/) {
$device->{DESCRIPTION} = $1;
} elsif ($line =~ /^\s*Model Number:\s*(.*?)\s*$/) {
$device->{MODEL} = $1;
} elsif ($line =~ /Logical Unit WWN Device Identifier:\s*(.*?)\s*$/) {
$device->{WWN} = $1;
}
}
close $handle;
}
}
foreach my $device (@devices) {
if (!$device->{DESCRIPTION}) {
$device->{DESCRIPTION} = _getDescription(
$device->{NAME},
$device->{MANUFACTURER},
$device->{DESCRIPTION},
$device->{SERIALNUMBER}
);
}
if (!$device->{MANUFACTURER} or $device->{MANUFACTURER} eq 'ATA') {
$device->{MANUFACTURER} = getCanonicalManufacturer(
$device->{MODEL}
);
}
if ($device->{DISKSIZE} && $device->{TYPE} =~ /^cd/) {
$device->{DISKSIZE} = getDeviceCapacity(device => '/dev/' . $device->{NAME});
}
$inventory->addEntry(section => 'STORAGES', entry => $device);
}
}
sub _getDescription {
my ($name, $manufacturer, $description, $serialnumber) = @_;
# detected as USB by udev
# TODO maybe we should trust udev detection by default?
return "USB" if ($description && $description =~ /usb/i);
if ($name =~ /^s/) { # /dev/sd* are SCSI _OR_ SATA
if (
($manufacturer && $manufacturer =~ /ATA/) ||
($serialnumber && $serialnumber =~ /ATA/) ||
($description && $description =~ /ATA/)
) {
return "SATA";
} else {
return "SCSI";
}
} elsif ($name =~ /^vd/) {
return "Virtual";
} else {
return "IDE";
}
}
# some hdparm release generated kernel error if they are
# run on CDROM device
# http://forums.ocsinventory-ng.org/viewtopic.php?pid=20810
sub _correctHdparmAvailable {
return unless canRun('hdparm');
my ($major, $minor) = getFirstMatch(
command => 'hdparm -V',
pattern => qr/^hdparm v(\d+)\.(\d+)/
);
# we need at least version 9.15
return compareVersion($major, $minor, 9, 15);
}
1;
|