/usr/share/fusioninventory/lib/FusionInventory/Agent/Task/Inventory/MacOS/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 | package FusionInventory::Agent::Task::Inventory::MacOS::Storages;
use strict;
use warnings;
use FusionInventory::Agent::Tools;
use FusionInventory::Agent::Tools::MacOS;
sub isEnabled {
return 1;
}
sub doInventory {
my (%params) = @_;
my $inventory = $params{inventory};
my $logger = $params{logger};
foreach my $storage (_getStorages(logger => $logger)) {
$inventory->addEntry(
section => 'STORAGES',
entry => $storage
);
}
}
sub _getStorages {
my (%params) = @_;
my $infos = getSystemProfilerInfos(
logger => $params{logger},
file => $params{file}
);
# system profiler data structure:
# bus
# └── controller
# ├── device
# │ ├── subdevice
# │ │ └── key:value
# │ └── key:value
# └── key:value
my @storages;
my @busNames = ('ATA', 'SERIAL-ATA', 'USB', 'FireWire', 'Fibre Channel');
foreach my $busName (@busNames) {
my $bus = $infos->{$busName};
next unless $bus;
foreach my $controllerName (keys %{$bus}) {
my $controller = $bus->{$controllerName};
foreach my $deviceName (keys %{$controller}) {
my $device = $controller->{$deviceName};
next unless ref $device eq 'HASH';
if (_isStorage($device)) {
push @storages,
_getStorage($device, $deviceName, $busName);
} else {
foreach my $subdeviceName (keys %{$device}) {
my $subdevice = $device->{$subdeviceName};
next unless ref $subdevice eq 'HASH';
push @storages,
_getStorage($subdevice, $subdeviceName, $busName)
if _isStorage($subdevice);
}
}
}
}
}
return @storages;
}
sub _isStorage {
my ($device) = @_;
return
($device->{'BSD Name'} && $device->{'BSD Name'} =~ /^disk\d+$/) ||
($device->{'Protocol'} && $device->{'Socket Type'});
}
sub _getStorage {
my ($device, $device_name, $bus_name) = @_;
my $storage = {
NAME => $device_name,
MANUFACTURER => getCanonicalManufacturer($device_name),
TYPE => $bus_name eq 'FireWire' ? '1394' : $bus_name,
SERIAL => $device->{'Serial Number'},
FIRMWARE => $device->{'Revision'},
MODEL => $device->{'Model'},
DISKSIZE => $device->{'Capacity'}
};
if (!$device->{'Protocol'}) {
$storage->{DESCRIPTION} = 'Disk drive';
} elsif ($device->{'Protocol'} eq 'ATAPI' || $device->{'Drive Type'}) {
$storage->{DESCRIPTION} = 'CD-ROM Drive';
}
if ($storage->{DISKSIZE}) {
#e.g: Capacity: 320,07 GB (320 072 933 376 bytes)
$storage->{DISKSIZE} =~ s/\s*\(.*//;
$storage->{DISKSIZE} =~ s/,/./;
if ($storage->{DISKSIZE} =~ s/\s*TB//) {
$storage->{DISKSIZE} = int($storage->{DISKSIZE} * 1000 * 1000);
} elsif ($storage->{DISKSIZE} =~ s/\s+GB$//) {
$storage->{DISKSIZE} = int($storage->{DISKSIZE} * 1000 * 1000);
}
}
if ($storage->{MODEL}) {
$storage->{MODEL} =~ s/\s*$storage->{MANUFACTURER}\s*//i;
}
return $storage;
}
1;
|