From 06a30a232281bfb2d17c99bad604d62f2975eb7c Mon Sep 17 00:00:00 2001 From: wanghuaz Date: Wed, 10 Oct 2012 12:26:06 +0000 Subject: [PATCH] Code commit for kit support and several updates according to latest mini-design git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@13970 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/xcat/plugins/kit.pm | 663 +++++++++++++++++++++++++--- 1 file changed, 595 insertions(+), 68 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/kit.pm b/xCAT-server/lib/xcat/plugins/kit.pm index d23dc4842..b02d3b9a9 100644 --- a/xCAT-server/lib/xcat/plugins/kit.pm +++ b/xCAT-server/lib/xcat/plugins/kit.pm @@ -61,13 +61,13 @@ sub process_request my $command = $request->{command}->[0]; if ($command eq "addkit"){ - return addkit($request, $callback); + return addkit($request, $callback); } elsif ($command eq "rmkit"){ - return rmkit($request, $callback); + return rmkit($request, $callback); } elsif ($command eq "addkitcomp"){ return addkitcomp($request, $callback); } elsif ($command eq "rmkitcomp"){ - return rmkitcomp($request, $callback); + return rmkitcomp($request, $callback); } else{ $callback->({error=>["Error: $command not found in this module."],errorcode=>[1]}); #return (1, "$command not found); @@ -274,8 +274,9 @@ sub assign_to_osimage my $callback = shift; my $tabs = shift; - (my $kitcomptable) = $tabs->{kitcomponent}->getAttribs({kitcompname=> $kitcomp}, 'kitname', 'kitreponame', 'basename', 'kitpkgdeps', 'exlist', 'postbootscripts'); + (my $kitcomptable) = $tabs->{kitcomponent}->getAttribs({kitcompname=> $kitcomp}, 'kitname', 'kitreponame', 'basename', 'kitpkgdeps', 'exlist', 'postbootscripts', 'driverpacks'); (my $osimagetable) = $tabs->{osimage}->getAttribs({imagename=> $osimage}, 'postbootscripts', 'kitcomponents'); + (my $linuximagetable) = $tabs->{linuximage}->getAttribs({imagename=> $osimage}, 'exlist', 'otherpkglist', 'otherpkgdir', 'driverupdatesrc'); # Adding postbootscrits to osimage.postbootscripts if ( $kitcomptable and $kitcomptable->{postbootscripts} ){ @@ -299,8 +300,6 @@ sub assign_to_osimage } } - (my $linuximagetable) = $tabs->{linuximage}->getAttribs({imagename=> $osimage}, 'exlist', 'otherpkglist', 'otherpkgdir'); - # Adding kit component's repodir to osimage.otherpkgdir if ( $kitcomptable and $kitcomptable->{kitreponame} ) { @@ -347,21 +346,21 @@ sub assign_to_osimage # Adding kit component exlist file to KIT_COMPONENTS.exlist file - mkpath("$installdir/kits/custom/$osimage/"); - if ( -e "$installdir/kits/custom/$osimage/KIT_COMPONENTS.exlist" ) { - if (open(EXLIST, "<", "$installdir/kits/custom/$osimage/KIT_COMPONENTS.exlist")) { + mkpath("$installdir/osimages/$osimage/kits/"); + if ( -e "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.exlist" ) { + if (open(EXLIST, "<", "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.exlist")) { @lines = ; close(EXLIST); if($::VERBOSE){ - $callback->({data=>["\nReading kit component exlist file $installdir/kits/custom/$osimage/KIT_COMPONENTS.exlist\n"]}); + $callback->({data=>["\nReading kit component exlist file $installdir/osimages/$osimage/kits/KIT_COMPONENTS.exlist\n"]}); } } else { - $callback->({error => ["Could not open kit component exlist file $installdir/kits/custom/$osimage/KIT_COMPONENTS.exlist"],errorcode=>[1]}); + $callback->({error => ["Could not open kit component exlist file $installdir/osimages/$osimage/kits/KIT_COMPONENTS.exlist"],errorcode=>[1]}); return 1; } } unless ( grep(/^#INCLUDE:$kitdir\/other_files\/$exlistfile#$/ , @lines) ) { - if (open(NEWEXLIST, ">>", "$installdir/kits/custom/$osimage/KIT_COMPONENTS.exlist")) { + if (open(NEWEXLIST, ">>", "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.exlist")) { print NEWEXLIST "#INCLUDE:$kitdir/other_files/$exlistfile#\n"; close(NEWEXLIST); @@ -374,16 +373,16 @@ sub assign_to_osimage my $match = 0; my @exlists= split ',', $linuximagetable->{exlist}; foreach my $exlist ( @exlists ) { - if ( $exlist =~ /^$installdir\/kits\/custom\/$osimage\/KIT_COMPONENTS.exlist$/ ) { + if ( $exlist =~ /^$installdir\/osimages\/$osimage\/kits\/KIT_COMPONENTS.exlist$/ ) { $match = 1; last; } } unless ( $match ) { - $linuximagetable->{exlist} = $linuximagetable->{exlist} . ',' . "$installdir/kits/custom/$osimage/KIT_COMPONENTS.exlist"; + $linuximagetable->{exlist} = $linuximagetable->{exlist} . ',' . "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.exlist"; } } else { - $linuximagetable->{exlist} = "$installdir/kits/custom/$osimage/KIT_COMPONENTS.exlist"; + $linuximagetable->{exlist} = "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.exlist"; } } @@ -411,16 +410,16 @@ sub assign_to_osimage # Creating kit deployparams file my @lines; - mkpath("$installdir/kits/custom/$osimage/"); - if ( -e "$installdir/kits/custom/$osimage/KIT_DEPLOY_PARAMS.otherpkgs.pkglist" ) { - if (open(DEPLOYPARAM, "<", "$installdir/kits/custom/$osimage/KIT_DEPLOY_PARAMS.otherpkgs.pkglist")) { + mkpath("$installdir/osimages/$osimage/kits/"); + if ( -e "$installdir/osimages/$osimage/kits/KIT_DEPLOY_PARAMS.otherpkgs.pkglist" ) { + if (open(DEPLOYPARAM, "<", "$installdir/osimages/$osimage/kits/KIT_DEPLOY_PARAMS.otherpkgs.pkglist")) { @lines = ; close(DEPLOYPARAM); if($::VERBOSE){ - $callback->({data=>["\nReading kit deployparams file $installdir/kits/custom/$osimage/KIT_DEPLOY_PARAMS.otherpkgs.pkglist\n"]}); + $callback->({data=>["\nReading kit deployparams file $installdir/osimages/$osimage/kits/KIT_DEPLOY_PARAMS.otherpkgs.pkglist\n"]}); } } else { - $callback->({error => ["Could not open kit deployparams file $installdir/kits/custom/$osimage/KIT_DEPLOY_PARAMS.otherpkgs.pkglist"],errorcode=>[1]}); + $callback->({error => ["Could not open kit deployparams file $installdir/osimages/$osimage/kits/KIT_DEPLOY_PARAMS.otherpkgs.pkglist"],errorcode=>[1]}); return 1; } } @@ -442,7 +441,7 @@ sub assign_to_osimage } # Write the missing lines to kit deployparams file - if (open(NEWDEPLOYPARAM, ">>", "$installdir/kits/custom/$osimage/KIT_DEPLOY_PARAMS.otherpkgs.pkglist")) { + if (open(NEWDEPLOYPARAM, ">>", "$installdir/osimages/$osimage/kits/KIT_DEPLOY_PARAMS.otherpkgs.pkglist")) { print NEWDEPLOYPARAM @l; close(NEWDEPLOYPARAM); } @@ -453,16 +452,16 @@ sub assign_to_osimage my $match = 0; my @otherpkglists= split ',', $linuximagetable->{otherpkglist}; foreach my $otherpkglist ( @otherpkglists ) { - if ( $otherpkglist =~ /^$installdir\/kits\/custom\/$osimage\/KIT_DEPLOY_PARAMS.otherpkgs.pkglist$/ ) { + if ( $otherpkglist =~ /^$installdir\/osimages\/$osimage\/kits\/KIT_DEPLOY_PARAMS.otherpkgs.pkglist$/ ) { $match = 1; last; } } unless ( $match ) { - $linuximagetable->{otherpkglist} = $linuximagetable->{otherpkglist} . ',' . "$installdir/kits/custom/$osimage/KIT_DEPLOY_PARAMS.otherpkgs.pkglist"; + $linuximagetable->{otherpkglist} = $linuximagetable->{otherpkglist} . ',' . "$installdir/osimages/$osimage/kits/KIT_DEPLOY_PARAMS.otherpkgs.pkglist"; } } else { - $linuximagetable->{otherpkglist} = "$installdir/kits/custom/$osimage/KIT_DEPLOY_PARAMS.otherpkgs.pkglist"; + $linuximagetable->{otherpkglist} = "$installdir/osimages/$osimage/kits/KIT_DEPLOY_PARAMS.otherpkgs.pkglist"; } } @@ -475,21 +474,21 @@ sub assign_to_osimage my $basename = $kitcomptable->{basename}; # Adding kit component basename to KIT_COMPONENTS.otherpkgs.pkglist file - mkpath("$installdir/kits/custom/$osimage/"); - if ( -e "$installdir/kits/custom/$osimage/KIT_COMPONENTS.otherpkgs.pkglist" ) { - if (open(OTHERPKGLIST, "<", "$installdir/kits/custom/$osimage/KIT_COMPONENTS.otherpkgs.pkglist")) { + mkpath("$installdir/osimages/$osimage/kits"); + if ( -e "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.otherpkgs.pkglist" ) { + if (open(OTHERPKGLIST, "<", "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.otherpkgs.pkglist")) { @lines = ; close(OTHERPKGLIST); if($::VERBOSE){ - $callback->({data=>["\nReading kit component otherpkg file $installdir/kits/custom/$osimage/KIT_COMPONENTS.otherpkgs.pkglist\n"]}); + $callback->({data=>["\nReading kit component otherpkg file $installdir/osimages/$osimage/kits/KIT_COMPONENTS.otherpkgs.pkglist\n"]}); } } else { - $callback->({error => ["Could not open kit component otherpkg file $installdir/kits/custom/$osimage/KIT_COMPONENTS.otherpkgs.pkglist"],errorcode=>[1]}); + $callback->({error => ["Could not open kit component otherpkg file $installdir/osimages/$osimage/kits/KIT_COMPONENTS.otherpkgs.pkglist"],errorcode=>[1]}); return 1; } } unless ( grep(/^$basename$/, @lines) ) { - if (open(NEWOTHERPKGLIST, ">>", "$installdir/kits/custom/$osimage/KIT_COMPONENTS.otherpkgs.pkglist")) { + if (open(NEWOTHERPKGLIST, ">>", "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.otherpkgs.pkglist")) { print NEWOTHERPKGLIST "$basename\n"; close(NEWOTHERPKGLIST); @@ -502,69 +501,65 @@ sub assign_to_osimage my $match = 0; my @otherpkglists= split ',', $linuximagetable->{otherpkglist}; foreach my $otherpkglist ( @otherpkglists ) { - if ( $otherpkglist =~ /^$installdir\/kits\/custom\/$osimage\/KIT_COMPONENTS.otherpkgs.pkglist$/ ) { + if ( $otherpkglist =~ /^$installdir\/osimages\/$osimage\/kits\/KIT_COMPONENTS.otherpkgs.pkglist$/ ) { $match = 1; last; } } unless ( $match ) { - $linuximagetable->{otherpkglist} = $linuximagetable->{otherpkglist} . ',' . "$installdir/kits/custom/$osimage/KIT_COMPONENTS.otherpkgs.pkglist"; + $linuximagetable->{otherpkglist} = $linuximagetable->{otherpkglist} . ',' . "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.otherpkgs.pkglist"; } } else { - $linuximagetable->{otherpkglist} = "$installdir/kits/custom/$osimage/KIT_COMPONENTS.otherpkgs.pkglist"; + $linuximagetable->{otherpkglist} = "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.otherpkgs.pkglist"; } } # Remove this component basename and pkgnames from KIT_RMPKGS.otherpkg.pkglist + my @lines = (); + my @kitpkgdeps = (); + my @l = (); if ( $kitcomptable->{kitpkgdeps} ) { - my @lines; - if ( -e "$installdir/kits/custom/$osimage/KIT_RMPKGS.otherpkgs.pkglist" ) { - if (open(RMOTHERPKGLIST, "<", "$installdir/kits/custom/$osimage/KIT_RMPKGS.otherpkgs.pkglist")) { + if ( -e "$installdir/osimages/$osimage/kits/KIT_RMPKGS.otherpkgs.pkglist" ) { + if (open(RMOTHERPKGLIST, "<", "$installdir/osimages/$osimage/kits/KIT_RMPKGS.otherpkgs.pkglist")) { @lines = ; close(RMOTHERPKGLIST); if($::VERBOSE){ - $callback->({data=>["\nReading kit component rmpkgs file $installdir/kits/custom/$osimage/KIT_RMPKGS.otherpkgs.pkglist\n"]}); + $callback->({data=>["\nReading kit component rmpkgs file $installdir/osimages/$osimage/kits/KIT_RMPKGS.otherpkgs.pkglist\n"]}); } } else { - $callback->({error => ["Could not open kit component rmpkgs file $installdir/kits/custom/$osimage/KIT_RMPKGS.otherpkgs.pkglist"],errorcode=>[1]}); + $callback->({error => ["Could not open kit component rmpkgs file $installdir/osimages/$osimage/kits/KIT_RMPKGS.otherpkgs.pkglist"],errorcode=>[1]}); return 1; } } - my @l; - my @kitpkgdeps = split ',', $kitcomptable->{kitpkgdeps}; - my $changed = 0; - foreach my $line ( @lines ) { - chomp $line; - my $matched = 0; - foreach my $kitpkgdep ( @kitpkgdeps ) { - if ( $line =~ /^-$kitpkgdep$/ ) { - $matched = 1; - $changed = 1; - last; - } - } + @kitpkgdeps = split ',', $kitcomptable->{kitpkgdeps}; - if ( $line =~ /^-$basename$/ ) { + } + + push @kitpkgdeps, $basename; + + my $changed = 0; + foreach my $line ( @lines ) { + chomp $line; + my $matched = 0; + foreach my $kitpkgdep ( @kitpkgdeps ) { + if ( $line =~ /^-$kitpkgdep$/ ) { $matched = 1; $changed = 1; - } - - unless ( $matched ) { - push @l, "$line\n"; + last; } } - - if ( scalar(@l) and $changed ) { - if (open(RMPKGLIST, ">", "$installdir/kits/custom/$osimage/KIT_RMPKGS.otherpkgs.pkglist")) { - print RMPKGLIST @l; - close(RMPKGLIST); - } + unless ( $matched ) { + push @l, "$line\n"; + } + } + + if ( $changed ) { + if (open(RMPKGLIST, ">", "$installdir/osimages/$osimage/kits/KIT_RMPKGS.otherpkgs.pkglist")) { + print RMPKGLIST @l; + close(RMPKGLIST); } - } else { - $callback->({error => ["Could not open kit component table and read basename for kit component $kitcomp"],errorcode=>[1]}); - return 1; } } else { @@ -572,7 +567,45 @@ sub assign_to_osimage return 1; } - #TODO: adding driverpacks + # Now writing kit component to osimage.kitcomponents + if($::VERBOSE){ + $callback->({data=>["\nAdding this kitcomponent to osimage.kitcomponents\n"]}); + } + if ( $osimagetable ) { + if ( $osimagetable->{kitcomponents} ){ + $osimagetable->{kitcomponents} = join( ',', $osimagetable->{kitcomponents}, $kitcomp); + } else { + $osimagetable->{kitcomponents} = $kitcomp; + } + } + + # Adding driverpacks + + if ( $linuximagetable and $linuximagetable->{driverupdatesrc} ) { + if ( $kitcomptable and $kitcomptable->{driverpacks} ) { + my @driverpacks = split ',', $kitcomptable->{driverpacks}; + my @driverupdatesrcs = split ',', $linuximagetable->{driverupdatesrc}; + + my @newdriverupdatesrcs = @driverupdatesrcs; + + foreach my $driverpack ( @driverpacks ) { + my $matched = 0; + foreach my $driverupdatesrc ( @driverupdatesrcs ) { + if ( $driverpack eq $driverupdatesrc ) { + $matched = 1; + last; + } + } + + unless ( $matched ) { + push @newdriverupdatesrcs, $driverpack; + } + } + + my $newdriverupdatesrc = join ',', @newdriverupdatesrcs; + $linuximagetable->{driverupdatesrc} = $newdriverupdatesrc; + } + } # Write linuximage table with all the above udpates. @@ -1284,7 +1317,7 @@ sub addkitcomp # Check if this component is existing in osimage.kitcomponents foreach my $oskitcomp ( @oskitcomps ) { if ( $kitcomp eq $oskitcomp ) { - $callback->({data=>["kit component $kitcomp is already in osimage $osimage"]}); + $callback->({data=>["$kitcomp kit component is already in osimage $osimage"]}); $catched = 1; last; } @@ -1343,7 +1376,501 @@ sub addkitcomp #------------------------------------------------------- sub rmkitcomp { - + + my $request = shift; + my $callback = shift; + my $kitdir; + my $rc; + + my $xusage = sub { + my %rsp; + push@{ $rsp{data} }, "rmkitcomp: remove kit component from osimage"; + push@{ $rsp{data} }, "Usage: "; + push@{ $rsp{data} }, "\trmkitcomp [-h|--help]"; + push@{ $rsp{data} }, "\trmkitcomp [-u|--uninstall] [-f|--force] [-V|--verbose] -i "; + $callback->(\%rsp); + }; + + unless(defined($request->{arg})){ $xusage->(1); return; } + @ARGV = @{$request->{arg}}; + if($#ARGV eq -1){ + $xusage->(1); + return; + } + + + GetOptions( + 'h|help' => \$help, + 'V|verbose' => \$::VERBOSE, + 'u|uninstall' => \$uninstall, + 'f|force' => \$force, + 'i=s' => \$osimage + ); + + if($help){ + $xusage->(0); + return; + } + + my %tabs = (); + my @tables = qw(kit kitrepo kitcomponent osimage osdistro linuximage); + foreach my $t ( @tables ) { + $tabs{$t} = xCAT::Table->new($t,-create => 1,-autocommit => 1); + + if ( !exists( $tabs{$t} )) { + $callback->({error => ["Could not open xCAT table $t\n"],errorcode=>[1]}); + return 1; + } + } + + + # Check if all the kitcomponents are existing before processing + + my %kitcomps; + my $des = shift @ARGV; + my @kitcomponents = split ',', $des; + foreach my $kitcomponent (@kitcomponents) { + + # Check if it is a kitcompname or basename + (my $kitcomptable) = $tabs{kitcomponent}->getAttribs({kitcompname => $kitcomponent}, 'kitname', 'kitpkgdeps', 'postbootscripts', 'kitreponame', 'exlist', 'basename', 'driverpacks'); + if ( $kitcomptable and $kitcomptable->{'kitname'}){ + $kitcomps{$kitcomponent}{name} = $kitcomponent; + $kitcomps{$kitcomponent}{kitname} = $kitcomptable->{kitname}; + $kitcomps{$kitcomponent}{kitpkgdeps} = $kitcomptable->{kitpkgdeps}; + $kitcomps{$kitcomponent}{basename} = $kitcomptable->{basename}; + $kitcomps{$kitcomponent}{exlist} = $kitcomptable->{exlist}; + $kitcomps{$kitcomponent}{postbootscripts} = $kitcomptable->{postbootscripts}; + $kitcomps{$kitcomponent}{kitreponame} = $kitcomptable->{kitreponame}; + $kitcomps{$kitcomponent}{driverpacks} = $kitcomptable->{driverpacks}; + } else { + my @entries = $tabs{kitcomponent}->getAllAttribsWhere( "basename = '$kitcomponent'", 'kitcompname' , 'version', 'release'); + unless (@entries) { + $callback->({error => ["$kitcomponent kitcomponent does not exist\n"],errorcode=>[1]}); + return 1; + } + + my $highest = get_highest_version('kitcompname', 'version', 'release', @entries); + $kitcomps{$highest}{name} = $highest; + (my $kitcomptable) = $tabs{kitcomponent}->getAttribs({kitcompname => $highest}, 'kitname', 'kitpkgdeps', 'postbootscripts', 'kitreponame', 'exlist', 'basename', 'driverpacks'); + $kitcomps{$highest}{kitname} = $kitcomptable->{kitname}; + $kitcomps{$highest}{kitpkgdeps} = $kitcomptable->{kitpkgdeps}; + $kitcomps{$highest}{basename} = $kitcomptable->{basename}; + $kitcomps{$highest}{exlist} = $kitcomptable->{exlist}; + $kitcomps{$highest}{postbootscripts} = $kitcomptable->{postbootscripts}; + $kitcomps{$highest}{kitreponame} = $kitcomptable->{kitreponame}; + $kitcomps{$highest}{driverpacks} = $kitcomptable->{driverpacks}; + } + } + + # Check if the kitcomponents are existing in osimage.kitcomponents attribute. + + (my $osimagetable) = $tabs{osimage}->getAttribs({imagename => $osimage}, 'kitcomponents', 'postbootscripts'); + if ( !$osimagetable or !$osimagetable->{'kitcomponents'} ){ + $callback->({error => ["$osimage osimage does not exist or not includes any kit components\n"],errorcode=>[1]}); + return 1; + } + my @osikitcomps = split ',', $osimagetable->{'kitcomponents'}; + foreach my $osikitcomp ( @osikitcomps ) { + if ( exists($kitcomps{$osikitcomp}) ) { + $kitcomps{$osikitcomp}{matched} = 1; + } + } + my $invalidkitcomp = ''; + foreach my $kitcomp ( keys %kitcomps) { + if ( !$kitcomps{$kitcomp}{matched} ) { + if ( !$invalidkitcomp ) { + $invalidkitcomp = $kitcomp; + } else { + $invalidkitcomp = join(',', $invalidkitcomp, $kitcomp); + } + } + } + + if ( $invalidkitcomp ) { + $callback->({error => ["$invalidkitcomp kit components are not assigned to osimage $osimage\n"],errorcode=>[1]});; + return 1; + } + + # Now check if there is any other kitcomponent depending on this one. + + foreach my $kitcomponent (keys %kitcomps) { + foreach my $osikitcomp ( @osikitcomps ) { + (my $kitcomptable) = $tabs{kitcomponent}->getAttribs({kitcompname => $osikitcomp}, 'kitcompdeps'); + if ( $kitcomptable and $kitcomptable->{'kitcompdeps'} ) { + my @kitcompdeps = split(',', $kitcomptable->{'kitcompdeps'}); + foreach my $kitcompdep (@kitcompdeps) { + + # Get the kit component full name from basename. + my @entries = $tabs{kitcomponent}->getAllAttribsWhere( "basename = '$kitcompdep'", 'kitcompname' , 'version', 'release'); + unless (@entries) { + $callback->({error => ["$kitcompdeps kitcomponent basename does not exist\n"],errorcode=>[1]}); + return 1; + } + + my $kitcompdepname = get_highest_version('kitcompname', 'version', 'release', @entries); + + if ( ($kitcomponent eq $kitcompdepname) and !$force and !exists($kitcomps{$osikitcomp}) ) { + # There is other kitcomponent depending on this one and there is no --force option + $callback->({error => ["$osikitcomp kitcomponent is still depending on this kitcomponent $kitcomponent\n"],errorcode=>[1]});; + return 1; + } + } + } + } + } + + + # Remove each kitcomponent from osimage. + + my @newosikitcomps; + foreach my $osikitcomp ( @osikitcomps ) { + my $match = 0; + foreach my $kitcomponent (keys %kitcomps) { + if ( $kitcomponent eq $osikitcomp ) { + $match = 1; + last; + } + } + if (!$match) { + push @newosikitcomps, $osikitcomp; + } + } + + my $newosikitcomp = join ',', @newosikitcomps; + $osimagetable->{'kitcomponents'} = $newosikitcomp; + + + # Remove kitcomponent.postbootscripts from osimage.postbootscripts. + + my @osimagescripts; + my @newosimagescripts; + if ( $osimagetable and $osimagetable->{'postbootscripts'} ){ + @osimagescripts = split( ',', $osimagetable->{'postbootscripts'} ); + } + + foreach my $osimagescript (@osimagescripts) { + my $match = 0; + foreach my $kitcomponent (keys %kitcomps) { + my @kitcompscripts = split( ',', $kitcomps{$kitcomponent}{postbootscripts} ); + foreach my $kitcompscript ( @kitcompscripts ) { + if ( $osimagescript eq $kitcompscript ) { + $match = 1; + last; + } + } + + last if ($match); + } + + if (!$match) { + push @newosimagescripts, $osimagescript + } + } + + my $newosimagescript = join ',', @newosimagescripts; + $osimagetable->{'postbootscripts'} = $newosimagescript; + + # Remove symlink from osimage.otherpkgdir. + + (my $linuximagetable) = $tabs{linuximage}->getAttribs({imagename=> $osimage}, 'exlist', 'otherpkglist', 'otherpkgdir', 'driverupdatesrc'); + if ( $linuximagetable and $linuximagetable->{otherpkgdir} ) { + + my $otherpkgdir = $linuximagetable->{otherpkgdir}; + foreach my $kitcomponent (keys %kitcomps) { + if ( $kitcomps{$kitcomponent}{kitreponame} ) { + if ( -d "$otherpkgdir/$kitcomps{$kitcomponent}{kitreponame}" ) { + system("rm -rf $otherpkgdir/$kitcomps{$kitcomponent}{kitreponame}"); + } + } + } + } + + + # Remove kitcomponent exlist,otherpkglist and deploy_params from osimage + + my $installdir = xCAT::TableUtils->getInstallDir(); + unless($installdir){ + $installdir = '/install'; + } + $installdir =~ s/\/$//; + + + foreach my $kitcomponent (keys %kitcomps) { + + if ( !exists($kitcomps{$kitcomponent}{kitname}) ) { + $callback->({error => ["Could not find kit object for kitcomponent $kitcomponent"],errorcode=>[1]}); + return 1; + } + + # Reading kitdir + my $kitdir = ''; + my $exlistfile = ''; + my $kitname = $kitcomps{$kitcomponent}{kitname}; + (my $kittable) = $tabs{kit}->getAttribs({kitname=> $kitname}, 'kitdir', 'kitdeployparams'); + + + # Removing exlist + + if ( $linuximagetable and $linuximagetable->{exlist} ) { + my $match = 0; + my @exlists= split ',', $linuximagetable->{exlist}; + foreach my $exlist ( @exlists ) { + if ( $exlist =~ /^$installdir\/osimages\/$osimage\/kits\/KIT_COMPONENTS.exlist$/ ) { + $match = 1; + last; + } + } + + my @lines = (); + if ( $match and -e "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.exlist" ) { + if (open(EXLIST, "<", "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.exlist")) { + @lines = ; + if($::VERBOSE){ + $callback->({data=>["\nReading kit component exlist file $installdir/osimages/$osimage/kits/KIT_COMPONENTS.exlist\n"]}); + } + } else { + $callback->({error => ["Could not open kit component exlist file $installdir/osimages/$osimage/kits/KIT_COMPONENTS.exlist"],errorcode=>[1]}); + return 1; + } + + if ( $kittable and $kittable->{kitdir} ) { + $kitdir = $kittable->{kitdir}; + } + + if ( exists($kitcomps{$kitcomponent}{exlist}) ) { + $exlistfile = $kitcomps{$kitcomponent}{exlist}; + } + + my @newlines = (); + foreach my $line ( @lines ) { + if ( $line =~ /^#INCLUDE:$kitdir\/other_files\/$exlistfile#$/ ) { + next; + } + push @newlines, $line; + } + if (open(NEWEXLIST, ">", "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.exlist")) { + print NEWEXLIST @newlines; + close(NEWEXLIST); + } + + } + } + + # Removing otherpkglist + + if ( $linuximagetable and $linuximagetable->{otherpkglist} ) { + my $match = 0; + my @lines = (); + + my @otherpkglists = split ',', $linuximagetable->{otherpkglist}; + foreach my $otherpkglist ( @otherpkglists ) { + if ( $otherpkglist =~ /^$installdir\/osimages\/$osimage\/kits\/KIT_COMPONENTS.otherpkgs.pkglist$/ ) { + $match = 1; + last; + } + } + + if ( $match and -e "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.otherpkgs.pkglist" ) { + if (open(OTHERPKGLIST, "<", "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.otherpkgs.pkglist")) { + @lines = ; + if($::VERBOSE){ + $callback->({data=>["\nReading kit component otherpkg pkglist $installdir/osimages/$osimage/kits/KIT_COMPONENTS.otherpkgs.pkglist\n"]}); + } + } else { + $callback->({error => ["Could not open kit component exlist file $installdir/osimages/$osimage/kits/KIT_COMPONENTS.exlist"],errorcode=>[1]}); + return 1; + } + + my $basename = ''; + if ( exists($kitcomps{$kitcomponent}{basename}) ) { + $basename = $kitcomps{$kitcomponent}{basename}; + + my @newlines = (); + foreach my $line ( @lines ) { + if ( $line =~ /^$basename$/ ) { + next; + } + push @newlines, $line; + } + + if (open(NEWOTHERPKGLIST, ">", "$installdir/osimages/$osimage/kits/KIT_COMPONENTS.otherpkgs.pkglist")) { + print NEWOTHERPKGLIST @newlines; + close(NEWOTHERPKGLIST); + } + } + } + + # Add this component basename and pkgnames to KIT_RMPKGS.otherpkg.pkglist + if ( $uninstall ) { + my @lines = (); + + mkpath("$installdir/osimages/$osimage/kits/"); + + if ( -e "$installdir/osimages/$osimage/kits/KIT_RMPKGS.otherpkgs.pkglist" ) { + if (open(RMOTHERPKGLIST, "<", "$installdir/osimages/$osimage/kits/KIT_RMPKGS.otherpkgs.pkglist")) { + @lines = ; + close(RMOTHERPKGLIST); + if($::VERBOSE){ + $callback->({data=>["\nReading kit component rmpkgs file $installdir/osimages/$osimage/kits/KIT_RMPKGS.otherpkgs.pkglist\n"]}); + } + } else { + $callback->({error => ["Could not open kit component rmpkgs file $installdir/osimages/$osimage/kits/KIT_RMPKGS.otherpkgs.pkglist"],errorcode=>[1]}); + return 1; + } + } + + my @l = @lines; + my $basename = ''; + my @kitpkgdeps = (); + + if ( exists($kitcomps{$kitcomponent}{basename}) ) { + $basename = $kitcomps{$kitcomponent}{basename}; + } else { + $callback->({error => ["Could not open kit component table and read basename for kit component $kitcomp"],errorcode=>[1]}); + return 1; + } + + if ( exists($kitcomps{$kitcomponent}{kitpkgdeps}) ) { + @kitpkgdeps = split ',', $kitcomps{$kitcomponent}{kitpkgdeps}; + } + + push @kitpkgdeps, $basename; + + foreach my $kitpkgdep ( @kitpkgdeps ) { + my $matched = 0; + foreach my $line ( @lines ) { + chomp $line; + if ( $line =~ /^-$kitpkgdep$/ ) { + $matched = 1; + last; + } + } + + unless ( $matched ) { + push @l, "-$kitpkgdep\n"; + } + + } + + if (open(RMPKGLIST, ">", "$installdir/osimages/$osimage/kits/KIT_RMPKGS.otherpkgs.pkglist")) { + print RMPKGLIST @l; + close(RMPKGLIST); + } + + } + + } + + # Removing deploy parameters + + if ( $kittable and $kittable->{kitdeployparams} and $kittable->{kitdir} ) { + + my $kitdir = $kittable->{kitdir}; + my $kitdeployfile = $kittable->{kitdeployparams}; + + # Check if there is other kitcomponent in the same kit. + my $match = 0; + if ( exists($kitcomps{$kitcomponent}{kitname}) ) { + my $kitname = $kitcomps{$kitcomponent}{kitname}; + + foreach my $osikitcomp ( @osikitcomps ) { + (my $kitcomptable) = $tabs{kitcomponent}->getAttribs({kitcompname=> $osikitcomp}, 'kitname'); + + if ( $kitcomptable and $kitcomptable->{kitname} and $kitcomptable->{kitname} eq $kitname and !exists($kitcomps{$osikitcomp}{name}) ) { + $match = 1; + last; + } + } + + unless ( $match ) { + my @contents = ();; + if ( -e "$kitdir/other_files/$kitdeployfile" ) { + if (open(KITDEPLOY, "<", "$kitdir/other_files/$kitdeployfile") ) { + @contents = ; + close(KITDEPLOY); + if($::VERBOSE){ + $callback->({data=>["\nReading kit deployparams from $kitdir/other_files/$kitdeployfile\n"]}); + } + } else { + $callback->({error => ["Could not open kit deployparams file $kitdir/other_files/$kitdeployfile"],errorcode=>[1]}); + } + } + + my @lines = (); + if ( -e "$installdir/osimages/$osimage/kits/KIT_DEPLOY_PARAMS.otherpkgs.pkglist" ) { + if (open(DEPLOYPARAM, "<", "$installdir/osimages/$osimage/kits/KIT_DEPLOY_PARAMS.otherpkgs.pkglist")) { + @lines = ; + close(DEPLOYPARAM); + if($::VERBOSE){ + $callback->({data=>["\nReading kit deployparams file $installdir/osimages/$osimage/kits/KIT_DEPLOY_PARAMS.otherpkgs.pkglist\n"]}); + } + } else { + $callback->({error => ["Could not open kit deployparams file $installdir/osimages/$osimage/kits/KIT_DEPLOY_PARAMS.otherpkgs.pkglist"],errorcode=>[1]}); + return 1; + } + } + + my @newcontents = (); + foreach my $line ( @lines ) { + my $found = 0; + foreach my $content ( @contents ) { + if ( $line =~ /$content/ ) { + $found = 1; + last; + } + } + + unless ( $found ) { + push @newcontents, $line; + } + } + + # Write the updated lines to kit deployparams file + if (open(NEWDEPLOYPARAM, ">", "$installdir/osimages/$osimage/kits/KIT_DEPLOY_PARAMS.otherpkgs.pkglist")) { + print NEWDEPLOYPARAM @newcontents; + close(NEWDEPLOYPARAM); + } + } + } + } + + + # Remove driverpacks from linuximage + + if ( $linuximagetable and $linuximagetable->{driverupdatesrc} ) { + if ( exists($kitcomps{$kitcomponent}{driverpacks}) ) { + my @driverpacks = split ',', $kitcomps{$kitcomponent}{driverpacks}; + my @driverupdatesrcs = split ',', $linuximagetable->{driverupdatesrc}; + + my @newdriverupdatesrcs = (); + + foreach my $driverupdatesrc ( @driverupdatesrcs ) { + my $matched = 0; + foreach my $driverpack ( @driverpacks ) { + if ( $driverpack eq $driverupdatesrc ) { + $matched = 1; + last; + } + } + + unless ( $matched ) { + push @newdriverupdatesrcs, $driverupdatesrc; + } + } + + my $newdriverupdatesrc = join ',', @newdriverupdatesrcs; + $linuximagetable->{driverupdatesrc} = $newdriverupdatesrc; + } + } + } + + + # Write linuximage table with all the above udpates. + $tabs{linuximage}->setAttribs({imagename => $osimage }, \%{$linuximagetable} ); + + # Write osimage table with all the above udpates. + $tabs{osimage}->setAttribs({imagename => $osimage }, \%{$osimagetable} ); + } 1;