/usr/local/CPAN/Ocsinventory-Agent/Ocsinventory/Agent/Backend/OS/Generic/Dmidecode/Bios.pm
package Ocsinventory::Agent::Backend::OS::Generic::Dmidecode::Bios;
use strict;
sub run {
my $params = shift;
my $inventory = $params->{inventory};
# Parsing dmidecode output
# Using "type 0" section
my( $SystemSerial , $SystemModel, $SystemManufacturer, $BiosManufacturer,
$BiosVersion, $BiosDate, $YEAR, $MONTH, $DAY, $HOUR, $MIN, $SEC, $AssetTag);
my @dmidecode = `dmidecode`;
s/^\s+// for (@dmidecode);
# get the BIOS values
my $flag=0;
for(@dmidecode){
$flag=1 if /dmi type 0,/i;
last if($flag && (/dmi type (\d+),/i) && ($1!=0));
if((/^vendor:\s*(.+?)(\s*)$/i) && ($flag)) { $BiosManufacturer = $1 }
if((/^release\ date:\s*(.+?)(\s*)$/i) && ($flag)) { $BiosDate = $1 }
if((/^version:\s*(.+?)(\s*)$/i) && ($flag)) { $BiosVersion = $1 }
}
# Try to query the machine itself
$flag=0;
for(@dmidecode){
if(/dmi type 1,/i){$flag=1;}
last if($flag && (/dmi type (\d+),/i) && ($1!=1));
if((/^serial number:\s*(.+?)(\s*)$/i) && ($flag)) { $SystemSerial = $1 }
if((/^(product name|product):\s*(.+?)(\s*)$/i) && ($flag)) { $SystemModel = $2 }
if((/^(manufacturer|vendor):\s*(.+?)(\s*)$/i) && ($flag)) { $SystemManufacturer = $2 }
}
# Failback on the motherbord
$flag=0;
for(@dmidecode){
if(/dmi type 2,/i){$flag=1;}
last if($flag && (/dmi type (\d+),/i) && ($1!=2));
if((/^serial number:\s*(.+?)(\s*)/i) && ($flag) && (!$SystemSerial)) { $SystemSerial = $1 }
if((/^product name:\s*(.+?)(\s*)/i) && ($flag) && (!$SystemModel)) { $SystemModel = $1 }
if((/^manufacturer:\s*(.+?)(\s*)/i) && ($flag) && (!$SystemManufacturer)) { $SystemManufacturer = $1 }
}
$flag=0;
for(@dmidecode){
if ($flag) {
if (/^Asset Tag:\s*(.+\S)/i) {
$AssetTag = $1;
$AssetTag = '' if $AssetTag eq 'Not Specified';
last;
} elsif (/dmi type \d+,/i) { # End of the section
last;
}
}
if (/dmi type 3,/i) {
$flag=1;
}
}
# Some bioses don't provide a serial number so I check for CPU ID (e.g: server from dedibox.fr)
if (!$SystemSerial ||$SystemSerial =~ /^0+$/) {
$flag=0;
for(@dmidecode){
if(/dmi type 4,/i){$flag=1;}
elsif(/^processor information:/i){$flag=2;}
elsif((/^ID:\s*(.*)/i) && ($flag)) {
$SystemSerial = $1;
$SystemSerial =~ s/\ /-/g;
last
}
}
}
# Writing data
$inventory->setBios ({
ASSETTAG => $AssetTag,
SMANUFACTURER => $SystemManufacturer,
SMODEL => $SystemModel,
SSN => $SystemSerial,
BMANUFACTURER => $BiosManufacturer,
BVERSION => $BiosVersion,
BDATE => $BiosDate,
});
}
1;