mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 11:22:27 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			287 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			287 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| #!/usr/bin/perl
 | |
| ###############################################################################
 | |
| # IBM(c) 2015 EPL license http://www.eclipse.org/legal/epl-v10.html
 | |
| ###############################################################################
 | |
| # COMPONENT: mkdummyimage
 | |
| #
 | |
| # This script creates a dummy image.
 | |
| ###############################################################################
 | |
| 
 | |
| use strict;
 | |
| use warnings;
 | |
| 
 | |
| use File::Basename;
 | |
| use File::Path;
 | |
| use File::Spec;
 | |
| use File::Temp;
 | |
| use Getopt::Long;
 | |
| use MIME::Base64;
 | |
| use Sys::Hostname;
 | |
| use Socket;
 | |
| 
 | |
| my $version = "1.0";
 | |
| 
 | |
| my $defaultName = 'dummy.img';  # Default image file name
 | |
| my $dest = '';                  # Target destination (filespec)
 | |
| my $displayHelp = 0;            # Display help information
 | |
| my $eckdImage = 0;              # ECKD image is wanted
 | |
| my $fbaImage = 0;               # FBA image is wanted
 | |
| my $remoteHost = '';            # Remote host transfer information
 | |
| my $remoteUser = '';            # Remote user transfer information
 | |
| my $verbose = 0;                # Verbose flag - 0: quiet, 1: verbose
 | |
| my $versionOpt = 0;             # Show version information flag
 | |
| 
 | |
| # set the usage message
 | |
| my $usage_string = "Usage:\n
 | |
|     $0 [ --eckd | --fba ] [ -V | --verbose ]
 | |
|        [ -d | --destination <dest> ] [-R | --remotehost <host> ]\n
 | |
|     or\n
 | |
|     $0 -v | --version\n
 | |
|     or\n
 | |
|     $0 -h | --help\n
 | |
|     The following options are supported:\n
 | |
|       -d | --destination <dest>
 | |
|                           File specification of the image file to be created.
 | |
|                           Either the filename only or a fully qualified name.
 | |
|                           If the destination is within the xCAT MN then
 | |
|                           it must be within the directory specified by
 | |
|                           the installdir property in the xCAT site table.
 | |
|                           The default file name is $defaultName.\n
 | |
|       --eckd              Create an empty ECKD disk image.  This is the
 | |
|                           default image type if neither --eckd or --fba
 | |
|                           is specifed.\n
 | |
|       --fba               Create an empty FBA disk image\n
 | |
|       -h | --help         Display help information\n
 | |
|       -R | --remotehost <host>
 | |
|                           Indicates that the destination specified on the
 | |
|                           command invocation is the file specification on a
 | |
|                           host other than the management node.
 | |
|                           The 'host' operand is the IP address or DNS host
 | |
|                           name of the target server.  A user may be specified
 | |
|                           in a similar way as it is specified with the SCP
 | |
|                           command using the format 'user\@host' where 'user'
 | |
|                           is the name of the user on the remote system and
 | |
|                           'host' operand is as previously stated.  The image
 | |
|                           is created in the directory specified by the
 | |
|                           tmpdir property in the site table and then moved
 | |
|                           to the remote host using SCP.  After moving the
 | |
|                           image off the xCAT MN, the image is removed
 | |
|                           from the xCAT MN. Prior to specifying the command,
 | |
|                           the keystore on the remote host must be set up with
 | |
|                           the public key of the xCAT MN.\n
 | |
|       -v | --version      Display the version of this script.\n
 | |
|       -V | --verbose      Display verbose processing messages.\n";
 | |
| 
 | |
| 
 | |
| #-------------------------------------------------------
 | |
| 
 | |
| =head3   createImage
 | |
| 
 | |
|     Description : Create the dummy image file.
 | |
|     Arguments   : None
 | |
|     Returns     : 0 - No error
 | |
|                   non-zero - Error detected.
 | |
|     Example     : $rc = createImage();
 | |
| 
 | |
| =cut
 | |
| 
 | |
| #-------------------------------------------------------
 | |
