git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@13676 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			263 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			263 lines
		
	
	
		
			5.2 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;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
 | 
						|
=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 %keyhash=();
 | 
						|
    my $distname=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,
 | 
						|
    		'n|name=s' => \$distname,
 | 
						|
		'f|force'  => \$force,  
 | 
						|
     );
 | 
						|
 | 
						|
    if ($help) {
 | 
						|
     		 $callback->({info=>"rmosdistro [{-n|--name}=osdistroname] [-f|--force]",errorcode=>[0]});
 | 
						|
     		 return;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    my $osdistrotab = xCAT::Table->new('osdistro',-create=>1);
 | 
						|
   	
 | 
						|
    unless($osdistrotab)
 | 
						|
    {
 | 
						|
       	$callback->({error=>"rmosdistro: failed to open table 'osdistro'!",errorcode=>[1]});
 | 
						|
       	return;
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
#if any osdistro has been specified,push it into array;otherwise push all osdistronames 
 | 
						|
    if($distname)
 | 
						|
    {
 | 
						|
	push(@OSdistroListToDel,$distname);
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
	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]});
 | 
						|
        	   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
 | 
						|
                $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;
 |