blob: bb70a7fd1ae076907faea18e48788c66149f74a2 [file] [log] [blame]
#! /usr/bin/perl
use strict;
use warnings;
use mrw::Targets;
use mrw::Inventory;
use mrw::Util;
use Getopt::Long; # For parsing command line arguments
use YAML::Tiny qw(LoadFile);
# Globals
my $serverwizFile = "";
my $debug = 0;
my $outputFile = "";
my $metaDataFile = "";
my $skipBrokenMrw = 0;
# Command line argument parsing
GetOptions(
"i=s" => \$serverwizFile, # string
"m=s" => \$metaDataFile, # string
"o=s" => \$outputFile, # string
"skip-broken-mrw" => \$skipBrokenMrw,
"d" => \$debug,
)
or printUsage();
if (($serverwizFile eq "") or ($outputFile eq "") or ($metaDataFile eq ""))
{
printUsage();
}
my $targetObj = Targets->new;
$targetObj->loadXML($serverwizFile);
# Open the MRW xml and the Metadata file for the sensor.
# Get the IPMI sensor information based on the Entity ID and Sensor Type.
# Fetch the Sensor ID, Event/Reading Type and Object Path from MRW.
# Get the Sensor Type and Offset from the metadata file.
# Merge and generate an output YAML with inventory object path as the key.
open(my $fh, '>', $outputFile) or die "Could not open file '$outputFile' $!";
my $metaDataConfig = LoadFile($metaDataFile);
my @interestedTypes = keys %{$metaDataConfig};
my %types;
@types{@interestedTypes} = ();
my @inventory = Inventory::getInventory($targetObj);
#Process all the targets in the XML
foreach my $target (sort keys %{$targetObj->getAllTargets()})
{
my $sensorID = '';
my $sensorType = '';
my $eventReadingType = '';
my $path = '';
my $obmcPath = '';
my $entityID = '';
my $base = "/xyz/openbmc_project/inventory";
if ($targetObj->getTargetType($target) eq "unit-ipmi-sensor") {
$sensorID = getNumeric($targetObj, $target, "IPMI_SENSOR_ID");
$sensorType = getNumeric($targetObj, $target, "IPMI_SENSOR_TYPE");
$eventReadingType = getNumeric(
$targetObj, $target, "IPMI_SENSOR_READING_TYPE");
$path = $targetObj->getAttribute($target, "INSTANCE_PATH");
$entityID = getNumeric($targetObj, $target, "IPMI_ENTITY_ID");
# Look only for the interested Entity ID & Sensor Type
next if (not exists $types{$entityID});
next if ($sensorType ne $metaDataConfig->{$entityID}->{SensorType});
#if there is ipmi sensor without sensorid or sensorReadingType or
#Instance path then die
if ($sensorID eq '' or $eventReadingType eq '' or $path eq '') {
next if $skipBrokenMrw;
close $fh;
die("sensor without info for target=$target");
}
# Removing the string "instance:" from path
$path =~ s/^instance:/\//;
$obmcPath = Util::getObmcName(\@inventory, $path);
# If unable to get the obmc path then die
if (not defined $obmcPath) {
close $fh;
die("Unable to get the obmc path for path=$path");
}
$base .= $obmcPath;
print $fh $base.":"."\n";
print $fh " sensorID: ".$sensorID."\n";
print $fh " sensorType: ".$sensorType."\n";
print $fh " eventReadingType: ".$eventReadingType."\n";
print $fh " offset: ".$metaDataConfig->{$entityID}->{Offset}."\n";
printDebug("$sensorID : $sensorType : $eventReadingType : $entityID : $metaDataConfig->{$entityID}->{Offset}")
}
}
close $fh;
sub getNumeric
{
my $obj = shift;
my $target = shift;
my $attr = shift;
my $val = $obj->getAttribute($target, $attr);
$val = oct($val) if $val =~ /^0/;
return $val;
}
# Usage
sub printUsage
{
print "
$0 -i [MRW filename] -m [SensorMetaData filename] -o [Output filename] [OPTIONS]
Options:
-d = debug mode
--skip-broken-mrw = Skip broken MRW targets
\n";
exit(1);
}
# Helper function to put debug statements.
sub printDebug
{
my $str = shift;
print "DEBUG: ", $str, "\n" if $debug;
}