#!/usr/bin/env perl use strict; use warnings; use mrw::Targets; # Set of APIs allowing access to parsed ServerWiz2 XML output use mrw::Inventory; # To get list of Inventory targets use Getopt::Long; # For parsing command line arguments # Globals my $force = 0; my $serverwizFile = ""; my $debug = 0; my $outputFile = ""; my $verbose = 0; # Command line argument parsing GetOptions( "f" => \$force, # numeric "i=s" => \$serverwizFile, # string "o=s" => \$outputFile, # string "d" => \$debug, "v" => \$verbose, ) or printUsage(); if (($serverwizFile eq "") or ($outputFile eq "")) { printUsage(); } # Hashmap of all the OCCs and their sensor IDs my %occHash; # API used to access parsed XML data my $targetObj = Targets->new; if($verbose == 1) { $targetObj->{debug} = 1; } if($force == 1) { $targetObj->{force} = 1; } $targetObj->loadXML($serverwizFile); print "Loaded MRW XML: $serverwizFile \n"; # Process all the targets in the XML foreach my $target (sort keys %{$targetObj->getAllTargets()}) { # Only take the instances having 'OCC" as TYPE if ("OCC" ne $targetObj->getAttribute($target, "TYPE")) { next; } # OCC instance and sensor ID to insert into output file my $instance = ""; my $sensor = ""; # Now that we are in OCC target instance, get the instance number $instance = $targetObj->getAttribute($target, "IPMI_INSTANCE"); # Each OCC would have occ_active_sensor child that would have # more information, such as Sensor ID. # This would be an array of children targets my $children = $targetObj->getTargetChildren($target); for my $child (@{$children}) { $sensor = $targetObj->getAttribute($child, "IPMI_SENSOR_ID"); } # Populate a hashmap with OCC and its sensor ID $occHash{$instance} = $sensor; } # All the targets # Generate the yaml file generateYamlFile(); ##------------------------------------END OF MAIN----------------------- sub generateYamlFile { my $fileName = $outputFile; open(my $fh, '>', $fileName) or die "Could not open file '$fileName' $!"; foreach my $instance (sort keys %occHash) { # YAML with list of {Instance:SensorID} dictionary print $fh "- Instance: "; print $fh "$instance\n"; print $fh " SensorID: "; print $fh "$occHash{$instance}\n"; } close $fh; } # Helper function to put debug statements. sub printDebug { my $str = shift; print "DEBUG: ", $str, "\n" if $debug; } # Usage sub printUsage { print " $0 -i [XML filename] -o [Output filename] [OPTIONS] Options: -f = force output file creation even when errors -d = debug mode -v = verbose mode - for verbose o/p from Targets.pm PS: mrw::Targets can be found in https://github.com/open-power/serverwiz/ mrw::Inventory can be found in https://github.com/openbmc/phosphor-mrw-tools/ \n"; exit(1); } #------------------------------------END OF SUB-----------------------