gen_ipmi_sensor.pl: construct sensor metadata

Generates a file to depict which dbus properties are implemented for a
sensor, and how IPMI sensor data map to those dbus properties.
This commit defines a YAML file which helps figure out the supported
dbus interface/properties for a sensor and how to get the sensor value.

Change-Id: I62ddd3b8546cd036663708c5aa6041523e399e4f
Signed-off-by: Ratan Gupta <ratagupt@in.ibm.com>
diff --git a/gen_ipmi_sensor.pl b/gen_ipmi_sensor.pl
index fd91e6b..742da9b 100755
--- a/gen_ipmi_sensor.pl
+++ b/gen_ipmi_sensor.pl
@@ -11,17 +11,19 @@
 # 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 ($metaDataFile eq ""))
+if (($serverwizFile eq "") or ($outputFile eq "") or ($metaDataFile eq ""))
 {
     printUsage();
 }
@@ -31,7 +33,10 @@
 
 #open the mrw xml and the metaData file for the sensor.
 #Fetch the sensorid,sensortype,class,object path from the mrw.
+#Get the metadata for that sensor from the metadata file.
+#Merge the data into the outputfile
 
+open(my $fh, '>', $outputFile) or die "Could not open file '$outputFile' $!";
 my $sensorTypeConfig = LoadFile($metaDataFile);
 
 my @interestedTypes = keys %{$sensorTypeConfig};
@@ -61,12 +66,13 @@
         $path = $targetObj->getAttribute($target, "INSTANCE_PATH");
 
         #not interested in this sensortype
-        next if (not exists $types{$sensorType} );
+        next if (not exists $types{$sensorType});
 
         #if there is ipmi sensor without sensorid or sensorReadingType or
         #Instance path then die
 
         if ($sensorID eq '' or $sensorReadingType eq '' or $path eq '') {
+            close $fh;
             die("sensor without info for target=$target");
         }
 
@@ -77,20 +83,57 @@
 
         #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");
         }
 
+        print $fh $sensorID.":\n";
+
         printDebug("$sensorID : $sensorType : $sensorReadingType :$obmcPath \n");
 
+        writeToFile($sensorType,$sensorReadingType,$obmcPath,$sensorTypeConfig,$fh);
+
     }
 
 }
+close $fh;
+
+
+#Get the metadata for the incoming sensortype from the loaded config file.
+#Write the sensor data into the output file
+
+sub writeToFile
+{
+    my ($sensorType,$sensorReadingType,$path,$sensorTypeConfig,$fh) = @_;
+    print $fh "  sensorType: ".$sensorType."\n";
+    print $fh "  path: ".$path."\n";
+    print $fh "  sensorReadingType: ".$sensorReadingType."\n";
+    print $fh "  interfaces:"."\n";
+
+    my $interfaces = $sensorTypeConfig->{$sensorType};
+    #Walk over all the interfces as it needs to be written
+    while (my ($interface,$properties) = each %{$interfaces}) {
+        print $fh "    ".$interface.":\n";
+        #walk over all the properties as it needs to be written
+        while (my ($dbusProperty,$dbusPropertyValue) = each %{$properties}) {
+                    #will write property named "Property" first then
+                    #other properties.
+            print $fh "      ".$dbusProperty.":\n";
+            while (my ( $offset,$values) = each %{$dbusPropertyValue}) {
+                print $fh "        $offset:\n";
+                while (my ( $key,$value) = each %{$values})  {
+                    print $fh "          $key: ". $value."\n";
+                }
+            }
+        }
+    }
+}
 
 # Usage
 sub printUsage
 {
     print "
-    $0 -i [MRW filename] -m [SensorMetaData filename] [OPTIONS]
+    $0 -i [MRW filename] -m [SensorMetaData filename] -o [Output filename] [OPTIONS]
 Options:
     -d = debug mode
         \n";
@@ -103,4 +146,3 @@
     my $str = shift;
     print "DEBUG: ", $str, "\n" if $debug;
 }
-