| sub createImage{
 | |
|     my $rc = 0;
 | |
|     my $buildDir = '';
 | |
|     my $header;
 | |
| 
 | |
|     # Create a temporary directory in which to create the image.
 | |
|     my $tmpDir = `/opt/xcat/sbin/tabdump site| grep '^"tmpdir",' | sed s/'^"tmpdir","'//g| sed s/'".*'//g`;
 | |
|     chomp $tmpDir;
 | |
|     if ( $tmpDir eq '' ) {
 | |
|         print "Error: The 'tmpdir' value is missing from the site table.\n";
 | |
|         $rc = 11;
 | |
|         goto FINISH_createImage;
 | |
|     }
 | |
|     $buildDir = mkdtemp( "$tmpDir/image.$$.XXXXXX" );
 | |
| 
 | |
|     # Create the image
 | |
|     my $imageFile = $defaultName;
 | |
|     open( my $fh, '>', "$buildDir/$imageFile" ) or die "Could not open file '$buildDir/$imageFile'";
 | |
|     if ( $verbose ) {
 | |
|         print "Creating the image in $buildDir as $imageFile.\n";
 | |
|     }
 | |
| 
 | |
|     if ( $eckdImage ) {
 | |
|         $header = "xCAT CKD Disk Image:";
 | |
|         $header = "$header           0 CYL";
 | |
|     }
 | |
|     elsif ( $fbaImage ) {
 | |
|         $header = "xCAT FBA Disk Image:";
 | |
|         $header = "$header           0 BLK";
 | |
|     }
 | |
|     $header = "$header HLen: 0055";    # Header size increased by x from 0055
 | |
|     $header = "$header GZIP: 0";
 | |
|     printf $fh "%-512s", "$header";
 | |
|     close( $fh );
 | |
| 
 | |
|     # Move the image to the target location.
 | |
|     if ( $remoteHost ne '' ) {
 | |
|         # Do a remote transfer
 | |
|         my $remoteTarget = $remoteHost . ':' . $dest;
 | |
|         if ( $remoteUser ne '' ) {
 | |
|             $remoteTarget = "$remoteUser\@$remoteTarget";
 | |
|         }
 | |
|         my $scpVerbose = '';
 | |
|         if ( $verbose ) {
 | |
|             print "Moving the image $imageFile to the remote system $remoteHost as $dest.\n";
 | |
|             $scpVerbose = '-v'
 | |
|         }
 | |
|         $rc = system( "/usr/bin/scp $scpVerbose -B $buildDir/$imageFile $remoteTarget" );
 | |
|         if ( $rc ) {
 | |
|             $rc = $rc >> 8;
 | |
|             print "Error: Unable to copy the image $buildDir/$imageFile to the remote host: $remoteHost, rc: $rc\n";
 | |
|             $rc = 30;
 | |
|             goto FINISH_createImage;
 | |
|         }
 | |
|     } else {
 | |
|         # Move the file to a local directory
 | |
|         $rc = system( "cp $buildDir/$imageFile $dest" );
 | |
|         if ( $rc ) {
 | |
|             $rc = $rc >> 8;
 | |
|             print "Error: Unable to copy the image $buildDir/$imageFile to the destination: $dest, rc: $rc\n";
 | |
|             $rc = 40;
 | |
|             goto FINISH_createImage;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if ( $remoteHost ne '' ) {
 | |
|         print "Image created on $remoteHost: $dest\n";
 | |
|     } else {
 | |
|         print "Image created: $dest\n";
 | |
|     }
 | |
| 
 | |
| FINISH_createImage:
 | |
|     if ( -d $buildDir ) {
 | |
|         rmtree $buildDir;
 | |
|     }
 | |
|     return $rc;
 | |
| }
 | |
| 
 | |
| 
 | |
| #-------------------------------------------------------
 | |
| 
 | |
| =head3   showHelp
 | |
| 
 | |
|     Description : Show the help inforamtion.
 | |
|     Arguments   : None.
 | |
|     Returns     : None.
 | |
|     Example     : showHelp();
 | |
| 
 | |
| =cut
 | |
| 
 | |
| #-------------------------------------------------------
 | |
| sub showHelp{
 | |
|     print "$0 prepares a special image file that contains no disk\ncontents.\n\n";
 | |
|     print $usage_string;
 | |
|     return;
 | |
| }
 | |
| 
 | |
| 
 | |
| #*****************************************************************************
 | |
| # Main routine
 | |
| #*****************************************************************************
 | |
| my $rc = 0;
 | |
| my $out;
 | |
| 
 | |
| # Parse the arguments
 | |
| $Getopt::Long::ignorecase = 0;
 | |
| Getopt::Long::Configure( "bundling" );
 | |
| if (!GetOptions(
 | |
|                  'eckd'            => \$eckdImage,
 | |
|                  'd|destination=s' => \$dest,
 | |
|                  'fba'             => \$fbaImage,
 | |
|                  'h|help'          => \$displayHelp,
 | |
|                  'R|remotehost=s'  => \$remoteHost,
 | |
|                  'v|version'       => \$versionOpt,
 | |
|                  'V|verbose'       => \$verbose )) {
 | |
|     print $usage_string;
 | |
|     goto FINISH_main;
 | |
| }
 | |
| 
 | |
| if ( $versionOpt ) {
 | |
|     print "Version: $version\n";
 | |
| }
 | |
| 
 | |
| if ( $displayHelp ) {
 | |
|     showHelp();
 | |
| }
 | |
| 
 | |
| if ( $displayHelp or $versionOpt ) {
 | |
|     goto FINISH_main;
 | |
| }
 | |
| 
 | |
| if ( !$eckdImage and !$fbaImage ) {
 | |
|     $eckdImage = 1;
 | |
| }
 | |
| 
 | |
| if ( $remoteHost ne '' ) {
 | |
|     $remoteHost =~ s/^\s+|\s+$//g;         # trim blanks from both ends of the value
 | |
|     my $spaceCnt = scalar( () = $remoteHost =~ /\s+/g );
 | |
|     if ( $spaceCnt != 0 ) {
 | |
|         print "Error: Remote host value is not a single word.\n";
 | |
|         $rc = 1;
 | |
|         goto FINISH_main;
 | |
|     }
 | |
|     if ( $remoteHost =~ /@/ ) {
 | |
|         my @parts = split( /@/, $remoteHost );
 | |
|         if ( substr( $remoteHost, -1) eq '@' or
 | |
|              @parts > 2 or
 | |
|              !defined $parts[0] or $parts[0] eq '' or
 | |
|              !defined $parts[1] or $parts[1] eq '' ) {
 | |
|             print "Error: Remote host value is not valid.\n" .
 | |
|                   "       It should be in the form of 'hostname' or 'user\@hostname'.\n";
 | |
|             $rc = 2;
 | |
|             goto FINISH_main;
 | |
|         }
 | |
|         $remoteUser = $parts[0];
 | |
|         $remoteHost = $parts[1];
 | |
|     } else {
 | |
|         $remoteUser = 'root';
 | |
|     }
 | |
| }
 | |
| 
 | |
| # Determine the destination and make certain it is valid.
 | |
| my $installDir = `/opt/xcat/sbin/tabdump site| grep '^"installdir",' | sed s/'^"installdir","'//g| sed s/'".*'//g`;
 | |
| chomp $installDir;
 | |
| if ( $installDir eq '' ) {
 | |
|     print "Error: The 'installDir' value is missing from the site table.\n";
 | |
|     $rc = 10;
 | |
|     goto FINISH_main;
 | |
| }
 | |
| 
 | |
| if ( $dest eq '' ){
 | |
|     # Set default destination for either a local or remote location.
 | |
|     if ( $remoteHost eq '' ) {
 | |
|         $dest = "$installDir/$defaultName";
 | |
|     } else {
 | |
|         $dest = "$defaultName";
 | |
|     }
 | |
| } else {
 | |
|     # Can only verify local destination here.  SCP will verify the remote destination.
 | |
|     if ( $remoteHost eq '' ) {
 | |
|         if ( $dest !~ /\// ) {
 | |
|             $dest = "$installDir/$dest";
 | |
|         } else {
 | |
|             if ( $dest !~ /^$installDir/ ) {
 | |
|                 print "Error: The destination is not within the install directory specified in the site table.\n";
 | |
|                 $rc = 20;
 | |
|                 goto FINISH_main;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| # Create the image file.
 | |
| createImage();
 | |
| 
 | |
| FINISH_main:
 | |
| exit $rc;
 | |
| 
 |