our
$VERSION
=
'1.16.0'
;
sub
new {
my
$that
=
shift
;
my
$proto
=
ref
(
$that
) ||
$that
;
my
$self
= {
@_
};
bless
(
$self
,
$proto
);
$self
->_read_dmidecode();
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::DMIDecode::BaseBoard->new(
dmi
=>
$self
);
}
sub
get_bios {
my
(
$self
) =
@_
;
return
Rex::Inventory::DMIDecode::Bios->new(
dmi
=>
$self
);
}
sub
get_system_information {
my
(
$self
) =
@_
;
return
Rex::Inventory::DMIDecode::SystemInformation->new(
dmi
=>
$self
);
}
sub
get_cpus {
my
(
$self
) =
@_
;
my
@cpus
= ();
my
$tree
=
$self
->get_tree(
"Processor Information"
);
my
$idx
= 0;
for
my
$cpu
( @{
$tree
} ) {
if
(
$cpu
->{
"Status"
} =~ m/Populated/ ) {
push
(
@cpus
,
Rex::Inventory::DMIDecode::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::DMIDecode::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::DMIDecode::MemoryArray->new(
dmi
=>
$self
,
index
=>
$idx
)
);
++
$idx
;
}
return
@mems
;
}
sub
_read_dmidecode {
my
(
$self
) =
@_
;
my
@lines
;
if
(
$self
->{lines} ) {
@lines
= @{
$self
->{lines} };
}
else
{
unless
( can_run(
"dmidecode"
) ) {
Rex::Logger::debug(
"Please install dmidecode on the target system."
);
return
;
}
eval
{
@lines
= i_run
"dmidecode"
; };
if
($@) {
Rex::Logger::debug(
"Error running dmidecode"
);
return
;
}
}
chomp
@lines
;
my
%section
= ();
my
$section
=
""
;
my
$new_section
= 0;
my
$sub_section
=
""
;
for
my
$l
(
@lines
) {
next
if
$l
=~ m/^Handle/;
next
if
$l
=~ m/^
next
if
$l
=~ m/^SMBIOS/;
next
if
$l
=~ m/^$/;
last
if
$l
=~ m/^End Of Table$/;
$l
=~ s/ /\t/g;
unless
(
substr
(
$l
, 0, 1 ) eq
"\t"
) {
$section
=
$l
;
$new_section
= 1;
next
;
}
my
$line
=
$l
;
$line
=~ s/^\t+//g;
$line
=~ s/\s+$//g;
next
if
$l
=~ m/^$/;
if
(
$l
=~ m/^\t[a-zA-Z0-9]/ ) {
if
(
exists
$section
{
$section
} && !
ref
(
$section
{
$section
} ) ) {
my
$content
=
$section
{
$section
};
$section
{
$section
} = [];
my
@arr
= ();
my
(
$key
,
$val
) =
split
( /: /,
$line
, 2 );
$key
=~ s/:$//;
$sub_section
=
$key
;
push
( @{
$section
{
$section
} }, {
$key
=>
$val
} );
$new_section
= 0;
next
;
}
elsif
(
exists
$section
{
$section
} &&
ref
(
$section
{
$section
} ) ) {
if
(
$new_section
) {
push
( @{
$section
{
$section
} }, {} );
$new_section
= 0;
}
my
(
$key
,
$val
) =
split
( /: /,
$line
, 2 );
$key
=~ s/:$//;
$sub_section
=
$key
;
my
$href
=
$section
{
$section
}->[-1];
$href
->{
$key
} =
$val
;
next
;
}
my
(
$key
,
$val
) =
split
( /: /,
$line
, 2 );
if
( !
$val
) {
$key
=~ s/:$//; }
$sub_section
=
$key
;
$section
{
$section
} = [ {
$key
=>
$val
} ];
$new_section
= 0;
}
elsif
(
$l
=~ m/^\t\t[a-zA-Z0-9]/ ) {
my
$href
=
$section
{
$section
}->[-1];
if
( !
ref
(
$href
->{
$sub_section
} ) ) {
$href
->{
$sub_section
} = [];
}
push
( @{
$href
->{
$sub_section
} },
$line
);
}
}
$self
->{
"__dmi"
} = \
%section
;
}
1;