# 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;