1d0039437SVishwanatha Subbanna#!/usr/bin/env perl 2*65ca8e19SAndrew Geissler 33706646aSVishwanatha Subbannause strict; 43706646aSVishwanatha Subbannause warnings; 53706646aSVishwanatha Subbanna 63706646aSVishwanatha Subbannause mrw::Targets; # Set of APIs allowing access to parsed ServerWiz2 XML output 73706646aSVishwanatha Subbannause mrw::Inventory; # To get list of Inventory targets 83706646aSVishwanatha Subbannause Getopt::Long; # For parsing command line arguments 93706646aSVishwanatha Subbannause Data::Dumper qw(Dumper); # Dumping blob 10d0039437SVishwanatha Subbannause List::Util qw(first); 113706646aSVishwanatha Subbanna 123706646aSVishwanatha Subbanna# Globals 133706646aSVishwanatha Subbannamy $force = 0; 143706646aSVishwanatha Subbannamy $serverwizFile = ""; 153706646aSVishwanatha Subbannamy $debug = 0; 163706646aSVishwanatha Subbannamy $outputFile = ""; 173706646aSVishwanatha Subbannamy $verbose = 0; 183706646aSVishwanatha Subbanna 193706646aSVishwanatha Subbanna# Command line argument parsing 203706646aSVishwanatha SubbannaGetOptions( 213706646aSVishwanatha Subbanna"f" => \$force, # numeric 223706646aSVishwanatha Subbanna"i=s" => \$serverwizFile, # string 233706646aSVishwanatha Subbanna"o=s" => \$outputFile, # string 243706646aSVishwanatha Subbanna"d" => \$debug, 253706646aSVishwanatha Subbanna"v" => \$verbose, 263706646aSVishwanatha Subbanna) 273706646aSVishwanatha Subbannaor printUsage(); 283706646aSVishwanatha Subbanna 293706646aSVishwanatha Subbannaif (($serverwizFile eq "") or ($outputFile eq "")) 303706646aSVishwanatha Subbanna{ 313706646aSVishwanatha Subbanna printUsage(); 323706646aSVishwanatha Subbanna} 333706646aSVishwanatha Subbanna 343706646aSVishwanatha Subbanna# Hashmap of all the LED groups with the properties 353706646aSVishwanatha Subbannamy %hashGroup; 363706646aSVishwanatha Subbanna 373706646aSVishwanatha Subbanna# hash of targets to Names that have the FRU Inventory instances 383706646aSVishwanatha Subbannamy %invHash; 393706646aSVishwanatha Subbanna 40e36476e2SVishwanatha Subbanna# Hash of Enclosure Fault LED names and their properties 41e36476e2SVishwanatha Subbanna# These are generally front-fault-led and rear-fault-led 42e36476e2SVishwanatha Subbannamy %encFaults; 433706646aSVishwanatha Subbanna 44d0039437SVishwanatha Subbanna# These groups are a must in all the systems. 45d0039437SVishwanatha Subbanna# Its fine if they don't map to any physical LED 46d0039437SVishwanatha Subbannamy @defaultGroup = ("BmcBooted", "PowerOn"); 47d0039437SVishwanatha Subbanna 48c5e127d6SVishwanatha Subbanna# This group contains all the LEDs with the action Blink 49c5e127d6SVishwanatha Subbannamy $lampTest = "LampTest"; 50c5e127d6SVishwanatha Subbanna 513706646aSVishwanatha Subbanna# API used to access parsed XML data 523706646aSVishwanatha Subbannamy $targetObj = Targets->new; 533706646aSVishwanatha Subbannaif($verbose == 1) 543706646aSVishwanatha Subbanna{ 553706646aSVishwanatha Subbanna $targetObj->{debug} = 1; 563706646aSVishwanatha Subbanna} 573706646aSVishwanatha Subbanna 583706646aSVishwanatha Subbannaif($force == 1) 593706646aSVishwanatha Subbanna{ 603706646aSVishwanatha Subbanna $targetObj->{force} = 1; 613706646aSVishwanatha Subbanna} 623706646aSVishwanatha Subbanna 633706646aSVishwanatha Subbanna$targetObj->loadXML($serverwizFile); 643706646aSVishwanatha Subbannaprint "Loaded MRW XML: $serverwizFile \n"; 653706646aSVishwanatha Subbanna 663706646aSVishwanatha Subbanna# Iterate over Inventory and get all the Inventory targets. 673706646aSVishwanatha Subbannamy @inventory = Inventory::getInventory($targetObj); 683706646aSVishwanatha Subbannafor my $item (@inventory) 693706646aSVishwanatha Subbanna{ 703706646aSVishwanatha Subbanna # Target to Obmc_Name hash. 713706646aSVishwanatha Subbanna $invHash{$item->{TARGET}} = $item->{OBMC_NAME}; 723706646aSVishwanatha Subbanna} 733706646aSVishwanatha Subbanna 743706646aSVishwanatha Subbanna# For debugging purpose. 753706646aSVishwanatha SubbannaprintDebug("\nList of Inventory targets\n"); 763706646aSVishwanatha Subbannaforeach my $key (sort keys %invHash) 773706646aSVishwanatha Subbanna{ 783706646aSVishwanatha Subbanna printDebug("$invHash{$key}\n"); 793706646aSVishwanatha Subbanna} 803706646aSVishwanatha Subbanna 813706646aSVishwanatha Subbanna# Process all the targets in the XML. If the target is associated with a FRU, 823706646aSVishwanatha Subbanna# then remember it so that when we do the FRU inventory lookup, we know if 833706646aSVishwanatha Subbanna# that Inventory has a LED associated with it or not. 843706646aSVishwanatha Subbannaforeach my $target (sort keys %{$targetObj->getAllTargets()}) 853706646aSVishwanatha Subbanna{ 863706646aSVishwanatha Subbanna # Some the target instances may *not* have this MRW_TYPE attribute. 873706646aSVishwanatha Subbanna if($targetObj->isBadAttribute($target, "MRW_TYPE")) 883706646aSVishwanatha Subbanna { 893706646aSVishwanatha Subbanna next; 903706646aSVishwanatha Subbanna } 913706646aSVishwanatha Subbanna 923706646aSVishwanatha Subbanna # Return true if not populated -or- not present 933706646aSVishwanatha Subbanna if("LED" eq $targetObj->getMrwType($target)) 943706646aSVishwanatha Subbanna { 953706646aSVishwanatha Subbanna # Just for clarity. 963706646aSVishwanatha Subbanna my $ledTarget = $target; 973706646aSVishwanatha Subbanna 983706646aSVishwanatha Subbanna # OBMC_NAME field of the FRU 993706646aSVishwanatha Subbanna # fruPath ex /system/chassis/motherboard/dimm1 1003706646aSVishwanatha Subbanna # device "dimm1" 1013706646aSVishwanatha Subbanna my $fruPath = ''; 1023706646aSVishwanatha Subbanna my $device = ''; 1033706646aSVishwanatha Subbanna 1043706646aSVishwanatha Subbanna # Find if this LED is associated with a FRU. 1053706646aSVishwanatha Subbanna # Example, FAN will have LED on that assembly. 1063706646aSVishwanatha Subbanna my $conns = $targetObj->findConnections($ledTarget, "LOGICAL_ASSOCIATION"); 1073706646aSVishwanatha Subbanna if ($conns ne "") 1083706646aSVishwanatha Subbanna { 1093706646aSVishwanatha Subbanna # This LED is associated with a FRU 1103706646aSVishwanatha Subbanna for my $conn (@{$conns->{CONN}}) 1113706646aSVishwanatha Subbanna { 1123706646aSVishwanatha Subbanna my $destTarget = $conn->{DEST_PARENT}; 1133706646aSVishwanatha Subbanna # If we have found this, then that means, we do not need to 1143706646aSVishwanatha Subbanna # hand cook a group name. delete this value from the inventory 1153706646aSVishwanatha Subbanna # array 1163706646aSVishwanatha Subbanna if(exists($invHash{$destTarget})) 1173706646aSVishwanatha Subbanna { 1183706646aSVishwanatha Subbanna # This will remove a particular {key, value} pair 1193706646aSVishwanatha Subbanna $fruPath = $invHash{$destTarget}; 1203706646aSVishwanatha Subbanna printDebug("$destTarget : $fruPath is having associated LED\n"); 1213706646aSVishwanatha Subbanna delete ($invHash{$destTarget}); 1223706646aSVishwanatha Subbanna } 1233706646aSVishwanatha Subbanna } 1243706646aSVishwanatha Subbanna # fetch FruName from the device path 1253706646aSVishwanatha Subbanna $device = getFruName($fruPath); 1263706646aSVishwanatha Subbanna printDebug("$target; $device has device\n"); 1273706646aSVishwanatha Subbanna } 1283706646aSVishwanatha Subbanna 1293706646aSVishwanatha Subbanna if($targetObj->isBadAttribute($ledTarget, "CONTROL_GROUPS")) 1303706646aSVishwanatha Subbanna { 1313706646aSVishwanatha Subbanna next; 1323706646aSVishwanatha Subbanna } 1333706646aSVishwanatha Subbanna 134a9660424SVishwanatha Subbanna # By default, Blink takes higher priority 135a9660424SVishwanatha Subbanna my $priority = "'Blink'"; 136a9660424SVishwanatha Subbanna 137a9660424SVishwanatha Subbanna # Get the priority. Since rest everything is populated, 138a9660424SVishwanatha Subbanna # default to Blink than err'ing out. Not checking for 139a9660424SVishwanatha Subbanna # validity of this since it must be present. 140a9660424SVishwanatha Subbanna if($targetObj->getAttribute($ledTarget, "LED_PRIORITY") eq "ON") 141a9660424SVishwanatha Subbanna { 142a9660424SVishwanatha Subbanna $priority = "'On'"; 143a9660424SVishwanatha Subbanna } 144a9660424SVishwanatha Subbanna 145312fa6baSMatt Spinler #The MRW instance name must match the LED name in the device tree 146312fa6baSMatt Spinler my $name = $targetObj->getInstanceName($ledTarget); 147e36476e2SVishwanatha Subbanna 148e36476e2SVishwanatha Subbanna # Get if this LED is a ENC-FAULT type. 149e36476e2SVishwanatha Subbanna if(!$targetObj->isBadAttribute($target, "LED_TYPE")) 150e36476e2SVishwanatha Subbanna { 151e36476e2SVishwanatha Subbanna if("ENC-FAULT" eq $targetObj->getAttribute($ledTarget, "LED_TYPE")) 152e36476e2SVishwanatha Subbanna { 153e36476e2SVishwanatha Subbanna $encFaults{$name} = $priority; 154e36476e2SVishwanatha Subbanna } 155e36476e2SVishwanatha Subbanna } 156e36476e2SVishwanatha Subbanna 157e36476e2SVishwanatha Subbanna # Defines the LEDs and the Groups that they belong to 1583706646aSVishwanatha Subbanna my $controlGroup = $targetObj->getAttribute($ledTarget, "CONTROL_GROUPS"); 1593706646aSVishwanatha Subbanna 1603706646aSVishwanatha Subbanna #remove spaces, because serverwiz isn't good at removing them itself 1613706646aSVishwanatha Subbanna $controlGroup =~ s/\s//g; 1623706646aSVishwanatha Subbanna my @groups= split(',', $controlGroup); #just a long 16x3 = 48 element list 1633706646aSVishwanatha Subbanna 1643706646aSVishwanatha Subbanna for (my $i = 0; $i < scalar @groups; $i += 3) 1653706646aSVishwanatha Subbanna { 1663706646aSVishwanatha Subbanna if (($groups[$i] ne "NA") && ($groups[$i] ne "")) 1673706646aSVishwanatha Subbanna { 1683706646aSVishwanatha Subbanna my $groupName = $groups[$i]; 1693706646aSVishwanatha Subbanna printDebug("$groupName\n"); 1703706646aSVishwanatha Subbanna 1713706646aSVishwanatha Subbanna my $blinkFreq = $groups[$i+1]; 1723706646aSVishwanatha Subbanna my $action = "'On'"; 1733706646aSVishwanatha Subbanna my $period = 0; 1743706646aSVishwanatha Subbanna 1753706646aSVishwanatha Subbanna # Period in milli seconds 1763706646aSVishwanatha Subbanna my $dutyCycle = $groups[$i+2]; 1773706646aSVishwanatha Subbanna if($blinkFreq > 0) 1783706646aSVishwanatha Subbanna { 1793706646aSVishwanatha Subbanna $action = "'Blink'"; 1803706646aSVishwanatha Subbanna $period = (1 / $blinkFreq) * 1000; 1813706646aSVishwanatha Subbanna } 1823706646aSVishwanatha Subbanna 1833706646aSVishwanatha Subbanna # Insert into hash map; 184e36476e2SVishwanatha Subbanna $hashGroup{$groupName}{$name}{"Action"} = $action; 185e36476e2SVishwanatha Subbanna $hashGroup{$groupName}{$name}{"Period"} = $period; 186e36476e2SVishwanatha Subbanna $hashGroup{$groupName}{$name}{"DutyOn"} = $dutyCycle; 187e36476e2SVishwanatha Subbanna $hashGroup{$groupName}{$name}{"Priority"} = $priority; 188c5e127d6SVishwanatha Subbanna 189c5e127d6SVishwanatha Subbanna # Need to update the LampTest group. 190e36476e2SVishwanatha Subbanna $hashGroup{$lampTest}{$name}{"Action"} = "'Blink'"; 191e36476e2SVishwanatha Subbanna $hashGroup{$lampTest}{$name}{"Period"} = 1000; 192e36476e2SVishwanatha Subbanna $hashGroup{$lampTest}{$name}{"DutyOn"} = 50; 193e36476e2SVishwanatha Subbanna 194e36476e2SVishwanatha Subbanna # Priority of a particular LED needs to stay SAME across 195e36476e2SVishwanatha Subbanna # all groups 196e36476e2SVishwanatha Subbanna $hashGroup{$lampTest}{$name}{"Priority"} = $priority; 1973706646aSVishwanatha Subbanna } 1983706646aSVishwanatha Subbanna } # Walk CONTROL_GROUP 1993706646aSVishwanatha Subbanna } # Has LED target 2003706646aSVishwanatha Subbanna} # All the targets 2013706646aSVishwanatha Subbanna 2023706646aSVishwanatha Subbanna 2033706646aSVishwanatha Subbanna# These are the FRUs that do not have associated LEDs. All of these need to be 2043706646aSVishwanatha Subbanna# mapped to some group, which will be named after this target name and the 2053706646aSVishwanatha Subbanna# elements of the group are EnclosureFaults Front and Back 2063706646aSVishwanatha SubbannaprintDebug("\n======================================================================\n"); 2073706646aSVishwanatha SubbannaprintDebug("\nFRUs that do not have associated LEDs\n"); 2083706646aSVishwanatha Subbannaforeach my $key (sort keys %invHash) 2093706646aSVishwanatha Subbanna{ 2103706646aSVishwanatha Subbanna my $device = getFruName($invHash{$key}); 2113706646aSVishwanatha Subbanna 2123706646aSVishwanatha Subbanna # For each of these device, the Group record would be this : 2133706646aSVishwanatha Subbanna my $groupName = $device . "Fault"; 2143706646aSVishwanatha Subbanna printDebug("$device :: $groupName\n"); 2153706646aSVishwanatha Subbanna 2163706646aSVishwanatha Subbanna # Setup roll-up LEDs to the ones that are of type ENC-FAULT 217e36476e2SVishwanatha Subbanna foreach my $led (sort keys %encFaults) 2183706646aSVishwanatha Subbanna { 219e36476e2SVishwanatha Subbanna $hashGroup{$groupName}{$led}{"Action"} = "'On'"; 220e36476e2SVishwanatha Subbanna $hashGroup{$groupName}{$led}{"Period"} = 0; 221e36476e2SVishwanatha Subbanna $hashGroup{$groupName}{$led}{"DutyOn"} = 50; 222e36476e2SVishwanatha Subbanna 223e36476e2SVishwanatha Subbanna # Priority of a particular LED needs to stay SAME across 224e36476e2SVishwanatha Subbanna # all groups 225e36476e2SVishwanatha Subbanna $hashGroup{$groupName}{$led}{"Priority"} = $encFaults{$led}; 2263706646aSVishwanatha Subbanna } 2273706646aSVishwanatha Subbanna} 2283706646aSVishwanatha SubbannaprintDebug("\n======================================================================\n"); 2293706646aSVishwanatha Subbanna 23078ae582bSGeorge Liumy $index = rindex($outputFile, "."); 23178ae582bSGeorge Liumy $suffix = substr($outputFile, $index + 1); 23278ae582bSGeorge Liuif (lc($suffix) eq "json") 23378ae582bSGeorge Liu{ 23478ae582bSGeorge Liu # Generate the JSON file 23578ae582bSGeorge Liu generateJSONFile(); 23678ae582bSGeorge Liu} 23778ae582bSGeorge Liuelse 23878ae582bSGeorge Liu{ 2393706646aSVishwanatha Subbanna # Generate the yaml file 2403706646aSVishwanatha Subbanna generateYamlFile(); 24178ae582bSGeorge Liu} 24278ae582bSGeorge Liu 2433706646aSVishwanatha Subbanna#------------------------------------END OF MAIN----------------------- 2443706646aSVishwanatha Subbanna 2453706646aSVishwanatha Subbanna# Gven a '/' separated string, returns the leaf. 2463706646aSVishwanatha Subbanna# Ex: /a/b/c/d returns device=d 2473706646aSVishwanatha Subbannasub getFruName 2483706646aSVishwanatha Subbanna{ 2493706646aSVishwanatha Subbanna my $path = shift; 2503706646aSVishwanatha Subbanna my $device = ''; 2513706646aSVishwanatha Subbanna my $lastSlash=rindex($path, '/'); 2523706646aSVishwanatha Subbanna $device=substr($path, $lastSlash+1); 2533706646aSVishwanatha Subbanna} 2543706646aSVishwanatha Subbanna 2553706646aSVishwanatha Subbannasub generateYamlFile 2563706646aSVishwanatha Subbanna{ 2573706646aSVishwanatha Subbanna my $fileName = $outputFile; 2583706646aSVishwanatha Subbanna my $groupCopy = ''; 2593706646aSVishwanatha Subbanna my $ledCopy = ''; 2603706646aSVishwanatha Subbanna open(my $fh, '>', $fileName) or die "Could not open file '$fileName' $!"; 2613706646aSVishwanatha Subbanna 2623706646aSVishwanatha Subbanna foreach my $group (sort keys %hashGroup) 2633706646aSVishwanatha Subbanna { 2643706646aSVishwanatha Subbanna if($group ne $groupCopy) 2653706646aSVishwanatha Subbanna { 266d0039437SVishwanatha Subbanna # If one of these is a default group, then delete it from the array 267d0039437SVishwanatha Subbanna # that is being maintained to create one by hand if all default ones 268d0039437SVishwanatha Subbanna # are not defined 269d0039437SVishwanatha Subbanna my $index = first {$defaultGroup[$_] eq $group} 0..$#defaultGroup; 270d0039437SVishwanatha Subbanna if (defined $index) 271d0039437SVishwanatha Subbanna { 272d0039437SVishwanatha Subbanna splice @defaultGroup, $index, 1; 273d0039437SVishwanatha Subbanna } 274d0039437SVishwanatha Subbanna 2753706646aSVishwanatha Subbanna $groupCopy = ''; 2763706646aSVishwanatha Subbanna $ledCopy = ''; 2773706646aSVishwanatha Subbanna } 2783706646aSVishwanatha Subbanna 279c5e127d6SVishwanatha Subbanna foreach my $led (sort keys %{ $hashGroup{$group} }) 2803706646aSVishwanatha Subbanna { 281c5e127d6SVishwanatha Subbanna foreach my $property (sort keys %{ $hashGroup{$group}{$led}}) 2823706646aSVishwanatha Subbanna { 2833706646aSVishwanatha Subbanna if($group ne $groupCopy) 2843706646aSVishwanatha Subbanna { 2853706646aSVishwanatha Subbanna $groupCopy = $group; 2863706646aSVishwanatha Subbanna print $fh "$group:\n"; 2873706646aSVishwanatha Subbanna } 2883706646aSVishwanatha Subbanna print $fh " "; 2893706646aSVishwanatha Subbanna if($led ne $ledCopy) 2903706646aSVishwanatha Subbanna { 2913706646aSVishwanatha Subbanna $ledCopy = $led; 2923706646aSVishwanatha Subbanna print $fh "$led:\n"; 2933706646aSVishwanatha Subbanna print $fh " "; 2943706646aSVishwanatha Subbanna } 2953706646aSVishwanatha Subbanna print $fh " "; 2963706646aSVishwanatha Subbanna print $fh "$property:"; 2973706646aSVishwanatha Subbanna print $fh " $hashGroup{$group}{$led}{$property}\n"; 2983706646aSVishwanatha Subbanna } 2993706646aSVishwanatha Subbanna } 3003706646aSVishwanatha Subbanna } 301d0039437SVishwanatha Subbanna # If we need to hand create some of the groups, do so now. 302d0039437SVishwanatha Subbanna foreach my $name (@defaultGroup) 303d0039437SVishwanatha Subbanna { 304d0039437SVishwanatha Subbanna print $fh "$name:\n"; 305d0039437SVishwanatha Subbanna } 3063706646aSVishwanatha Subbanna close $fh; 3073706646aSVishwanatha Subbanna} 3083706646aSVishwanatha Subbanna 30978ae582bSGeorge Liusub generateJSONFile 31078ae582bSGeorge Liu{ 31178ae582bSGeorge Liu package LEDGroups; 31278ae582bSGeorge Liu use JSON; 31378ae582bSGeorge Liu my $JSON = JSON->new->utf8->pretty(1); 31478ae582bSGeorge Liu $JSON->convert_blessed(1); 31578ae582bSGeorge Liu 31678ae582bSGeorge Liu sub led 31778ae582bSGeorge Liu { 31878ae582bSGeorge Liu my $class = shift; 31978ae582bSGeorge Liu my $self = { 32078ae582bSGeorge Liu group => shift, 32178ae582bSGeorge Liu members => shift, 32278ae582bSGeorge Liu }; 32378ae582bSGeorge Liu bless $self, $class; 32478ae582bSGeorge Liu return $self; 32578ae582bSGeorge Liu } 32678ae582bSGeorge Liu 32778ae582bSGeorge Liu sub member 32878ae582bSGeorge Liu { 32978ae582bSGeorge Liu my $class = shift; 33078ae582bSGeorge Liu my $self = { 3311b1aa6e5SGeorge Liu Name => shift, 33278ae582bSGeorge Liu Action => shift, 33378ae582bSGeorge Liu DutyOn => shift, 33478ae582bSGeorge Liu Period => shift, 33578ae582bSGeorge Liu Priority => shift, 33678ae582bSGeorge Liu }; 33778ae582bSGeorge Liu bless $self, $class; 33878ae582bSGeorge Liu return $self; 33978ae582bSGeorge Liu } 34078ae582bSGeorge Liu 34178ae582bSGeorge Liu sub TO_JSON { 34278ae582bSGeorge Liu return { %{ shift() } }; 34378ae582bSGeorge Liu } 34478ae582bSGeorge Liu 34578ae582bSGeorge Liu my $fileName = $outputFile; 34678ae582bSGeorge Liu open(my $fh, '>', $fileName) or die "Could not open file '$fileName' $!"; 34778ae582bSGeorge Liu 34878ae582bSGeorge Liu my @leds = (); 34978ae582bSGeorge Liu foreach my $group (sort keys %hashGroup) 35078ae582bSGeorge Liu { 35178ae582bSGeorge Liu my @members = (); 35278ae582bSGeorge Liu foreach my $led (sort keys %{ $hashGroup{$group} }) 35378ae582bSGeorge Liu { 35478ae582bSGeorge Liu my $action; 35578ae582bSGeorge Liu my $dutyOn; 35678ae582bSGeorge Liu my $period; 35778ae582bSGeorge Liu my $priority; 35878ae582bSGeorge Liu 35978ae582bSGeorge Liu if (exists $hashGroup{$group}{$led}{Action}) 36078ae582bSGeorge Liu { 36178ae582bSGeorge Liu $action = $hashGroup{$group}{$led}{Action}; 36278ae582bSGeorge Liu $action = substr($action, 1, length($action) - 2); 36378ae582bSGeorge Liu } 36478ae582bSGeorge Liu 36578ae582bSGeorge Liu if (exists $hashGroup{$group}{$led}{DutyOn}) 36678ae582bSGeorge Liu { 36778ae582bSGeorge Liu $dutyOn = $hashGroup{$group}{$led}{DutyOn}; 36878ae582bSGeorge Liu } 36978ae582bSGeorge Liu 37078ae582bSGeorge Liu if (exists $hashGroup{$group}{$led}{Period}) 37178ae582bSGeorge Liu { 37278ae582bSGeorge Liu $period = $hashGroup{$group}{$led}{Period}; 37378ae582bSGeorge Liu } 37478ae582bSGeorge Liu 37578ae582bSGeorge Liu if (exists $hashGroup{$group}{$led}{Priority}) 37678ae582bSGeorge Liu { 37778ae582bSGeorge Liu $priority = $hashGroup{$group}{$led}{Priority}; 37878ae582bSGeorge Liu $priority = substr($priority, 1, length($priority) - 2); 37978ae582bSGeorge Liu } 38078ae582bSGeorge Liu 38178ae582bSGeorge Liu my $m = member LEDGroups($led, $action, $dutyOn, $period, $priority); 38278ae582bSGeorge Liu push @members, $m; 38378ae582bSGeorge Liu } 38478ae582bSGeorge Liu my $l = led LEDGroups($group, \@members); 38578ae582bSGeorge Liu push @leds, $l; 38678ae582bSGeorge Liu } 38778ae582bSGeorge Liu my %ledJson = ('leds' => \@leds); 38878ae582bSGeorge Liu my $json = $JSON->canonical(1)->encode(\%ledJson); 38978ae582bSGeorge Liu print $fh $json; 39078ae582bSGeorge Liu close $fh; 39178ae582bSGeorge Liu} 39278ae582bSGeorge Liu 3933706646aSVishwanatha Subbanna# Helper function to put debug statements. 3943706646aSVishwanatha Subbannasub printDebug 3953706646aSVishwanatha Subbanna{ 3963706646aSVishwanatha Subbanna my $str = shift; 3973706646aSVishwanatha Subbanna print "DEBUG: ", $str, "\n" if $debug; 3983706646aSVishwanatha Subbanna} 3993706646aSVishwanatha Subbanna 4003706646aSVishwanatha Subbanna# Usage 4013706646aSVishwanatha Subbannasub printUsage 4023706646aSVishwanatha Subbanna{ 4033706646aSVishwanatha Subbanna print " 4043706646aSVishwanatha Subbanna $0 -i [XML filename] -o [Output filename] [OPTIONS] 4053706646aSVishwanatha SubbannaOptions: 4063706646aSVishwanatha Subbanna -f = force output file creation even when errors 4073706646aSVishwanatha Subbanna -d = debug mode 4083706646aSVishwanatha Subbanna -v = verbose mode - for verbose o/p from Targets.pm 4093706646aSVishwanatha Subbanna 4103706646aSVishwanatha SubbannaPS: mrw::Targets can be found in https://github.com/open-power/serverwiz/ 4113706646aSVishwanatha Subbanna mrw::Inventory can be found in https://github.com/openbmc/phosphor-mrw-tools/ 4123706646aSVishwanatha Subbanna \n"; 4133706646aSVishwanatha Subbanna exit(1); 4143706646aSVishwanatha Subbanna} 4153706646aSVishwanatha Subbanna#------------------------------------END OF SUB----------------------- 416