#!/usr/bin/env perl use strict; use warnings; use mrw::Targets; use mrw::Inventory; use mrw::Util; use Getopt::Long; # For parsing command line arguments use YAML::Tiny qw(LoadFile); # Globals my $serverwizFile = ""; my $debug = 0; my $outputFile = ""; my $metaDataFile = ""; my $skipBrokenMrw = 0; # Command line argument parsing GetOptions( "i=s" => \$serverwizFile, # string "m=s" => \$metaDataFile, # string "o=s" => \$outputFile, # string "skip-broken-mrw" => \$skipBrokenMrw, "d" => \$debug, ) or printUsage(); if (($serverwizFile eq "") or ($outputFile eq "") or ($metaDataFile eq "")) { printUsage(); } my $targetObj = Targets->new; $targetObj->loadXML($serverwizFile); #open the mrw xml and the metaData file for the fru. #Fetch the FRU id,type,object path from the mrw. #Get the metadata for that fru from the metadata file. #Merge the data into the outputfile open(my $fh, '>', $outputFile) or die "Could not open file '$outputFile' $!"; my $fruTypeConfig = LoadFile($metaDataFile); my @interestedTypes = keys %{$fruTypeConfig}; my %types; @types{@interestedTypes} = (); my %entityInfoDict; my @allAssoTypes = getAllAssociatedTypes($fruTypeConfig); my %allAssoTypesHash; @allAssoTypesHash{@allAssoTypes} = (); my @inventory = Inventory::getInventory($targetObj); for my $item (@inventory) { my $isFru = 0, my $fruID = 0, my $fruType = ""; my $entityInstance = 1, my $entityID = 0; #Fetch the FRUID. if (!$targetObj->isBadAttribute($item->{TARGET}, "FRU_ID")) { $fruID = $targetObj->getAttribute($item->{TARGET}, "FRU_ID"); $isFru = 1; } #Fetch the FRU Type. if (!$targetObj->isBadAttribute($item->{TARGET}, "TYPE")) { $fruType = $targetObj->getAttribute($item->{TARGET}, "TYPE"); } #Skip if any one is true #1) If not fru #2) if the fru type is not there in the config file. #3) if the fru type is in associated types. #4) if FRU_ID is not defined for the target and we are asked to ignore such # targets. next if ($skipBrokenMrw and ($fruID eq "")); next if (not $isFru or not exists $types{$fruType} or exists $allAssoTypesHash{$fruType}); printDebug ("FRUID => $fruID, FRUType => $fruType, ObjectPath => $item->{OBMC_NAME}"); print $fh $fruID.":"; print $fh "\n"; $entityID = $fruTypeConfig->{$fruType}->{'EntityID'}; if (exists $entityInfoDict{$entityID}) { $entityInstance = $entityInfoDict{$entityID} + 1; } printDebug("entityID => $entityID , entityInstance => $entityInstance"); $entityInfoDict{$entityID} = $entityInstance; writeToFile($fruType,$item->{OBMC_NAME},$fruTypeConfig,$fh); #if the key(AssociatedTypes) exists and it is defined #then make the association. if (!defined $fruTypeConfig->{$fruType}->{'AssociatedTypes'}) { next; } my $assoTypes = $fruTypeConfig->{$fruType}->{'AssociatedTypes'}; for my $type (@$assoTypes) { my @devices = Util::getDevicePath(\@inventory,$targetObj,$type); for my $device (@devices) { writeToFile($type,$device,$fruTypeConfig,$fh); } } } close $fh; #------------------------------------END OF MAIN----------------------- # Get all the associated types sub getAllAssociatedTypes { my $fruTypeConfig = $_[0]; my @assoTypes; while (my($key, $value) = each %$fruTypeConfig) { #if the key exist and value is also there if (defined $value->{'AssociatedTypes'}) { my $assoTypes = $value->{'AssociatedTypes'}; for my $type (@$assoTypes) { push(@assoTypes,$type); } } } return @assoTypes; } #Get the metdata for the incoming frutype from the loaded config file. #Write the FRU data into the output file sub writeToFile { my $fruType = $_[0];#fru type my $instancePath = $_[1];#instance Path my $fruTypeConfig = $_[2];#loaded config file (frutypes) my $fh = $_[3];#file Handle #walk over all the fru types and match for the incoming type print $fh " ".$instancePath.":"; print $fh "\n"; print $fh " "."entityID: ".$fruTypeConfig->{$fruType}->{'EntityID'}; print $fh "\n"; print $fh " "."entityInstance: "; print $fh $entityInfoDict{$fruTypeConfig->{$fruType}->{'EntityID'}}; print $fh "\n"; print $fh " "."interfaces:"; print $fh "\n"; my $interfaces = $fruTypeConfig->{$fruType}->{'Interfaces'}; #Walk over all the interfaces as it needs to be written while ( my ($interface,$properties) = each %{$interfaces}) { print $fh " ".$interface.":"; print $fh "\n"; #walk over all the properties as it needs to be written while ( my ($dbusProperty,$metadata) = each %{$properties}) { #will write property named "Property" first then #other properties. print $fh " ".$dbusProperty.":"; print $fh "\n"; for my $key (sort keys %{$metadata}) { print $fh " $key: "."$metadata->{$key}"; print $fh "\n"; } } } } # Usage sub printUsage { print " $0 -i [MRW filename] -m [MetaData filename] -o [Output filename] [OPTIONS] Options: -d = debug mode --skip-broken-mrw = Skip broken MRW targets \n"; exit(1); } # Helper function to put debug statements. sub printDebug { my $str = shift; print "DEBUG: ", $str, "\n" if $debug; }