mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-03 21:02:34 +00:00 
			
		
		
		
	git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@13771 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			420 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			420 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
#!/usr/bin/env perl -w
 | 
						|
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | 
						|
#####################################################
 | 
						|
#
 | 
						|
#  xCAT plugin package to handle commands that manage the xCAT os distro updates
 | 
						|
#
 | 
						|
#####################################################
 | 
						|
 | 
						|
package xCAT_plugin::osdistroupdate;
 | 
						|
 | 
						|
#use Data::Dumper;
 | 
						|
use Getopt::Long;
 | 
						|
use xCAT::MsgUtils;
 | 
						|
use xCAT::Utils;
 | 
						|
use strict;
 | 
						|
 | 
						|
# options can be bundled up like -vV
 | 
						|
Getopt::Long::Configure("bundling");
 | 
						|
$Getopt::Long::ignorecase = 0;
 | 
						|
 | 
						|
#------------------------------------------------------------------------------
 | 
						|
 | 
						|
=head1    osdistroupdate
 | 
						|
 | 
						|
This program module file supports the management of the xCAT os distro updates.
 | 
						|
 | 
						|
Supported xCAT OS distro updates functions:
 | 
						|
    1.Create os distro update from network 
 | 
						|
    2.Create os distro update from local
 | 
						|
    3.List the distro update on the management node
 | 
						|
    4.Delete the distro update     
 | 
						|
 | 
						|
Syntax:
 | 
						|
     osdistroupdate [-h|--help|-v|--version]
 | 
						|
     osdistroupdate -l [<osdistro-name>]
 | 
						|
     osdistroupdate -d <osdistroupdate-name>
 | 
						|
     osdistroupdate -c <osdistro-name> [-p <package directory>]
 | 
						|
 | 
						|
Options:
 | 
						|
     -h   Show the help message
 | 
						|
     -v   Show the version.
 | 
						|
     -l   List OS distro update with specified OS distro name, if no OS distro specified, 
 | 
						|
          all OS distro updates in system will be listed. The osdistro-name value will 
 | 
						|
          be <osver>-<arh>, such as rhels6.2-x86_64 .
 | 
						|
     -d   Delete an OS distro update in system
 | 
						|
     -c   Create an OS distro updates in system
 | 
						|
     -p   Specify local directory which contains packages downloaded from distro official site. This option is used to create OS update from local.
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#------------------------------------------------------------------------------
 | 
						|
 | 
						|
