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