mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 11:22:27 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			283 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			283 lines
		
	
	
		
			6.7 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;
 | |
| use xCAT::Yum;
 | |
| 
 | |
| #-------------------------------------------------------
 | |
| 
 | |
| =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 (@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', 'basename', 'majorversion', 'minorversion', 'arch');
 | |
|             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 repo template
 | |
|             my @ents     = xCAT::TableUtils->get_site_attribute("installdir");
 | |
|             my $site_ent = $ents[0];
 | |
|             my $installroot;
 | |
|             if (defined($site_ent))
 | |
|             {
 | |
|                 $installroot = $site_ent;
 | |
|             }
 | |
|             xCAT::Yum->remove_yumrepo($installroot, $result->{basename} . $result->{majorversion} . (defined($result->{minorversion}) ? '.' . $result->{minorversion} : $result->{minorversion}), $result->{arch});
 | |
| 
 | |
|             #remove the osdistro entry
 | |
|             $osdistrotab->delEntries(\%keyhash);
 | |
|             $osdistrotab->commit;
 | |
|             $callback->({ info => ["rmosdistro: remove $_ success"], errorcode => [0] })
 | |
| 
 | |
|         }
 | |
| 
 | |
|         if ($osimagetab)
 | |
|         {
 | |
|             $osimagetab->close;
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     $osdistrotab->close;
 | |
| 
 | |
|     return;
 | |
| }
 | |
| 
 | |
| 
 | |
| 1;
 |