#!/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); }