summaryrefslogtreecommitdiffstats
path: root/gen_ipmi_sel.pl
blob: dd1fcbda1c66ee84c9931692a7927835bde8319a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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;
}
OpenPOWER on IntegriCloud