Fetch inventory path and sensor information from MRW.
Generate output yaml containing inventory to sensor information
mapping by processing MRW and the config file. Sample entry in
the output yaml.
/xyz/openbmc_project/inventory/system/chassis/motherboard/cpu1/core16:
sensorID: 0x8c
sensorType: 0x07
eventReadingType: 0x6F
offset: 0x08
Change-Id: I34a42b8d81c08fc14849b7d29162433319474cf8
Signed-off-by: Tom Joseph <tomjoseph@in.ibm.com>
diff --git a/gen_ipmi_sel.pl b/gen_ipmi_sel.pl
new file mode 100755
index 0000000..dd1fcbd
--- /dev/null
+++ b/gen_ipmi_sel.pl
@@ -0,0 +1,120 @@
+#! /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 = "";
+
+# Command line argument parsing
+GetOptions(
+"i=s" => \$serverwizFile, # string
+"m=s" => \$metaDataFile, # string
+"o=s" => \$outputFile, # string
+"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 = $targetObj->getAttribute($target, "IPMI_SENSOR_ID");
+ $sensorType = $targetObj->getAttribute($target, "IPMI_SENSOR_TYPE");
+ $eventReadingType = $targetObj->getAttribute($target,
+ "IPMI_SENSOR_READING_TYPE");
+ $path = $targetObj->getAttribute($target, "INSTANCE_PATH");
+ $entityID = $targetObj->getAttribute($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 '') {
+ 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;
+
+# Usage
+sub printUsage
+{
+ print "
+ $0 -i [MRW filename] -m [SensorMetaData filename] -o [Output filename] [OPTIONS]
+Options:
+ -d = debug mode
+ \n";
+ exit(1);
+}
+
+# Helper function to put debug statements.
+sub printDebug
+{
+ my $str = shift;
+ print "DEBUG: ", $str, "\n" if $debug;
+}