xcat-core/xCAT-server/lib/xcat/plugins/osdistro.pm

268 lines
5.5 KiB
Perl

# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
#-------------------------------------------------------
=head1
xCAT plugin package to handle osdistro management
Supported command:
rmosdistro->rmosdistro
=cut
#-------------------------------------------------------
package xCAT_plugin::osdistro;
use Sys::Hostname;
use xCAT::Table;
use xCAT::Utils;
use xCAT::MsgUtils;
use Getopt::Long;
use Data::Dumper;
#-------------------------------------------------------
=head3 handled_commands
Return list of commands handled by this plugin
=cut
#-------------------------------------------------------
sub handled_commands
{
return {
rmosdistro => "osdistro",
};
}
#-------------------------------------------------------
=head3 process_request
Process the command
=cut
#-------------------------------------------------------
sub process_request
{
my $request = shift;
my $callback = shift;
my $command = $request->{command}->[0];
my $args = $request->{arg};
my $envs = $request->{env};
my %rsp;
# do your processing here
# return info
if($command eq "rmosdistro")
{
&rmosdistro($request,$callback);
}
return;
}
#-------------------------------------------------------
=head3 getOSdistroref
check whether the specified osdistro is referenced
by any osimage. if yes, return the string of
osimage names, return undef otherwise
=cut
#-------------------------------------------------------
sub getOSdistroref
{
my $osimagetab=shift;
my $osdistroname=shift;
my $ret=();
unless($osimagetab)
{
return undef;
}
my @clause=();
push(@clause,"osdistroname==".$osdistroname);
my @result=$osimagetab->getAllAttribsWhere(\@clause,'imagename');
if(scalar @result)
{
foreach(@result)
{
$ret=$ret.$_->{'imagename'}.",";
}
$ret =~ s/,$//;
}
else
{
return undef;
}
return $ret;
}
#-------------------------------------------------------
=head3 rmosdistro
remove osdistro,including remove osdistro directory
and entry in osdistro table
=cut
#-------------------------------------------------------
sub rmosdistro
{
my $request = shift;
my $callback = shift;
my $all=undef;
my $force=undef;
my $help=undef;
my $osdistropath=undef;
#an array of all the osdistronames to remove
my @OSdistroListToDel=();
if ($request->{arg}) {
@ARGV = @{$request->{arg}};
}
GetOptions(
'h|help' => \$help,
'a|all' => \$all,
'f|force' => \$force,
);
if ($help) {
$callback->({info=>"rmosdistro [{-a|--all}] [-f|--force] [osdistroname] ...",errorcode=>[0]});
return;
}
unless($all)
{
unless(scalar @ARGV)
{
$callback->({info=>"please specify osdistroname to remove, or specify \"-a|--all\" to remove all osdistros ",errorcode=>[1]});
return;
}
#if any osdistro has been specified,push it into array
push(@OSdistroListToDel,@ARGV);
}
my $osdistrotab = xCAT::Table->new('osdistro',-create=>1);
unless($osdistrotab)
{
$callback->({error=>"rmosdistro: failed to open table 'osdistro'!",errorcode=>[1]});
return;
}
#if -a or --all is specified,push all the osdistronames to the array to delete
if($all)
{
my @result=$osdistrotab->getAllAttribs('osdistroname');
if(defined(@result) and scalar @result >0)
{
foreach(@result)
{
push(@OSdistroListToDel,$_->{'osdistroname'});
}
}
}
if(scalar @OSdistroListToDel)
{
#if -f|--force is not specified,need to open osimage table to check the reference of osdistro
my $osimagetab=undef;
unless($force)
{
$osimagetab=xCAT::Table->new('osimage');
unless($osimagetab)
{
$callback->({error=>"rmosdistro: failed to open table 'osimage'!",errorcode=>[1]});
$osdistrotab->close();
return;
}
}
foreach(@OSdistroListToDel)
{
#if -f|--force not specified,check the reference of osdistro,complain if the osdistro is referenced by some osimage
unless($force)
{
my $result=&getOSdistroref($osimagetab,$_);
if($result)
{
$callback->({error=>"rmosdistro: failed to remove $_, it is referenced by osimages:\n$result\nretry with -f option !",errorcode=>[1]});
next;
}
}
#get "dirpaths" attribute of osdistro to remove the directory, complain if failed to lookup the osdistroname
my %keyhash=('osdistroname' => $_,);
my $result=$osdistrotab->getAttribs(\%keyhash,'dirpaths');
unless($result)
{
$callback->({error=>"rmosdistro: $keyhash{osdistroname} not exist!",errorcode=>[1]});
next;
}
#remove the osdistro directories
if($result->{'dirpaths'})
{
$result->{'dirpaths'} =~ s/,/\ /g;
#$callback->({error=>"rmosdistro: remove $result->{'dirpaths'} directory!",errorcode=>[0]});
system("rm -rf $result->{'dirpaths'}");
if($? != 0)
{
$callback->({error=>"rmosdistro: failed to remove $keyhash{osdistroname} directory!",errorcode=>[1]});
next;
}
}
#remove the osdistro entry
$osdistrotab->delEntries(\%keyhash);
$osdistrotab->commit;
$callback->({info=>"rmosdistro: remove $_ success",errorcode=>[0]});
}
if($osimagetab)
{
$osimagetab->close;
}
}
$osdistrotab->close;
return;
}
1;