1#!/usr/bin/env perl
2
3use strict;
4use warnings;
5
6
7use mrw::Targets;
8use mrw::Inventory;
9use mrw::Util;
10use Getopt::Long;
11use YAML::Tiny qw(LoadFile);
12
13
14my $mrwFile = "";
15my $outFile = "";
16my $configFile = "";
17my $skipBrokenMrw = 0;
18
19
20GetOptions(
21"m=s" => \$mrwFile,
22"c=s" => \$configFile,
23"o=s" => \$outFile,
24"skip-broken-mrw" => \$skipBrokenMrw
25)
26or printUsage();
27
28
29if (($mrwFile eq "") or ($configFile eq "") or ($outFile eq ""))
30{
31    printUsage();
32}
33
34
35# Load system MRW
36my $targets = Targets->new;
37$targets->loadXML($mrwFile);
38my @inventory = Inventory::getInventory($targets);
39
40
41# Parse config YAML
42my $targetItems = LoadFile($configFile);
43
44
45# Targets we're interested in, from the config YAML
46my @targetNames = keys %{$targetItems};
47my %targetHash;
48@targetHash{@targetNames} = ();
49
50
51# Target Type : Target inventory path
52my %defaultPaths = (
53    "ETHERNET",
54     Util::getObmcName(
55         \@inventory,
56         Util::getBMCTarget($targets))."/ethernet"
57);
58
59
60open(my $fh, '>', $outFile) or die "Could not open file '$outFile' $!";
61# Retrieve OBMC path of targets we're interested in
62for my $item (@inventory) {
63    my $targetType = "";
64    my $path = "";
65
66    if (!$targets->isBadAttribute($item->{TARGET}, "TYPE")) {
67        $targetType = $targets->getAttribute($item->{TARGET}, "TYPE");
68    }
69    next if (not exists $targetItems->{$targetType});
70
71    writeOutput($targetType,
72                $item,
73                $targetItems);
74    delete($targetHash{$targetType});
75}
76writeRemaining($targetItems);
77close $fh;
78
79
80sub writeRemaining
81{
82    my ($yamlDict) = @_;
83    for my $type (keys %targetHash)
84    {
85        if($skipBrokenMrw and !exists $defaultPaths{$type})
86        {
87            next;
88        }
89        print $fh $defaultPaths{$type}.":";
90        print $fh "\n";
91        while (my ($interface,$propertyMap) = each %{$yamlDict->{$type}})
92        {
93            print $fh "    ".$interface.":";
94            print $fh "\n";
95            while (my ($property,$value) = each %{$propertyMap})
96            {
97                $value = "'".$value."'";
98                print $fh "        ".$property.": ".$value;
99                print $fh "\n";
100            }
101        }
102    }
103}
104
105
106sub writeOutput
107{
108    my ($type, $item, $yamlDict) = @_;
109    print $fh $item->{OBMC_NAME}.":";
110    print $fh "\n";
111    while (my ($interface,$propertyMap) = each %{$yamlDict->{$type}})
112    {
113        print $fh "    ".$interface.":";
114        print $fh "\n";
115        while (my ($property,$value) = each %{$propertyMap})
116        {
117            $value = getValue($item, $property, $value);
118            print $fh "        ".$property.": ".$value;
119            print $fh "\n";
120        }
121    }
122}
123
124
125sub getValue
126{
127    my ($item, $property, $value) = @_;
128    $value = "'".$value."'";
129
130    if ($property eq "FieldReplaceable")
131    {
132        $value = "'false'";
133        if (!$targets->isBadAttribute($item->{TARGET}, "RU_TYPE"))
134        {
135            my $ruType = $targets->getAttribute($item->{TARGET}, "RU_TYPE");
136            if (($ruType eq "FRU") || ($ruType eq "CRU"))
137            {
138                $value = "'true'";
139            }
140        }
141    }
142
143    return $value;
144}
145
146
147sub printUsage
148{
149    print "
150    $0 -m [MRW file] -c [Config yaml] -o [Output filename] [OPTIONS]
151Options:
152    --skip-broken-mrw = Skip broken MRW targets
153    \n";
154    exit(1);
155}
156