1b4edc27aSAndrew Geissler#!/usr/bin/env perl 265ca8e19SAndrew Geissler 3fa70dc9dSRatan Guptause strict; 4fa70dc9dSRatan Guptause warnings; 5fa70dc9dSRatan Gupta 6fa70dc9dSRatan Guptause mrw::Targets; 7fa70dc9dSRatan Guptause mrw::Inventory; 86225e93dSDeepak Kodihalliuse mrw::Util; 9fa70dc9dSRatan Guptause Getopt::Long; # For parsing command line arguments 10550075b1SBrad Bishopuse YAML::Tiny qw(LoadFile); 11fa70dc9dSRatan Gupta# Globals 12fa70dc9dSRatan Guptamy $serverwizFile = ""; 13fa70dc9dSRatan Guptamy $debug = 0; 14a149ba10SRatan Guptamy $outputFile = ""; 15a149ba10SRatan Guptamy $metaDataFile = ""; 1651041fc8SSantosh Puranikmy $skipBrokenMrw = 0; 17fa70dc9dSRatan Gupta 18fa70dc9dSRatan Gupta# Command line argument parsing 19fa70dc9dSRatan GuptaGetOptions( 20fa70dc9dSRatan Gupta"i=s" => \$serverwizFile, # string 21a149ba10SRatan Gupta"m=s" => \$metaDataFile, # string 22a149ba10SRatan Gupta"o=s" => \$outputFile, # string 2351041fc8SSantosh Puranik"skip-broken-mrw" => \$skipBrokenMrw, 24fa70dc9dSRatan Gupta"d" => \$debug, 25fa70dc9dSRatan Gupta) 26fa70dc9dSRatan Guptaor printUsage(); 27fa70dc9dSRatan Gupta 28a149ba10SRatan Guptaif (($serverwizFile eq "") or ($outputFile eq "") or ($metaDataFile eq "")) 29fa70dc9dSRatan Gupta{ 30fa70dc9dSRatan Gupta printUsage(); 31fa70dc9dSRatan Gupta} 32fa70dc9dSRatan Gupta 33fa70dc9dSRatan Guptamy $targetObj = Targets->new; 34fa70dc9dSRatan Gupta$targetObj->loadXML($serverwizFile); 35fa70dc9dSRatan Gupta 36a149ba10SRatan Gupta#open the mrw xml and the metaData file for the fru. 37a149ba10SRatan Gupta#Fetch the FRU id,type,object path from the mrw. 38a149ba10SRatan Gupta#Get the metadata for that fru from the metadata file. 39a149ba10SRatan Gupta#Merge the data into the outputfile 40a149ba10SRatan Gupta 41a149ba10SRatan Guptaopen(my $fh, '>', $outputFile) or die "Could not open file '$outputFile' $!"; 42a149ba10SRatan Guptamy $fruTypeConfig = LoadFile($metaDataFile); 43a149ba10SRatan Gupta 44a149ba10SRatan Guptamy @interestedTypes = keys %{$fruTypeConfig}; 45a149ba10SRatan Guptamy %types; 46a149ba10SRatan Gupta@types{@interestedTypes} = (); 47fa70dc9dSRatan Gupta 488b34b33fSRatan Guptamy %entityInfoDict; 498b34b33fSRatan Gupta 50d92101d5SRatan Guptamy @allAssoTypes = getAllAssociatedTypes($fruTypeConfig); 51d92101d5SRatan Guptamy %allAssoTypesHash; 52d92101d5SRatan Gupta@allAssoTypesHash{@allAssoTypes} = (); 53d92101d5SRatan Gupta 54fa70dc9dSRatan Guptamy @inventory = Inventory::getInventory($targetObj); 55fa70dc9dSRatan Guptafor my $item (@inventory) { 56fa70dc9dSRatan Gupta my $isFru = 0, my $fruID = 0, my $fruType = ""; 578b34b33fSRatan Gupta my $entityInstance = 1, my $entityID = 0; 588b34b33fSRatan Gupta 59a149ba10SRatan Gupta #Fetch the FRUID. 60fa70dc9dSRatan Gupta if (!$targetObj->isBadAttribute($item->{TARGET}, "FRU_ID")) { 61fa70dc9dSRatan Gupta $fruID = $targetObj->getAttribute($item->{TARGET}, "FRU_ID"); 62fa70dc9dSRatan Gupta $isFru = 1; 63fa70dc9dSRatan Gupta } 64a149ba10SRatan Gupta #Fetch the FRU Type. 65fa70dc9dSRatan Gupta if (!$targetObj->isBadAttribute($item->{TARGET}, "TYPE")) { 66fa70dc9dSRatan Gupta $fruType = $targetObj->getAttribute($item->{TARGET}, "TYPE"); 67fa70dc9dSRatan Gupta } 68fa70dc9dSRatan Gupta 69d92101d5SRatan Gupta #Skip if any one is true 70d92101d5SRatan Gupta #1) If not fru 71d92101d5SRatan Gupta #2) if the fru type is not there in the config file. 72d92101d5SRatan Gupta #3) if the fru type is in associated types. 7351041fc8SSantosh Puranik #4) if FRU_ID is not defined for the target and we are asked to ignore such 7451041fc8SSantosh Puranik # targets. 7551041fc8SSantosh Puranik 7651041fc8SSantosh Puranik next if ($skipBrokenMrw and ($fruID eq "")); 77d92101d5SRatan Gupta 78d92101d5SRatan Gupta next if (not $isFru or not exists $types{$fruType} or exists $allAssoTypesHash{$fruType}); 79fa70dc9dSRatan Gupta 80fa70dc9dSRatan Gupta printDebug ("FRUID => $fruID, FRUType => $fruType, ObjectPath => $item->{OBMC_NAME}"); 81fa70dc9dSRatan Gupta 82a149ba10SRatan Gupta print $fh $fruID.":"; 83a149ba10SRatan Gupta print $fh "\n"; 84a149ba10SRatan Gupta 858b34b33fSRatan Gupta $entityID = $fruTypeConfig->{$fruType}->{'EntityID'}; 868b34b33fSRatan Gupta 878b34b33fSRatan Gupta if (exists $entityInfoDict{$entityID}) { 888b34b33fSRatan Gupta $entityInstance = $entityInfoDict{$entityID} + 1; 898b34b33fSRatan Gupta } 908b34b33fSRatan Gupta 918b34b33fSRatan Gupta printDebug("entityID => $entityID , entityInstance => $entityInstance"); 928b34b33fSRatan Gupta 938b34b33fSRatan Gupta $entityInfoDict{$entityID} = $entityInstance; 948b34b33fSRatan Gupta 95a149ba10SRatan Gupta writeToFile($fruType,$item->{OBMC_NAME},$fruTypeConfig,$fh); 96a149ba10SRatan Gupta 97d92101d5SRatan Gupta #if the key(AssociatedTypes) exists and it is defined 98d92101d5SRatan Gupta #then make the association. 9926cc055bSRatan Gupta 100d92101d5SRatan Gupta if (!defined $fruTypeConfig->{$fruType}->{'AssociatedTypes'}) { 10126cc055bSRatan Gupta next; 10226cc055bSRatan Gupta } 10326cc055bSRatan Gupta 104d92101d5SRatan Gupta my $assoTypes = $fruTypeConfig->{$fruType}->{'AssociatedTypes'}; 105d92101d5SRatan Gupta for my $type (@$assoTypes) { 106d92101d5SRatan Gupta my @devices = Util::getDevicePath(\@inventory,$targetObj,$type); 107d92101d5SRatan Gupta for my $device (@devices) { 108d92101d5SRatan Gupta writeToFile($type,$device,$fruTypeConfig,$fh); 10926cc055bSRatan Gupta } 11026cc055bSRatan Gupta 11126cc055bSRatan Gupta } 11226cc055bSRatan Gupta 113fa70dc9dSRatan Gupta} 114a149ba10SRatan Guptaclose $fh; 115a149ba10SRatan Gupta 116fa70dc9dSRatan Gupta#------------------------------------END OF MAIN----------------------- 117fa70dc9dSRatan Gupta 118d92101d5SRatan Gupta# Get all the associated types 119d92101d5SRatan Guptasub getAllAssociatedTypes 120d92101d5SRatan Gupta{ 121d92101d5SRatan Gupta my $fruTypeConfig = $_[0]; 122d92101d5SRatan Gupta my @assoTypes; 123d92101d5SRatan Gupta while (my($key, $value) = each %$fruTypeConfig) { 124d92101d5SRatan Gupta #if the key exist and value is also there 125d92101d5SRatan Gupta if (defined $value->{'AssociatedTypes'}) { 126d92101d5SRatan Gupta my $assoTypes = $value->{'AssociatedTypes'}; 127d92101d5SRatan Gupta for my $type (@$assoTypes) { 128d92101d5SRatan Gupta push(@assoTypes,$type); 129d92101d5SRatan Gupta } 130d92101d5SRatan Gupta } 131d92101d5SRatan Gupta } 132d92101d5SRatan Gupta return @assoTypes; 133d92101d5SRatan Gupta} 134d92101d5SRatan Gupta 135*4954d029SManojkiran Eda#Get the metadata for the incoming frutype from the loaded config file. 136a149ba10SRatan Gupta#Write the FRU data into the output file 137a149ba10SRatan Gupta 138a149ba10SRatan Guptasub writeToFile 139a149ba10SRatan Gupta{ 140a149ba10SRatan Gupta my $fruType = $_[0];#fru type 141a149ba10SRatan Gupta my $instancePath = $_[1];#instance Path 142a149ba10SRatan Gupta my $fruTypeConfig = $_[2];#loaded config file (frutypes) 143a149ba10SRatan Gupta my $fh = $_[3];#file Handle 144a149ba10SRatan Gupta #walk over all the fru types and match for the incoming type 1458b34b33fSRatan Gupta 146a149ba10SRatan Gupta print $fh " ".$instancePath.":"; 147a149ba10SRatan Gupta print $fh "\n"; 1488b34b33fSRatan Gupta print $fh " "."entityID: ".$fruTypeConfig->{$fruType}->{'EntityID'}; 1498b34b33fSRatan Gupta print $fh "\n"; 1508b34b33fSRatan Gupta print $fh " "."entityInstance: "; 1518b34b33fSRatan Gupta print $fh $entityInfoDict{$fruTypeConfig->{$fruType}->{'EntityID'}}; 1528b34b33fSRatan Gupta print $fh "\n"; 1538b34b33fSRatan Gupta print $fh " "."interfaces:"; 1548b34b33fSRatan Gupta print $fh "\n"; 1558b34b33fSRatan Gupta 156d92101d5SRatan Gupta my $interfaces = $fruTypeConfig->{$fruType}->{'Interfaces'}; 1578b34b33fSRatan Gupta 158a149ba10SRatan Gupta #Walk over all the interfaces as it needs to be written 159a149ba10SRatan Gupta while ( my ($interface,$properties) = each %{$interfaces}) { 160a149ba10SRatan Gupta print $fh " ".$interface.":"; 161a149ba10SRatan Gupta print $fh "\n"; 162a149ba10SRatan Gupta #walk over all the properties as it needs to be written 163a149ba10SRatan Gupta while ( my ($dbusProperty,$metadata) = each %{$properties}) { 164a149ba10SRatan Gupta #will write property named "Property" first then 165a149ba10SRatan Gupta #other properties. 166a149ba10SRatan Gupta print $fh " ".$dbusProperty.":"; 167a149ba10SRatan Gupta print $fh "\n"; 168a149ba10SRatan Gupta for my $key (sort keys %{$metadata}) { 169a149ba10SRatan Gupta print $fh " $key: "."$metadata->{$key}"; 170a149ba10SRatan Gupta print $fh "\n"; 171a149ba10SRatan Gupta } 172a149ba10SRatan Gupta } 173a149ba10SRatan Gupta } 174a149ba10SRatan Gupta} 175a149ba10SRatan Gupta 176fa70dc9dSRatan Gupta# Usage 177fa70dc9dSRatan Guptasub printUsage 178fa70dc9dSRatan Gupta{ 179fa70dc9dSRatan Gupta print " 180a149ba10SRatan Gupta $0 -i [MRW filename] -m [MetaData filename] -o [Output filename] [OPTIONS] 181fa70dc9dSRatan GuptaOptions: 182fa70dc9dSRatan Gupta -d = debug mode 18351041fc8SSantosh Puranik --skip-broken-mrw = Skip broken MRW targets 184fa70dc9dSRatan Gupta \n"; 185fa70dc9dSRatan Gupta exit(1); 186fa70dc9dSRatan Gupta} 187fa70dc9dSRatan Gupta 188fa70dc9dSRatan Gupta# Helper function to put debug statements. 189fa70dc9dSRatan Guptasub printDebug 190fa70dc9dSRatan Gupta{ 191fa70dc9dSRatan Gupta my $str = shift; 192fa70dc9dSRatan Gupta print "DEBUG: ", $str, "\n" if $debug; 193fa70dc9dSRatan Gupta} 194d92101d5SRatan Gupta 195