blob: 970a074bc2cc6be23c96d12997a8063bd34bc9ff [file] [log] [blame]
#!/usr/bin/env perl
use strict;
use warnings;
use mrw::Targets;
use mrw::Inventory;
use mrw::Util;
use Getopt::Long;
use YAML::Tiny qw(LoadFile);
my $mrwFile = "";
my $outFile = "";
my $configFile = "";
my $skipBrokenMrw = 0;
GetOptions(
"m=s" => \$mrwFile,
"c=s" => \$configFile,
"o=s" => \$outFile,
"skip-broken-mrw" => \$skipBrokenMrw
)
or printUsage();
if (($mrwFile eq "") or ($configFile eq "") or ($outFile eq ""))
{
printUsage();
}
# Load system MRW
my $targets = Targets->new;
$targets->loadXML($mrwFile);
my @inventory = Inventory::getInventory($targets);
# Parse config YAML
my $targetItems = LoadFile($configFile);
# Targets we're interested in, from the config YAML
my @targetNames = keys %{$targetItems};
my %targetHash;
@targetHash{@targetNames} = ();
# Target Type : Target inventory path
my %defaultPaths = (
"ETHERNET",
Util::getObmcName(
\@inventory,
Util::getBMCTarget($targets))."/ethernet"
);
open(my $fh, '>', $outFile) or die "Could not open file '$outFile' $!";
# Retrieve OBMC path of targets we're interested in
for my $item (@inventory) {
my $targetType = "";
my $path = "";
if (!$targets->isBadAttribute($item->{TARGET}, "TYPE")) {
$targetType = $targets->getAttribute($item->{TARGET}, "TYPE");
}
next if (not exists $targetItems->{$targetType});
writeOutput($targetType,
$item,
$targetItems);
delete($targetHash{$targetType});
}
writeRemaining($targetItems);
close $fh;
sub writeRemaining
{
my ($yamlDict) = @_;
for my $type (keys %targetHash)
{
if($skipBrokenMrw and !exists $defaultPaths{$type})
{
next;
}
print $fh $defaultPaths{$type}.":";
print $fh "\n";
while (my ($interface,$propertyMap) = each %{$yamlDict->{$type}})
{
print $fh " ".$interface.":";
print $fh "\n";
while (my ($property,$value) = each %{$propertyMap})
{
$value = "'".$value."'";
print $fh " ".$property.": ".$value;
print $fh "\n";
}
}
}
}
sub writeOutput
{
my ($type, $item, $yamlDict) = @_;
print $fh $item->{OBMC_NAME}.":";
print $fh "\n";
while (my ($interface,$propertyMap) = each %{$yamlDict->{$type}})
{
print $fh " ".$interface.":";
print $fh "\n";
while (my ($property,$value) = each %{$propertyMap})
{
$value = getValue($item, $property, $value);
print $fh " ".$property.": ".$value;
print $fh "\n";
}
}
}
sub getValue
{
my ($item, $property, $value) = @_;
$value = "'".$value."'";
if ($property eq "FieldReplaceable")
{
$value = "'false'";
if (!$targets->isBadAttribute($item->{TARGET}, "RU_TYPE"))
{
my $ruType = $targets->getAttribute($item->{TARGET}, "RU_TYPE");
if (($ruType eq "FRU") || ($ruType eq "CRU"))
{
$value = "'true'";
}
}
}
return $value;
}
sub printUsage
{
print "
$0 -m [MRW file] -c [Config yaml] -o [Output filename] [OPTIONS]
Options:
--skip-broken-mrw = Skip broken MRW targets
\n";
exit(1);
}