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;
+}