home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / sbin / evms_gather_info < prev    next >
Text File  |  2006-11-29  |  8KB  |  281 lines

  1. #!/usr/bin/perl
  2. #
  3. # (C) Copyright IBM Corp. 2004
  4. #
  5. # This program is free software;  you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 2 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY;  without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  13. # the GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program;  if not, write to the Free Software
  17. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18. #
  19. # Script to collect EVMS information
  20.  
  21. use strict;
  22. use warnings;
  23.  
  24. # run_evms_command
  25. # Use the EVMS CLI to run a command. Optionally return the screen output.
  26. #
  27. # Arguments:
  28. #    command: String containing a single command to run.
  29. #    output:  Reference of array to pass back command output (optional).
  30. sub run_evms_command
  31. {
  32.     my $command = $_[0];
  33.     my $rc_output = $_[1];  # Optional.
  34.     my @output;
  35.     my $rc;
  36.  
  37.     @output = `echo "$command" | evms -s 2>&1`;
  38.     $rc = $? >> 8;
  39.  
  40.     if (ref($rc_output)) {
  41.         @{$rc_output} = @output;
  42.     }
  43.  
  44.     return $rc;
  45. }
  46.  
  47.  
  48. # run_evms_commands
  49. # Use the EVMS CLI to run an array of commands. Optionally return the screen output.
  50. # Since the input can be potentially lengthy, use a file rather than passing the
  51. # commands on the command line.  The CLI's buffer is 4KB.  If the string of commands
  52. # goes beyond 4KB, commands will get lost.
  53. #
  54. # Arguments:
  55. #    commands: Reference to an array of single command strings.
  56. #    output:   Reference of array to pass back command output (optional).
  57. sub run_evms_commands
  58. {
  59.     my @commands = @{$_[0]};
  60.     my $rc_output = $_[1];  # Optional.
  61.     my $input_file = "gather_info.qry";
  62.     my @output;
  63.     my $rc;
  64.     my $i;
  65.  
  66.         open(OUTFILE, ">$input_file") or die "Can't open $input_file: $!";
  67.  
  68.     for ($i = 0; $i < @commands; $i++) {
  69.         print OUTFILE $commands[$i] . ":\n";
  70.     }
  71.     
  72.     close(OUTFILE);
  73.  
  74.     @output = `evms -f $input_file 2>&1`;
  75.     $rc = $? >> 8;
  76.  
  77.     if (ref($rc_output)) {
  78.         @{$rc_output} = @output;
  79.     }
  80.  
  81.     return $rc;
  82. }
  83.  
  84.  
  85. # compress_parents_and_children
  86. # Find the lines that begin with "--- Begin [parents|children" and replace
  87. # them with ["Parents:"|"Children:"].  Process the lines that follow until
  88. # a line with "--- End" is encountered.
  89. # A line that has "Name: <name>" gets compressed to just the name.
  90. # All other lines get removed from the array.
  91. #
  92. # Arguments:
  93. #    output: An array of output lines.
  94. sub compress_parents_and_children(@) {
  95.  
  96.     my @output = @_;
  97.  
  98.     my $i = 0;
  99.  
  100.     while ($i < @output) {
  101.         my $line = $output[$i];
  102.  
  103.         if ($line =~ /--- Begin/) {
  104.  
  105.             if ($output[$i] =~ /parents/) {
  106.                 $output[$i] = "Parents:\n";
  107.             } else {
  108.                 $output[$i] = "Children:\n";
  109.             }
  110.             $i++;
  111.  
  112.             for ($line = $output[$i]; !($line =~ /--- End/); $line = $output[$i]) {
  113.                 # Replace object name lines with just the object name.
  114.                 # Remove non-objet-name lines.
  115.                 if ($output[$i] =~ /Name:\s+(\S+)/) {
  116.                     $output[$i] = "  " . $1 . "\n";
  117.                     $i++;
  118.                 } else {
  119.                     # Remove the line.
  120.                     splice(@output, $i, 1);
  121.                 }
  122.             }
  123.             
  124.             # $output[$i] is the line that had the "--- End" marker.
  125.             # Replace it with an empty line.
  126.             $output[$i] = "\n";
  127.         }
  128.  
  129.         $i++;
  130.     }
  131.  
  132.     return @output;
  133. }
  134.  
  135.  
  136. MAIN:
  137. {
  138.     my $rc;
  139.     my $evms_cli = "";
  140.     my @output;
  141.     my @disks;
  142.     my @segments;
  143.     my @regions;
  144.     my @evms_objects;
  145.     my @containers;
  146.     my @volumes;
  147.     my @plugins;
  148.     my $i;
  149.     my @commands;
  150.  
  151.     # Make sure the CLI is accessible.
  152.     @output = `which evms`;
  153.     if (@output > 0) {
  154.         ($evms_cli) = grep(/^\/.*/, @output)
  155.     }
  156.     if ($evms_cli eq "") {
  157.         print "The EVMS Command Line Interface (evms) is not in the current path.\n";
  158.         print "Unable to get EVMS data.\n";
  159.         goto the_end;
  160.     }
  161.  
  162.     # Get a list of the objects, and volumes (things that can have parents and children) in the system.
  163.     $rc = run_evms_command("query:objects:query:volumes", \@output);
  164.     if ($rc) {
  165.         # Spit out whatever error messages the CLI said.
  166.         print @output;
  167.         goto the_end;
  168.     }
  169.  
  170.     # Extract the disks
  171.     @disks = grep(/Logical Disk Name:/, @output);
  172.     for ($i = 0; $i <= $#disks; $i++) {
  173.         # Remove the "Logical Disk Name:" from the line leaving only the disk name.
  174.         if ($disks[$i] =~ /Name:\s+(\S+)/) {
  175.             $disks[$i] = $1;
  176.         }
  177.     }
  178.  
  179.     # Extract the segments
  180.     @segments = grep(/Segment Name:/, @output);
  181.     for ($i = 0; $i <= $#segments; $i++) {
  182.         # Remove the "Segment Name" from the line leaving only the segment name.
  183.         if ($segments[$i] =~ /Name:\s+(\S+)/) {
  184.             $segments[$i] = $1;
  185.         }
  186.     }
  187.  
  188.     # Extract the regions
  189.     @regions = grep(/Region Name:/, @output);
  190.     for ($i = 0; $i <= $#regions; $i++) {
  191.         # Remove the "Region Name:" from the line leaving only the region name.
  192.         if ($regions[$i] =~ /Name:\s+(\S+)/) {
  193.             $regions[$i] = $1;
  194.         }
  195.     }
  196.  
  197.     # Extract the EVMS objects
  198.     @evms_objects = grep(/Object Name:/, @output);
  199.     for ($i = 0; $i <= $#evms_objects; $i++) {
  200.         # Remove the "Object Name:" from the line leaving only the EVMS object name.
  201.         if ($evms_objects[$i] =~ /Name:\s+(\S+)/) {
  202.             $evms_objects[$i] = $1;
  203.         }
  204.     }
  205.  
  206.     # Extract the Volumes
  207.     @volumes = grep(/Volume Name:/, @output);
  208.     for ($i = 0; $i <= $#volumes; $i++) {
  209.         # Remove the "Object Name:" from the line leaving only the volume name.
  210.         if ($volumes[$i] =~ /Name:\s+(\S+)/) {
  211.             $volumes[$i] = $1;
  212.         }
  213.     }
  214.  
  215.     # Build the list of query commands to send to the CLI.
  216.  
  217.     push(@commands, "query:plugins,lo");
  218.  
  219.     foreach my $disk (@disks) {
  220.         push(@commands, "query:disks,lo,disk=$disk");
  221.         push(@commands, "echo:\"--- Begin parents of $disk ---\"");
  222.         push(@commands, "query:parent,$disk");
  223.         push(@commands, "echo:\"--- End parents of $disk ---\"");
  224.         push(@commands, "echo:\"--- Begin children of $disk ---\"");
  225.         push(@commands, "query:children,$disk");
  226.         push(@commands, "echo:\"--- End children of $disk ---\"");
  227.     }
  228.  
  229.     foreach my $segment (@segments) {
  230.         push(@commands, "query:segments,lo,segment=$segment");
  231.         push(@commands, "echo:\"--- Begin parents of $segment ---\"");
  232.         push(@commands, "query:parent,$segment");
  233.         push(@commands, "echo:\"--- End parents of $segment ---\"");
  234.         push(@commands, "echo:\"--- Begin children of $segment ---\"");
  235.         push(@commands, "query:children,$segment");
  236.         push(@commands, "echo:\"--- End children of $segment ---\"");
  237.     }
  238.  
  239.     foreach my $region (@regions) {
  240.         push(@commands, "query:regions,lo,region=$region");
  241.         push(@commands, "echo:\"--- Begin parents of $region ---\"");
  242.         push(@commands, "query:parent,$region");
  243.         push(@commands, "echo:\"--- End parents of $region ---\"");
  244.         push(@commands, "echo:\"--- Begin children of $region ---\"");
  245.             push(@commands, "query:children,$region");
  246.         push(@commands, "echo:\"--- End children of $region ---\"");
  247.     }
  248.  
  249.     foreach my $evms_object (@evms_objects) {
  250.             push(@commands, "query:objects,lo,object=$evms_object");
  251.         push(@commands, "echo:\"--- Begin parents of $evms_object ---\"");
  252.         push(@commands, "query:parent,$evms_object");
  253.         push(@commands, "echo:\"--- End parents of $evms_object ---\"");
  254.         push(@commands, "echo:\"--- Begin children of $evms_object ---\"");
  255.         push(@commands, "query:children,$evms_object");
  256.         push(@commands, "echo:\"--- End children of $evms_object ---\"");
  257.     }
  258.     
  259.     push(@commands, "query:c,lo");
  260.     
  261.     foreach my $volume (@volumes) {
  262.         push(@commands, "query:volumes,lo,volume=$volume");
  263.         push(@commands, "echo:\"--- Begin children of $volume ---\"");
  264.         push(@commands, "query:children,$volume");
  265.         push(@commands, "echo:\"--- End children of $volume ---\"");
  266.     }
  267.  
  268.     $rc = run_evms_commands(\@commands, \@output);
  269.     if ($rc) {
  270.         print "Command set failed with error code $rc\n";
  271.         goto the_end;
  272.     }
  273.  
  274.     @output = compress_parents_and_children(@output);
  275.  
  276.     print @output;
  277.  
  278. the_end:
  279. }
  280.  
  281.