blob: bb70a7fd1ae076907faea18e48788c66149f74a2 [file] [log] [blame]
Tom Joseph58825912017-05-05 11:53:54 +05301#! /usr/bin/perl
2use strict;
3use warnings;
4
5use mrw::Targets;
6use mrw::Inventory;
7use mrw::Util;
8use Getopt::Long; # For parsing command line arguments
9use YAML::Tiny qw(LoadFile);
10
11# Globals
12my $serverwizFile = "";
13my $debug = 0;
14my $outputFile = "";
15my $metaDataFile = "";
Santosh Puranik51041fc2019-10-08 09:45:15 -050016my $skipBrokenMrw = 0;
Tom Joseph58825912017-05-05 11:53:54 +053017
18# Command line argument parsing
19GetOptions(
20"i=s" => \$serverwizFile, # string
21"m=s" => \$metaDataFile, # string
22"o=s" => \$outputFile, # string
Santosh Puranik51041fc2019-10-08 09:45:15 -050023"skip-broken-mrw" => \$skipBrokenMrw,
Tom Joseph58825912017-05-05 11:53:54 +053024"d" => \$debug,
25)
26or printUsage();
27
28if (($serverwizFile eq "") or ($outputFile eq "") or ($metaDataFile eq ""))
29{
30 printUsage();
31}
32
33my $targetObj = Targets->new;
34$targetObj->loadXML($serverwizFile);
35
36# Open the MRW xml and the Metadata file for the sensor.
37# Get the IPMI sensor information based on the Entity ID and Sensor Type.
38# Fetch the Sensor ID, Event/Reading Type and Object Path from MRW.
39# Get the Sensor Type and Offset from the metadata file.
40# Merge and generate an output YAML with inventory object path as the key.
41
42open(my $fh, '>', $outputFile) or die "Could not open file '$outputFile' $!";
43my $metaDataConfig = LoadFile($metaDataFile);
44
45my @interestedTypes = keys %{$metaDataConfig};
46my %types;
47
48@types{@interestedTypes} = ();
49
50my @inventory = Inventory::getInventory($targetObj);
51#Process all the targets in the XML
52foreach my $target (sort keys %{$targetObj->getAllTargets()})
53{
54 my $sensorID = '';
55 my $sensorType = '';
56 my $eventReadingType = '';
57 my $path = '';
58 my $obmcPath = '';
59 my $entityID = '';
60 my $base = "/xyz/openbmc_project/inventory";
61
62 if ($targetObj->getTargetType($target) eq "unit-ipmi-sensor") {
63
Brad Bishop5102e572019-06-28 10:45:23 -040064 $sensorID = getNumeric($targetObj, $target, "IPMI_SENSOR_ID");
65 $sensorType = getNumeric($targetObj, $target, "IPMI_SENSOR_TYPE");
66 $eventReadingType = getNumeric(
67 $targetObj, $target, "IPMI_SENSOR_READING_TYPE");
Tom Joseph58825912017-05-05 11:53:54 +053068 $path = $targetObj->getAttribute($target, "INSTANCE_PATH");
Brad Bishop5102e572019-06-28 10:45:23 -040069 $entityID = getNumeric($targetObj, $target, "IPMI_ENTITY_ID");
Tom Joseph58825912017-05-05 11:53:54 +053070
71 # Look only for the interested Entity ID & Sensor Type
72 next if (not exists $types{$entityID});
73 next if ($sensorType ne $metaDataConfig->{$entityID}->{SensorType});
74
75 #if there is ipmi sensor without sensorid or sensorReadingType or
76 #Instance path then die
77
78 if ($sensorID eq '' or $eventReadingType eq '' or $path eq '') {
Santosh Puranik51041fc2019-10-08 09:45:15 -050079 next if $skipBrokenMrw;
Tom Joseph58825912017-05-05 11:53:54 +053080 close $fh;
81 die("sensor without info for target=$target");
82 }
83
84 # Removing the string "instance:" from path
85 $path =~ s/^instance:/\//;
86 $obmcPath = Util::getObmcName(\@inventory, $path);
87
88 # If unable to get the obmc path then die
89 if (not defined $obmcPath) {
90 close $fh;
91 die("Unable to get the obmc path for path=$path");
92 }
93
94 $base .= $obmcPath;
95
96 print $fh $base.":"."\n";
97 print $fh " sensorID: ".$sensorID."\n";
98 print $fh " sensorType: ".$sensorType."\n";
99 print $fh " eventReadingType: ".$eventReadingType."\n";
100 print $fh " offset: ".$metaDataConfig->{$entityID}->{Offset}."\n";
101
102 printDebug("$sensorID : $sensorType : $eventReadingType : $entityID : $metaDataConfig->{$entityID}->{Offset}")
103 }
104}
105close $fh;
106
Brad Bishop5102e572019-06-28 10:45:23 -0400107sub getNumeric
108{
109 my $obj = shift;
110 my $target = shift;
111 my $attr = shift;
112 my $val = $obj->getAttribute($target, $attr);
113 $val = oct($val) if $val =~ /^0/;
114 return $val;
115}
116
Tom Joseph58825912017-05-05 11:53:54 +0530117# Usage
118sub printUsage
119{
120 print "
121 $0 -i [MRW filename] -m [SensorMetaData filename] -o [Output filename] [OPTIONS]
122Options:
123 -d = debug mode
Santosh Puranik51041fc2019-10-08 09:45:15 -0500124 --skip-broken-mrw = Skip broken MRW targets
Tom Joseph58825912017-05-05 11:53:54 +0530125 \n";
126 exit(1);
127}
128
129# Helper function to put debug statements.
130sub printDebug
131{
132 my $str = shift;
133 print "DEBUG: ", $str, "\n" if $debug;
134}