FusionInventory-Agent
view release on metacpan or search on metacpan
lib/FusionInventory/Agent/Task/Inventory/Linux/Drives.pm view on Meta::CPAN
package FusionInventory::Agent::Task::Inventory::Linux::Drives;
use strict;
use warnings;
use parent 'FusionInventory::Agent::Task::Inventory::Module';
use FusionInventory::Agent::Tools;
use FusionInventory::Agent::Tools::Unix;
sub isEnabled {
my (%params) = @_;
return 0 if $params{no_category}->{drive};
return
canRun('df') ||
canRun('lshal');
}
sub doInventory {
my (%params) = @_;
my $inventory = $params{inventory};
my $logger = $params{logger};
foreach my $filesystem (_getFilesystems($logger)) {
$inventory->addEntry(
section => 'DRIVES',
entry => $filesystem
);
}
}
sub _getFilesystems {
my ($logger) = @_;
# get filesystems list
my @filesystems =
# exclude virtual file systems and overlay fs defined by docker
grep { $_->{FILESYSTEM} !~ /^(tmpfs|devtmpfs|usbfs|proc|devpts|devshm|udev)$/ && $_->{VOLUMN} !~ /^overlay$/ }
# get all file systems
getFilesystemsFromDf(logger => $logger, command => 'df -P -T -k');
# get additional informations
if (canRun('blkid')) {
# use blkid if available, as it is filesystem-independent
foreach my $filesystem (@filesystems) {
$filesystem->{SERIAL} = getFirstMatch(
logger => $logger,
command => "blkid -w /dev/null $filesystem->{VOLUMN}",
pattern => qr/\sUUID="(\S*)"\s/
);
}
} else {
# otherwise fallback to filesystem-dependant utilities
my $has_dumpe2fs = canRun('dumpe2fs');
my $has_xfs_db = canRun('xfs_db');
my $has_dosfslabel = canRun('dosfslabel');
my %months = (
Jan => 1,
Feb => 2,
Mar => 3,
Apr => 4,
May => 5,
Jun => 6,
Jul => 7,
Aug => 8,
Sep => 9,
Oct => 10,
Nov => 11,
Dec => 12,
);
foreach my $filesystem (@filesystems) {
if ($filesystem->{FILESYSTEM} =~ /^ext(2|3|4|4dev)/ && $has_dumpe2fs) {
my $handle = getFileHandle(
logger => $logger,
command => "dumpe2fs -h $filesystem->{VOLUMN}"
);
next unless $handle;
while (my $line = <$handle>) {
if ($line =~ /Filesystem UUID:\s+(\S+)/) {
$filesystem->{SERIAL} = $1;
} elsif ($line =~ /Filesystem created:\s+\w+\s+(\w+)\s+(\d+)\s+([\d:]+)\s+(\d{4})$/) {
$filesystem->{CREATEDATE} = "$4/$months{$1}/$2 $3";
} elsif ($line =~ /Filesystem volume name:\s*(\S.*)/) {
$filesystem->{LABEL} = $1 unless $1 eq '<none>';
}
}
close $handle;
next;
}
if ($filesystem->{FILESYSTEM} eq 'xfs' && $has_xfs_db) {
$filesystem->{SERIAL} = getFirstMatch(
logger => $logger,
command => "xfs_db -r -c uuid $filesystem->{VOLUMN}",
pattern => qr/^UUID =\s+(\S+)/
);
$filesystem->{LABEL} = getFirstMatch(
( run in 1.939 second using v1.01-cache-2.11-cpan-a49fcb8fa48 )