=head2  handled_commands
 | 
						|
 | 
						|
        Return a list of commands handled by this plugin
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
sub handled_commands
 | 
						|
{
 | 
						|
    return {
 | 
						|
            osdistroupdate => "osdistroupdate",
 | 
						|
            };
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
##########################################################################
 | 
						|
# Pre-process request from xCat daemon. 
 | 
						|
##########################################################################
 | 
						|
sub preprocess_request {
 | 
						|
 | 
						|
    my $req      = shift;
 | 
						|
    if ($req->{_xcatpreprocessed}->[0] == 1 ) { return [$req]; }
 | 
						|
    my $callback = shift;
 | 
						|
    my @result;
 | 
						|
 | 
						|
    # process the command line
 | 
						|
    my $rc = &parse_args($req, $callback);
 | 
						|
    if ($rc != 0)
 | 
						|
    {
 | 
						|
        if( $rc == 1) {
 | 
						|
           #version
 | 
						|
           return 0;
 | 
						|
        }
 | 
						|
	&osdistroupdate_usage($callback);
 | 
						|
	return -1;
 | 
						|
    }
 | 
						|
    
 | 
						|
    my $mncopy = {%$req};
 | 
						|
    push @result, $mncopy;
 | 
						|
 | 
						|
    #print Dumper(\@result);
 | 
						|
    return \@result;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
 | 
						|
=head2   process_request
 | 
						|
 | 
						|
        Check for xCAT command and call the appropriate subroutine.
 | 
						|
 | 
						|
        Arguments:
 | 
						|
 | 
						|
        Returns:
 | 
						|
                0 - OK
 | 
						|
                1 - error
 | 
						|
        Globals:
 | 
						|
 | 
						|
        Error:
 | 
						|
 | 
						|
        Example:
 | 
						|
 | 
						|
        Comments:
 | 
						|
=cut
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
sub process_request
 | 
						|
{
 | 
						|
 | 
						|
    my $request  = shift;
 | 
						|
    my $callback = shift;
 | 
						|
 | 
						|
    &osdistroupdate($request,$callback);
 | 
						|
}
 | 
						|
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
 | 
						|
=head2   parse_args
 | 
						|
 | 
						|
        Process the command line. Covers all four commands.
 | 
						|
 | 
						|
        Also - Process any input files provided on cmd line.
 | 
						|
 | 
						|
        Arguments:
 | 
						|
 | 
						|
        Returns:
 | 
						|
                0 - OK
 | 
						|
                1 - just return
 | 
						|
                2 - just print usage
 | 
						|
                3 - error
 | 
						|
        Globals:
 | 
						|
 | 
						|
        Error:
 | 
						|
 | 
						|
        Example:
 | 
						|
 | 
						|
        Comments:
 | 
						|
=cut
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
sub parse_args
 | 
						|
{
 | 
						|
    my $request = shift;
 | 
						|
    my $callback = shift; 
 | 
						|
    my $args = $request->{arg};
 | 
						|
    my $gotattrs = 0;
 | 
						|
    my %opt      =();
 | 
						|
 | 
						|
    if (defined(@{$args})) {
 | 
						|
        @ARGV = @{$args};
 | 
						|
    } else {
 | 
						|
        return 2;
 | 
						|
    }
 | 
						|
 | 
						|
    if (scalar(@ARGV) <= 0) {
 | 
						|
        return 2;
 | 
						|
    }
 | 
						|
 | 
						|
    # parse the options - include any option from all 4 cmds
 | 
						|
    Getopt::Long::Configure("no_pass_through");
 | 
						|
    if ( !GetOptions( \%opt, qw(h|help v|version l c=s d=s p=s ) )) {
 | 
						|
         return 2;
 | 
						|
    }
 | 
						|
 | 
						|
    if ( exists( $opt{v}) || exists( $opt{version} )) {
 | 
						|
         my $rsp = {};
 | 
						|
         $rsp->{data}->[0] = xCAT::Utils->Version();
 | 
						|
         $callback->($rsp);
 | 
						|
         return 1;
 | 
						|
    }
 | 
						|
 | 
						|
    if ( exists( $opt{h}) || exists( $opt{help})) {
 | 
						|
         return 2;
 | 
						|
    }
 | 
						|
 | 
						|
    if ( exists( $opt{l}) &&  exists( $opt{c}))  {
 | 
						|
         my $rsp;
 | 
						|
         $rsp->{data}->[0] = "The flags \'-l'\ and \'-c'\ cannot be used together.";
 | 
						|
         xCAT::MsgUtils->message("E", $rsp, $callback);
 | 
						|
         return 2; 
 | 
						|
    }
 | 
						|
 | 
						|
    if (  exists( $opt{l}) &&  exists( $opt{d})){
 | 
						|
         my $rsp;
 | 
						|
         $rsp->{data}->[0] = "The flags \'-l'\ and \'-d'\ cannot be used together.";
 | 
						|
         xCAT::MsgUtils->message("E", $rsp, $callback);
 | 
						|
         return 2; 
 | 
						|
    }
 | 
						|
 | 
						|
    if ( exists( $opt{c}) &&  exists( $opt{d}) ) {
 | 
						|
         my $rsp;
 | 
						|
         $rsp->{data}->[0] = "The flags \'-c'\ and \'-d'\ cannot be used together.";
 | 
						|
         xCAT::MsgUtils->message("E", $rsp, $callback);
 | 
						|
         return 2; 
 | 
						|
    }
 | 
						|
 | 
						|
    if ( exists( $opt{p}) &&  (exists( $opt{l}) || exists( $opt{d})) ) {
 | 
						|
         my $rsp;
 | 
						|
         $rsp->{data}->[0] = "The flags \'-p'\ only could be used with -c";
 | 
						|
         xCAT::MsgUtils->message("E", $rsp, $callback);
 | 
						|
         return 2; 
 | 
						|
    }
 | 
						|
 | 
						|
      
 | 
						|
    if(exists( $opt{l}) ) {
 | 
						|
        $opt{osdistroupdate_name} = $ARGV[0]; 
 | 
						|
    } 
 | 
						|
    
 | 
						|
    $request->{opt} = \%opt;    
 | 
						|
    
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
sub osdistroupdate
 | 
						|
{
 | 
						|
    my $request = shift; 
 | 
						|
    my $callback = shift;
 | 
						|
    my $opt = $request->{opt};
 | 
						|
    my $rsp_info;
 | 
						|
    my $rc;
 | 
						|
    my $result;
 | 
						|
    my $data;
 | 
						|
    my @attribs= qw(osdistroname dirpath downloadtime comments disable);
 | 
						|
 | 
						|
    # For list the os distro updates 
 | 
						|
    if( $opt->{l} ) {
 | 
						|
       $result = &list_updates($request, $callback);
 | 
						|
       $rc = shift(@$result);
 | 
						|
       $data = $result;
 | 
						|
       if( $rc != 0) { 
 | 
						|
           my $msg = join("\n", @$data); 
 | 
						|
           #foreach my $a (@$data)  {
 | 
						|
           #    push (@{$rsp_info->{data}->[$n]}, "$a");
 | 
						|
           #}
 | 
						|
           $rsp_info->{data}->[0] = $msg;  
 | 
						|
           $rsp_info->{errorcode}->[0] = $rc;
 | 
						|
           $callback->($rsp_info);
 | 
						|
           return ;
 | 
						|
       }
 | 
						|
 | 
						|
       #rc=0, success
 | 
						|
       foreach my $a (@$data) {
 | 
						|
            if( $a->{osupdatename} ) {
 | 
						|
               push (@{$rsp_info->{data}}, "osdistroupdate name: $a->{osupdatename}");
 | 
						|
            }     
 | 
						|
            foreach my $at ( @attribs ) {
 | 
						|
               if( defined( $a->{$at}) ) {
 | 
						|
                   push (@{$rsp_info->{data}}, "    $at=$a->{$at}");
 | 
						|
               }           
 | 
						|
            }     
 | 
						|
       }
 | 
						|
       if (defined($rsp_info->{data}) && scalar(@{$rsp_info->{data}}) > 0) {
 | 
						|
            xCAT::MsgUtils->message("I", $rsp_info, $callback);
 | 
						|
       }
 | 
						|
       return;
 | 
						|
    }
 | 
						|
    
 | 
						|
    #Create os distro updates
 | 
						|
    if( $opt->{c} ) {
 | 
						|
       $result = &create_updates($request, $callback);
 | 
						|
    }
 | 
						|
    #delete os distro updates
 | 
						|
    if( $opt->{d} ) {
 | 
						|
       $result = &delete_update($request, $callback);
 | 
						|
    }
 | 
						|
       
 | 
						|
    $rc = shift(@$result);
 | 
						|
    $data = $result;
 | 
						|
    my $msg = join("\n", @$data); 
 | 
						|
    $rsp_info->{data}->[0] = $msg;  
 | 
						|
    $rsp_info->{errorcode}->[0] = $rc;
 | 
						|
    $callback->($rsp_info);
 | 
						|
   
 | 
						|
    return ;
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
#example of list_updates. This should be replaced.
 | 
						|
sub list_updates
 | 
						|
{
 | 
						|
    my $request =shift;
 | 
						|
    my $callback=shift;
 | 
						|
    my @result;
 | 
						|
 | 
						|
    #my $rc = 1;
 | 
						|
    #push(@result, $rc); 
 | 
						|
    #push(@result, "msg1"); 
 | 
						|
    #push(@result, "msg2"); 
 | 
						|
    #push(@result, "msg3"); 
 | 
						|
    
 | 
						|
    my %h;
 | 
						|
    my $rc = 0;
 | 
						|
    push(@result, $rc);
 | 
						|
    %h = (
 | 
						|
          'osupdatename' => 'rhels6.2-x86_64-update12125',
 | 
						|
          'osdistroname' => 'rhels6.2-x86_64',
 | 
						|
          'dirpath' => '/install/osdistroupdates/rhels6.2-x86_64-20120228-update12125/',
 | 
						|
          'downloadtime' => '1330402626',
 | 
						|
          'comments' => undef,
 | 
						|
          'disable' => '0',
 | 
						|
          );
 | 
						|
 
 | 
						|
    push(@result, \%h);
 | 
						|
 | 
						|
    return \@result;
 | 
						|
}
 | 
						|
 | 
						|
#example of create_updates. This should be replaced.
 | 
						|
sub create_updates
 | 
						|
{
 | 
						|
    my $request =shift;
 | 
						|
    my $callback=shift;
 | 
						|
    my $opt=$request->{opt};
 | 
						|
    my $rsp_info;
 | 
						|
    my @result;
 | 
						|
 | 
						|
    push (@{$rsp_info->{data}}, "Starting... waiting...");
 | 
						|
   
 | 
						|
    xCAT::MsgUtils->message("I", $rsp_info, $callback);
 | 
						|
 | 
						|
    sleep(10);
 | 
						|
 
 | 
						|
    my $rc = 0;
 | 
						|
    push(@result, $rc); 
 | 
						|
    push(@result, "creating msg1"); 
 | 
						|
    push(@result, "creating msg2"); 
 | 
						|
    push(@result, "creating msg3"); 
 | 
						|
    push(@result, "done"); 
 | 
						|
   
 | 
						|
    return \@result;
 | 
						|
}
 | 
						|
 | 
						|
#example of delete_update. This should be replaced.
 | 
						|
sub delete_update
 | 
						|
{
 | 
						|
    my $request =shift;
 | 
						|
    my $callback=shift;
 | 
						|
    my $opt=$request->{opt};
 | 
						|
    my $rsp_info;
 | 
						|
    my @result;
 | 
						|
 | 
						|
    push (@{$rsp_info->{data}}, "Starting deleting... waiting...");
 | 
						|
   
 | 
						|
    xCAT::MsgUtils->message("I", $rsp_info, $callback);
 | 
						|
 | 
						|
    sleep(10);
 | 
						|
 
 | 
						|
    my $rc = 0;
 | 
						|
    push(@result, $rc); 
 | 
						|
    push(@result, "deleting msg1"); 
 | 
						|
    push(@result, "deleting msg2"); 
 | 
						|
    push(@result, "deleting msg3"); 
 | 
						|
    push(@result, "done"); 
 | 
						|
   
 | 
						|
    return \@result;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#----------------------------------------------------------------------------
 | 
						|
 | 
						|
=head3  osdistroupdate_usage
 | 
						|
 | 
						|
        Arguments:
 | 
						|
        Returns:
 | 
						|
        Globals:
 | 
						|
 | 
						|
        Error:
 | 
						|
 | 
						|
        Example:
 | 
						|
 | 
						|
        Comments:
 | 
						|
=cut
 | 
						|
 | 
						|
#-----------------------------------------------------------------------------
 | 
						|
 | 
						|
sub osdistroupdate_usage
 | 
						|
{
 | 
						|
    my $callback = shift;
 | 
						|
    my $rsp;
 | 
						|
    $rsp->{data}->[0] = "\nUsage: osdistroupdate - creating/deleting/listing os distro update\n";
 | 
						|
    $rsp->{data}->[1] = "  osdistroupdate  [-h | --help | -v | --version]";
 | 
						|
    $rsp->{data}->[2] =
 | 
						|
      "  osdistroupdate -l [<osdistro-name>]";
 | 
						|
    $rsp->{data}->[3] =
 | 
						|
      "  osdistroupdate -d <osdistroupdate-name>";
 | 
						|
    $rsp->{data}->[4] =
 | 
						|
      "  osdistroupdate -c <osdistro-name> [-p <package directory>]\n";
 | 
						|
    $rsp->{data}->[5] = "-h   Show the help message";
 | 
						|
    $rsp->{data}->[6] = "-v   Show the version.";
 | 
						|
    $rsp->{data}->[7] = "-l   List OS distro update with specified OS distro name, if no OS distro specified, all OS distro updates in system will be listed. The osdistro-name value will be <osver>-<arh>, such as rhels6.2-x86_64.";
 | 
						|
    $rsp->{data}->[8] = "-d   Delete an OS distro update in system";
 | 
						|
    $rsp->{data}->[8] = "-c   Create an OS distro updates in system";
 | 
						|
    $rsp->{data}->[8] = "-p   Specify local directory which contains packages downloaded from distro official site. This option is used to create OS update from local.";
 | 
						|
 | 
						|
    xCAT::MsgUtils->message("I", $rsp, $callback);
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
1;
 | 
						|
 |