/usr/local/CPAN/Ocsinventory-Agent/Ocsinventory/Agent/Backend/OS/Generic/Dmidecode/Memory.pm
package Ocsinventory::Agent::Backend::OS::Generic::Dmidecode::Memory;
use strict;
sub run {
my $params = shift;
my $inventory = $params->{inventory};
my $dmidecode = `dmidecode`; # TODO retrieve error
# some versions of dmidecode do not separate items with new lines
# so add a new line before each handle
$dmidecode =~ s/\nHandle/\n\nHandle/g;
my @dmidecode = split (/\n/, $dmidecode);
# add a new line at the end
push @dmidecode, "\n";
s/^\s+// for (@dmidecode);
my $flag;
my $capacity;
my $speed;
my $type;
my $description;
my $numslot;
my $caption;
my $serialnumber;
foreach (@dmidecode) {
if (/dmi type 17,/i) { # begining of Memory Device section
$flag = 1;
$numslot++;
} elsif ($flag && /^$/) { # end of section
$flag = 0;
$inventory->addMemories({
CAPACITY => $capacity,
DESCRIPTION => $description,
CAPTION => $caption,
SPEED => $speed,
TYPE => $type,
NUMSLOTS => $numslot,
SERIALNUMBER => $serialnumber,
});
$capacity = $description = $caption = $type = $type = $serialnumber = undef;
} elsif ($flag) { # in the section
$capacity = $1 if /^size\s*:\s*(\S+)/i;
$description = $1 if /^Form Factor\s*:\s*(.+)/i;
$caption = $1 if /^Locator\s*:\s*(.+)/i;
$speed = $1 if /^speed\s*:\s*(.+)/i;
$type = $1 if /^type\s*:\s*(.+)/i;
$serialnumber = $1 if /^Serial Number\s*:\s*(.+)/i;
}
}
}
1;