6adf22b30e
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;
|
|
|