our
$VERSION
=
'1.15.0.2'
;
sub
new {
my
$that
=
shift
;
my
$proto
=
ref
(
$that
) ||
$that
;
my
$self
= {
@_
};
bless
(
$self
,
$proto
);
$self
->_read_smbios();
return
$self
;
}
sub
get_tree {
my
(
$self
,
$section
) =
@_
;
if
(
$section
) {
return
$self
->{
"__dmi"
}->{
$section
};
}
return
$self
->{
"__dmi"
};
}
sub
get_base_board {
my
(
$self
) =
@_
;
return
Rex::Inventory::SMBios::BaseBoard->new(
dmi
=>
$self
);
}
sub
get_bios {
my
(
$self
) =
@_
;
return
Rex::Inventory::SMBios::Bios->new(
dmi
=>
$self
);
}
sub
get_system_information {
my
(
$self
) =
@_
;
return
Rex::Inventory::SMBios::SystemInformation->new(
dmi
=>
$self
);
}
sub
get_cpus {
my
(
$self
) =
@_
;
my
@cpus
= ();
my
$tree
=
$self
->get_tree(
"processor"
);
my
$idx
= 0;
for
my
$cpu
( @{
$tree
} ) {
if
(
$cpu
->{
"Socket Status"
} =~ m/Populated/ ) {
push
(
@cpus
,
Rex::Inventory::SMBios::CPU->new(
dmi
=>
$self
,
index
=>
$idx
) );
}
++
$idx
;
}
return
@cpus
;
}
sub
get_memory_modules {
my
(
$self
) =
@_
;
my
@mems
= ();
my
$tree
=
$self
->get_tree(
"memory device"
);
my
$idx
= 0;
for
my
$mem
( @{
$tree
} ) {
if
(
$mem
->{
"Size"
} =~ m/\d+/ ) {
push
(
@mems
,
Rex::Inventory::SMBios::Memory->new(
dmi
=>
$self
,
index
=>
$idx
) );
}
++
$idx
;
}
return
@mems
;
}
sub
get_memory_arrays {
my
(
$self
) =
@_
;
my
@mems
= ();
my
$tree
=
$self
->get_tree(
"physical memory array"
);
my
$idx
= 0;
for
my
$mema
( @{
$tree
} ) {
push
(
@mems
,
Rex::Inventory::SMBios::MemoryArray->new(
dmi
=>
$self
,
index
=>
$idx
) );
++
$idx
;
}
return
@mems
;
}
sub
_read_smbios {
my
(
$self
) =
@_
;
my
@data
= i_run(
"smbios"
,
fail_ok
=> 1 );
my
(
$current_section
,
%section
,
$key
,
$val
,
%cur_data
);
for
my
$line
(
@data
) {
next
if
(
$line
=~ /^$/ );
next
if
(
$line
=~ /^\s*$/ );
next
if
(
$line
=~ /^ID/ );
if
(
$line
=~ m/^\d/ ) {
push
( @{
$section
{
$current_section
} }, {
%cur_data
} )
if
(
%cur_data
);
(
$current_section
) = (
$line
=~ m/\(([^\)]+)\)/ );
if
( !
exists
$section
{
$current_section
} ) {
$section
{
$current_section
} = [];
}
%cur_data
= ();
next
;
}
if
(
$line
=~ /^\s\s[a-z]/i ) {
$line
=~ s/^\s*//;
(
$key
,
$val
) =
split
( /: /,
$line
);
$cur_data
{
$key
} =
$val
;
}
elsif
(
$line
=~ /^\t[a-z]/i ) {
if
( !
ref
(
$cur_data
{
$key
} ) ) {
$cur_data
{
$key
} = [];
}
$line
=~ s/^\s*//;
push
( @{
$cur_data
{
$key
} },
$line
);
}
}
push
( @{
$section
{
$current_section
} }, {
%cur_data
} );
$self
->{
"__dmi"
} = \
%section
;
}
1;