xref: /openbmc/phosphor-mrw-tools/gen_ipmi_fru.pl (revision 4954d029d2d7f892976fb19d3fa9c502d64e1d1e)
1b4edc27aSAndrew Geissler#!/usr/bin/env perl
265ca8e19SAndrew Geissler
3fa70dc9dSRatan Guptause strict;
4fa70dc9dSRatan Guptause warnings;
5fa70dc9dSRatan Gupta
6fa70dc9dSRatan Guptause mrw::Targets;
7fa70dc9dSRatan Guptause mrw::Inventory;
86225e93dSDeepak Kodihalliuse mrw::Util;
9fa70dc9dSRatan Guptause Getopt::Long; # For parsing command line arguments
10550075b1SBrad Bishopuse YAML::Tiny qw(LoadFile);
11fa70dc9dSRatan Gupta# Globals
12fa70dc9dSRatan Guptamy $serverwizFile  = "";
13fa70dc9dSRatan Guptamy $debug           = 0;
14a149ba10SRatan Guptamy $outputFile     = "";
15a149ba10SRatan Guptamy $metaDataFile   = "";
1651041fc8SSantosh Puranikmy $skipBrokenMrw  = 0;
17fa70dc9dSRatan Gupta
18fa70dc9dSRatan Gupta# Command line argument parsing
19fa70dc9dSRatan GuptaGetOptions(
20fa70dc9dSRatan Gupta"i=s" => \$serverwizFile,    # string
21a149ba10SRatan Gupta"m=s" => \$metaDataFile,     # string
22a149ba10SRatan Gupta"o=s" => \$outputFile,       # string
2351041fc8SSantosh Puranik"skip-broken-mrw" => \$skipBrokenMrw,
24fa70dc9dSRatan Gupta"d"   => \$debug,
25fa70dc9dSRatan Gupta)
26fa70dc9dSRatan Guptaor printUsage();
27fa70dc9dSRatan Gupta
28a149ba10SRatan Guptaif (($serverwizFile eq "") or ($outputFile eq "") or ($metaDataFile eq ""))
29fa70dc9dSRatan Gupta{
30fa70dc9dSRatan Gupta    printUsage();
31fa70dc9dSRatan Gupta}
32fa70dc9dSRatan Gupta
33fa70dc9dSRatan Guptamy $targetObj = Targets->new;
34fa70dc9dSRatan Gupta$targetObj->loadXML($serverwizFile);
35fa70dc9dSRatan Gupta
36a149ba10SRatan Gupta#open the mrw xml and the metaData file for the fru.
37a149ba10SRatan Gupta#Fetch the FRU id,type,object path from the mrw.
38a149ba10SRatan Gupta#Get the metadata for that fru from the metadata file.
39a149ba10SRatan Gupta#Merge the data into the outputfile
40a149ba10SRatan Gupta
41a149ba10SRatan Guptaopen(my $fh, '>', $outputFile) or die "Could not open file '$outputFile' $!";
42a149ba10SRatan Guptamy $fruTypeConfig = LoadFile($metaDataFile);
43a149ba10SRatan Gupta
44a149ba10SRatan Guptamy @interestedTypes = keys %{$fruTypeConfig};
45a149ba10SRatan Guptamy %types;
46a149ba10SRatan Gupta@types{@interestedTypes} = ();
47fa70dc9dSRatan Gupta
488b34b33fSRatan Guptamy %entityInfoDict;
498b34b33fSRatan Gupta
50d92101d5SRatan Guptamy @allAssoTypes = getAllAssociatedTypes($fruTypeConfig);
51d92101d5SRatan Guptamy %allAssoTypesHash;
52d92101d5SRatan Gupta@allAssoTypesHash{@allAssoTypes} = ();
53d92101d5SRatan Gupta
54fa70dc9dSRatan Guptamy @inventory = Inventory::getInventory($targetObj);
55fa70dc9dSRatan Guptafor my $item (@inventory) {
56fa70dc9dSRatan Gupta    my $isFru = 0, my $fruID = 0, my $fruType = "";
578b34b33fSRatan Gupta    my $entityInstance = 1, my $entityID = 0;
588b34b33fSRatan Gupta
59a149ba10SRatan Gupta    #Fetch the FRUID.
60fa70dc9dSRatan Gupta    if (!$targetObj->isBadAttribute($item->{TARGET}, "FRU_ID")) {
61fa70dc9dSRatan Gupta        $fruID = $targetObj->getAttribute($item->{TARGET}, "FRU_ID");
62fa70dc9dSRatan Gupta        $isFru = 1;
63fa70dc9dSRatan Gupta    }
64a149ba10SRatan Gupta    #Fetch the FRU Type.
65fa70dc9dSRatan Gupta    if (!$targetObj->isBadAttribute($item->{TARGET}, "TYPE")) {
66fa70dc9dSRatan Gupta        $fruType = $targetObj->getAttribute($item->{TARGET}, "TYPE");
67fa70dc9dSRatan Gupta    }
68fa70dc9dSRatan Gupta
69d92101d5SRatan Gupta    #Skip if any one is true
70d92101d5SRatan Gupta    #1) If not fru
71d92101d5SRatan Gupta    #2) if the fru type is not there in the config file.
72d92101d5SRatan Gupta    #3) if the fru type is in associated types.
7351041fc8SSantosh Puranik    #4) if FRU_ID is not defined for the target and we are asked to ignore such
7451041fc8SSantosh Puranik    #   targets.
7551041fc8SSantosh Puranik
7651041fc8SSantosh Puranik    next if ($skipBrokenMrw and ($fruID eq ""));
77d92101d5SRatan Gupta
78d92101d5SRatan Gupta    next if (not $isFru or not exists $types{$fruType} or exists $allAssoTypesHash{$fruType});
79fa70dc9dSRatan Gupta
80fa70dc9dSRatan Gupta    printDebug ("FRUID => $fruID, FRUType => $fruType, ObjectPath => $item->{OBMC_NAME}");
81fa70dc9dSRatan Gupta
82a149ba10SRatan Gupta    print $fh $fruID.":";
83a149ba10SRatan Gupta    print $fh "\n";
84a149ba10SRatan Gupta
858b34b33fSRatan Gupta    $entityID = $fruTypeConfig->{$fruType}->{'EntityID'};
868b34b33fSRatan Gupta
878b34b33fSRatan Gupta    if (exists $entityInfoDict{$entityID}) {
888b34b33fSRatan Gupta        $entityInstance = $entityInfoDict{$entityID} + 1;
898b34b33fSRatan Gupta    }
908b34b33fSRatan Gupta
918b34b33fSRatan Gupta    printDebug("entityID => $entityID , entityInstance => $entityInstance");
928b34b33fSRatan Gupta
938b34b33fSRatan Gupta    $entityInfoDict{$entityID} = $entityInstance;
948b34b33fSRatan Gupta
95a149ba10SRatan Gupta    writeToFile($fruType,$item->{OBMC_NAME},$fruTypeConfig,$fh);
96a149ba10SRatan Gupta
97d92101d5SRatan Gupta    #if the key(AssociatedTypes) exists and  it is defined
98d92101d5SRatan Gupta    #then make the association.
9926cc055bSRatan Gupta
100d92101d5SRatan Gupta    if (!defined $fruTypeConfig->{$fruType}->{'AssociatedTypes'}) {
10126cc055bSRatan Gupta        next;
10226cc055bSRatan Gupta    }
10326cc055bSRatan Gupta
104d92101d5SRatan Gupta    my $assoTypes = $fruTypeConfig->{$fruType}->{'AssociatedTypes'};
105d92101d5SRatan Gupta    for my $type (@$assoTypes) {
106d92101d5SRatan Gupta        my @devices = Util::getDevicePath(\@inventory,$targetObj,$type);
107d92101d5SRatan Gupta        for my $device (@devices) {
108d92101d5SRatan Gupta            writeToFile($type,$device,$fruTypeConfig,$fh);
10926cc055bSRatan Gupta        }
11026cc055bSRatan Gupta
11126cc055bSRatan Gupta    }
11226cc055bSRatan Gupta
113fa70dc9dSRatan Gupta}
114a149ba10SRatan Guptaclose $fh;
115a149ba10SRatan Gupta
116fa70dc9dSRatan Gupta#------------------------------------END OF MAIN-----------------------
117fa70dc9dSRatan Gupta
118d92101d5SRatan Gupta# Get all the associated types
119d92101d5SRatan Guptasub getAllAssociatedTypes
120d92101d5SRatan Gupta{
121d92101d5SRatan Gupta   my $fruTypeConfig = $_[0];
122d92101d5SRatan Gupta   my @assoTypes;
123d92101d5SRatan Gupta   while (my($key, $value) = each %$fruTypeConfig) {
124d92101d5SRatan Gupta        #if the key exist and value is also there
125d92101d5SRatan Gupta        if (defined $value->{'AssociatedTypes'}) {
126d92101d5SRatan Gupta            my $assoTypes = $value->{'AssociatedTypes'};
127d92101d5SRatan Gupta            for my $type (@$assoTypes) {
128d92101d5SRatan Gupta                push(@assoTypes,$type);
129d92101d5SRatan Gupta            }
130d92101d5SRatan Gupta        }
131d92101d5SRatan Gupta   }
132d92101d5SRatan Gupta   return @assoTypes;
133d92101d5SRatan Gupta}
134d92101d5SRatan Gupta
135*4954d029SManojkiran Eda#Get the metadata for the incoming frutype from the loaded config file.
136a149ba10SRatan Gupta#Write the FRU data into the output file
137a149ba10SRatan Gupta
138a149ba10SRatan Guptasub writeToFile
139a149ba10SRatan Gupta{
140a149ba10SRatan Gupta    my $fruType = $_[0];#fru type
141a149ba10SRatan Gupta    my $instancePath = $_[1];#instance Path
142a149ba10SRatan Gupta    my $fruTypeConfig = $_[2];#loaded config file (frutypes)
143a149ba10SRatan Gupta    my $fh = $_[3];#file Handle
144a149ba10SRatan Gupta    #walk over all the fru types and match for the incoming type
1458b34b33fSRatan Gupta
146a149ba10SRatan Gupta    print $fh "  ".$instancePath.":";
147a149ba10SRatan Gupta    print $fh "\n";
1488b34b33fSRatan Gupta    print $fh "    "."entityID: ".$fruTypeConfig->{$fruType}->{'EntityID'};
1498b34b33fSRatan Gupta    print $fh "\n";
1508b34b33fSRatan Gupta    print $fh "    "."entityInstance: ";
1518b34b33fSRatan Gupta    print $fh $entityInfoDict{$fruTypeConfig->{$fruType}->{'EntityID'}};
1528b34b33fSRatan Gupta    print $fh "\n";
1538b34b33fSRatan Gupta    print $fh "    "."interfaces:";
1548b34b33fSRatan Gupta    print $fh "\n";
1558b34b33fSRatan Gupta
156d92101d5SRatan Gupta    my $interfaces = $fruTypeConfig->{$fruType}->{'Interfaces'};
1578b34b33fSRatan Gupta
158a149ba10SRatan Gupta    #Walk over all the interfaces as it needs to be written
159a149ba10SRatan Gupta    while ( my ($interface,$properties) = each %{$interfaces}) {
160a149ba10SRatan Gupta        print $fh "      ".$interface.":";
161a149ba10SRatan Gupta        print $fh "\n";
162a149ba10SRatan Gupta        #walk over all the properties as it needs to be written
163a149ba10SRatan Gupta        while ( my ($dbusProperty,$metadata) = each %{$properties}) {
164a149ba10SRatan Gupta                    #will write property named "Property" first then
165a149ba10SRatan Gupta                    #other properties.
166a149ba10SRatan Gupta            print $fh "        ".$dbusProperty.":";
167a149ba10SRatan Gupta            print $fh "\n";
168a149ba10SRatan Gupta            for my $key (sort keys %{$metadata}) {
169a149ba10SRatan Gupta                print $fh "          $key: "."$metadata->{$key}";
170a149ba10SRatan Gupta                print $fh "\n";
171a149ba10SRatan Gupta            }
172a149ba10SRatan Gupta        }
173a149ba10SRatan Gupta    }
174a149ba10SRatan Gupta}
175a149ba10SRatan Gupta
176fa70dc9dSRatan Gupta# Usage
177fa70dc9dSRatan Guptasub printUsage
178fa70dc9dSRatan Gupta{
179fa70dc9dSRatan Gupta    print "
180a149ba10SRatan Gupta    $0 -i [MRW filename] -m [MetaData filename] -o [Output filename] [OPTIONS]
181fa70dc9dSRatan GuptaOptions:
182fa70dc9dSRatan Gupta    -d = debug mode
18351041fc8SSantosh Puranik    --skip-broken-mrw = Skip broken MRW targets
184fa70dc9dSRatan Gupta        \n";
185fa70dc9dSRatan Gupta    exit(1);
186fa70dc9dSRatan Gupta}
187fa70dc9dSRatan Gupta
188fa70dc9dSRatan Gupta# Helper function to put debug statements.
189fa70dc9dSRatan Guptasub printDebug
190fa70dc9dSRatan Gupta{
191fa70dc9dSRatan Gupta    my $str = shift;
192fa70dc9dSRatan Gupta    print "DEBUG: ", $str, "\n" if $debug;
193fa70dc9dSRatan Gupta}
194d92101d5SRatan Gupta
195