2012-09-24 15:02:51 +00:00
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
#-------------------------------------------------------
= head1
xCAT plugin package to handle Kit management
= cut
#-------------------------------------------------------
package xCAT_plugin::kit ;
BEGIN
{
$ ::XCATROOT = $ ENV { 'XCATROOT' } ? $ ENV { 'XCATROOT' } : '/opt/xcat' ;
}
use xCAT::Table ;
use xCAT::Utils ;
use xCAT::MsgUtils ;
use Getopt::Long ;
use Data::Dumper ;
use File::Basename ;
2012-09-29 17:03:42 +00:00
use File::Path ;
2012-09-24 15:02:51 +00:00
my $ kitconf = "kit.conf" ;
#-------------------------------------------------------
= head3 handled_commands
Return list of commands handled by this plugin
= cut
#-------------------------------------------------------
sub handled_commands
{
return {
2012-09-29 17:03:42 +00:00
addkit = > "kit" ,
rmkit = > "kit" ,
addkitcomp = > "kit" ,
rmkitcomp = > "kit" ,
2012-09-24 15:02:51 +00:00
} ;
}
#-------------------------------------------------------
= head3 process_request
Process the command
= cut
#-------------------------------------------------------
sub process_request
{
my $ request = shift ;
my $ callback = shift ;
my $ command = $ request - > { command } - > [ 0 ] ;
if ( $ command eq "addkit" ) {
2012-09-29 17:03:42 +00:00
return addkit ( $ request , $ callback ) ;
} elsif ( $ command eq "rmkit" ) {
return rmkit ( $ request , $ callback ) ;
} elsif ( $ command eq "addkitcomp" ) {
return addkitcomp ( $ request , $ callback ) ;
} elsif ( $ command eq "rmkitcomp" ) {
return rmkitcomp ( $ request , $ callback ) ;
} else {
2012-09-24 15:02:51 +00:00
$ callback - > ( { error = > [ "Error: $command not found in this module." ] , errorcode = > [ 1 ] } ) ;
#return (1, "$command not found);
}
return ;
}
2012-09-29 17:03:42 +00:00
#-------------------------------------------------------
= head3 get_highest_version
Return the highest version and release for a list of
kit , kitrepo , or kitcomponent names .
Input: @ entries: the arrary contains all the data
$ key: the key name in entries hash .
$ version: compare version nums .
$ release: compare release nums .
= cut
#-------------------------------------------------------
sub get_highest_version
{
my $ key = shift ;
my $ version = shift ;
my $ release = shift ;
my @ entries = @ _ ;
my $ highest ;
foreach my $ entry ( @ entries ) {
$ highest = $ entry if ( ! $ highest ) ;
my $ rc = compare_version ( $ highest , $ entry , $ key , $ version , $ release ) ;
if ( $ rc == 1 ) {
$ highest = $ entry ;
}
}
return $ highest - > { $ key } ;
}
#-------------------------------------------------------
= head3 compare_version
Compare the version and release between two kit /kitrepo/ kitcomp
Input: $ highest: the current highest version or release
$ entry: the new entry
$ key: the key name in entries hash .
$ version: compare version nums .
$ release: compare release nums .
= cut
#-------------------------------------------------------
sub compare_version
{
my $ highest = shift ;
my $ entry = shift ;
my $ key = shift ;
my $ version = shift ;
my $ release = shift ;
my @ a1 = split ( /\./ , $ highest - > { $ version } ) ;
my @ a2 = split ( /\./ , $ entry - > { $ version } ) ;
my ( $ len , $ num1 , $ num2 ) ;
if ( ( $ release = 'release' ) &&
( defined $ highest - > { $ release } ) && ( defined $ entry - > { $ release } ) ) {
$ len = ( scalar ( @ a1 ) > scalar ( @ a2 ) ? scalar ( @ a1 ) : scalar ( @ a2 ) ) ;
} else {
$ len = ( scalar ( @ a1 ) < scalar ( @ a2 ) ? scalar ( @ a1 ) : scalar ( @ a2 ) ) ;
}
$# a1 = $ len - 1 ; # make the arrays the same length before appending release
$# a2 = $ len - 1 ;
if ( $ release = 'release' ) {
push @ a1 , split ( /\./ , $ highest - > { $ release } ) ;
push @ a2 , split ( /\./ , $ entry - > { $ release } ) ;
}
$ len = ( scalar ( @ a1 ) < scalar ( @ a2 ) ? scalar ( @ a1 ) : scalar ( @ a2 ) ) ;
$ num1 = '' ;
$ num2 = '' ;
for ( my $ i = 0 ; $ i < $ len ; $ i + + )
{
my ( $ d1 , $ w1 ) = $ a1 [ $ i ] =~ /^(\d*)(\w*)/ ;
my ( $ d2 , $ w2 ) = $ a2 [ $ i ] =~ /^(\d*)(\w*)/ ;
my $ diff = length ( $ d1 ) - length ( $ d2 ) ;
if ( $ diff > 0 ) # pad d2
{
$ num1 . = $ d1 ;
$ num2 . = ( '0' x $ diff ) . $ d2 ;
}
elsif ( $ diff < 0 ) # pad d1
{
$ num1 . = ( '0' x abs ( $ diff ) ) . $ d1 ;
$ num2 . = $ d2 ;
}
else # they are the same length
{
$ num1 . = $ d1 ;
$ num2 . = $ d2 ;
}
if ( $ w1 && $ w2 )
{
my ( $ w_to_d1 , $ w_to_d2 ) = comp_word ( $ w1 , $ w2 ) ;
$ num1 . = $ w_to_d1 ;
$ num2 . = $ w_to_d2 ;
}
}
# Remove the leading 0s or perl will interpret the numbers as octal
$ num1 =~ s/^0+// ;
$ num2 =~ s/^0+// ;
#SuSE Changes
# if $num1="", the "eval '$num1 $operator $num2'" will fail. So MUSTBE be sure that $num1 is not a "".
if ( length ( $ num1 ) == 0 ) { $ num1 = 0 ; }
if ( length ( $ num2 ) == 0 ) { $ num2 = 0 ; }
return 1 if ( $ num2 > $ num1 ) ;
return 0 if ( $ num2 == $ num1 ) ;
return - 1 ;
}
#--------------------------------------------------------------------------------
= head3 comp_word
Compare version1 word and version2 word . This subroutine can only be used to compare
one section in version number , and this section cannot start with number .
Arguments:
$ w1:
$ w2
Returns:
if $ w1 > $ w2 , return ( 1 , 0 )
if $ w1 < $ w2 , return ( 0 , 1 )
if $ w1 == $ w2 , return ( undef , undef )
Globals:
none
Example:
if ( $ self - > comp_word ( "adfadsfa" , "acc2" )
return ( 0 , 1 )
Comments:
the version word cannot contain "." , and cannot start with number .
For examples , following version words cannot be compared by this subroutine:
( 123.321 , 123.322 ) You need use subroutine testVersion to do the version comparision
( 123 abc , 12 bcd ) You need use subroutine testVersion to do the version comparision
= cut
#--------------------------------------------------------------------------------
sub comp_word
{
my $ self = shift ;
my ( $ w1 , $ w2 ) = @ _ ;
return ( undef , undef ) if ( ! $ w1 || ! $ w2 ) ;
my @ strList1 = unpack "C*" , $ w1 ;
my @ strList2 = unpack "C*" , $ w2 ;
my $ len = scalar ( @ strList1 ) < scalar ( @ strList2 ) ? scalar ( @ strList1 ) : scalar ( @ strList2 ) ;
for ( my $ i = 0 ; $ i < $ len ; $ i + + )
{
next if ( $ strList1 [ $ i ] == $ strList2 [ $ i ] ) ;
return ( 0 , 1 ) if ( $ strList1 [ $ i ] < $ strList2 [ $ i ] ) ;
return ( 1 , 0 ) ;
}
return ( undef , undef ) ;
}
#-------------------------------------------------------
= head3 addkit
Assign a kit component to osimage
= cut
#-------------------------------------------------------
sub assign_to_osimage
{
my $ osimage = shift ;
my $ kitcomp = shift ;
my $ callback = shift ;
my $ tabs = shift ;
( my $ kitcomptable ) = $ tabs - > { kitcomponent } - > getAttribs ( { kitcompname = > $ kitcomp } , 'kitname' , 'kitreponame' , 'basename' , 'kitpkgdeps' , 'exlist' , 'postbootscripts' ) ;
( my $ osimagetable ) = $ tabs - > { osimage } - > getAttribs ( { imagename = > $ osimage } , 'postbootscripts' , 'kitcomponents' ) ;
# Adding postbootscrits to osimage.postbootscripts
if ( $ kitcomptable and $ kitcomptable - > { postbootscripts } ) {
if ( $ osimagetable ) {
if ( $ osimagetable - > { postbootscripts } ) {
my $ match = 0 ;
my @ scripts = split ',' , $ osimagetable - > { postbootscripts } ;
foreach my $ script ( @ scripts ) {
if ( $ kitcomptable - > { postbootscripts } =~ /^$script$/ ) {
$ match = 1 ;
last ;
}
}
unless ( $ match ) {
$ osimagetable - > { postbootscripts } = $ osimagetable - > { postbootscripts } . ',' . $ kitcomptable - > { postbootscripts } ;
}
} else {
$ osimagetable - > { postbootscripts } = $ kitcomptable - > { postbootscripts } ;
}
}
}
( my $ linuximagetable ) = $ tabs - > { linuximage } - > getAttribs ( { imagename = > $ osimage } , 'exlist' , 'otherpkglist' , 'otherpkgdir' ) ;
# Adding kit component's repodir to osimage.otherpkgdir
if ( $ kitcomptable and $ kitcomptable - > { kitreponame } ) {
( my $ kitrepotable ) = $ tabs - > { kitrepo } - > getAttribs ( { kitreponame = > $ kitcomptable - > { kitreponame } } , 'kitrepodir' ) ;
if ( $ kitrepotable and $ kitrepotable - > { kitrepodir } ) {
if ( $ linuximagetable and $ linuximagetable - > { otherpkgdir } ) {
my $ otherpkgdir = $ linuximagetable - > { otherpkgdir } ;
my $ kitrepodir = $ kitrepotable - > { kitrepodir } ;
# Create symlink if doesn't exist
unless ( - d "$otherpkgdir/$kitcomptable->{kitreponame}" ) {
system ( "ln -sf $kitrepodir $otherpkgdir/$kitcomptable->{kitreponame} " ) ;
}
} else {
$ callback - > ( { error = > [ "Cannot open linuximage table or otherpkgdir do not exist" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
} else {
$ callback - > ( { error = > [ "Cannot open kit table or kitdir do not exist" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
}
my $ installdir = xCAT::TableUtils - > getInstallDir ( ) ;
unless ( $ installdir ) {
$ installdir = '/install' ;
}
$ installdir =~ s/\/$// ;
# Reading kitdir
my $ kittable ;
if ( $ kitcomptable and $ kitcomptable - > { kitname } ) {
( $ kittable ) = $ tabs - > { kit } - > getAttribs ( { kitname = > $ kitcomptable - > { kitname } } , 'kitdir' , 'kitdeployparams' ) ;
}
# Adding kitcomponent.exlist to osimage.exlist
if ( $ kitcomptable and $ kitcomptable - > { exlist } and $ kittable and $ kittable - > { kitdir } ) {
my @ lines ;
my $ exlistfile = $ kitcomptable - > { exlist } ;
my $ kitdir = $ kittable - > { kitdir } ;
# 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" ) ) {
@ lines = <EXLIST> ;
close ( EXLIST ) ;
if ( $ ::VERBOSE ) {
$ callback - > ( { data = > [ "\nReading kit component exlist file $installdir/kits/custom/$osimage/KIT_COMPONENTS.exlist\n" ] } ) ;
}
} else {
$ callback - > ( { error = > [ "Could not open kit component exlist file $installdir/kits/custom/$osimage/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" ) ) {
print NEWEXLIST "#INCLUDE:$kitdir/other_files/$exlistfile#\n" ;
close ( NEWEXLIST ) ;
}
}
# Adding KIT_COMPONENTS.exlist file to osimage.exlist if not existing.
if ( $ linuximagetable ) {
if ( $ linuximagetable - > { exlist } ) {
my $ match = 0 ;
my @ exlists = split ',' , $ linuximagetable - > { exlist } ;
foreach my $ exlist ( @ exlists ) {
if ( $ exlist =~ /^$installdir\/kits\/custom\/$osimage\/KIT_COMPONENTS.exlist$/ ) {
$ match = 1 ;
last ;
}
}
unless ( $ match ) {
$ linuximagetable - > { exlist } = $ linuximagetable - > { exlist } . ',' . "$installdir/kits/custom/$osimage/KIT_COMPONENTS.exlist" ;
}
} else {
$ linuximagetable - > { exlist } = "$installdir/kits/custom/$osimage/KIT_COMPONENTS.exlist" ;
}
}
}
# Adding kitdeployparams to a otherpkglist file in osimage
if ( $ kittable and $ kittable - > { kitdeployparams } and $ kittable - > { kitdir } ) {
# Reading contents from kit.kitdeployparams file
my @ contents ;
my $ kitdir = $ kittable - > { kitdir } ;
my $ kitdeployfile = $ kittable - > { kitdeployparams } ;
if ( - e "$kitdir/other_files/$kitdeployfile" ) {
if ( open ( KITDEPLOY , "<" , "$kitdir/other_files/$kitdeployfile" ) ) {
@ contents = <KITDEPLOY> ;
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 ] } ) ;
}
}
# 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" ) ) {
@ lines = <DEPLOYPARAM> ;
close ( DEPLOYPARAM ) ;
if ( $ ::VERBOSE ) {
$ callback - > ( { data = > [ "\nReading kit deployparams file $installdir/kits/custom/$osimage/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 ] } ) ;
return 1 ;
}
}
# Checking if the kit deployparams have been written in the generated kit deployparams file.
my @ l ;
foreach my $ content ( @ contents ) {
my $ matched = 0 ;
foreach my $ line ( @ lines ) {
if ( $ line =~ /$content/ ) {
$ matched = 1 ;
last ;
}
}
unless ( $ matched ) {
push @ l , $ content ;
}
}
# Write the missing lines to kit deployparams file
if ( open ( NEWDEPLOYPARAM , ">>" , "$installdir/kits/custom/$osimage/KIT_DEPLOY_PARAMS.otherpkgs.pkglist" ) ) {
print NEWDEPLOYPARAM @ l ;
close ( NEWDEPLOYPARAM ) ;
}
# Write this kit deployparams to osimage.otherpkglist if not existing.
if ( $ linuximagetable ) {
if ( $ linuximagetable - > { otherpkglist } ) {
my $ match = 0 ;
my @ otherpkglists = split ',' , $ linuximagetable - > { otherpkglist } ;
foreach my $ otherpkglist ( @ otherpkglists ) {
if ( $ otherpkglist =~ /^$installdir\/kits\/custom\/$osimage\/KIT_DEPLOY_PARAMS.otherpkgs.pkglist$/ ) {
$ match = 1 ;
last ;
}
}
unless ( $ match ) {
$ linuximagetable - > { otherpkglist } = $ linuximagetable - > { otherpkglist } . ',' . "$installdir/kits/custom/$osimage/KIT_DEPLOY_PARAMS.otherpkgs.pkglist" ;
}
} else {
$ linuximagetable - > { otherpkglist } = "$installdir/kits/custom/$osimage/KIT_DEPLOY_PARAMS.otherpkgs.pkglist" ;
}
}
}
# Adding kit component basename to osimage.otherpkgs.pkglist
if ( $ kitcomptable and $ kitcomptable - > { basename } ) {
my @ lines ;
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" ) ) {
@ lines = <OTHERPKGLIST> ;
close ( OTHERPKGLIST ) ;
if ( $ ::VERBOSE ) {
$ callback - > ( { data = > [ "\nReading kit component otherpkg file $installdir/kits/custom/$osimage/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 ] } ) ;
return 1 ;
}
}
unless ( grep ( /^$basename$/ , @ lines ) ) {
if ( open ( NEWOTHERPKGLIST , ">>" , "$installdir/kits/custom/$osimage/KIT_COMPONENTS.otherpkgs.pkglist" ) ) {
print NEWOTHERPKGLIST "$basename\n" ;
close ( NEWOTHERPKGLIST ) ;
}
}
# Write this kit component otherpkgs pkgfile to osimage.otherpkglist if not existing.
if ( $ linuximagetable ) {
if ( $ linuximagetable - > { otherpkglist } ) {
my $ match = 0 ;
my @ otherpkglists = split ',' , $ linuximagetable - > { otherpkglist } ;
foreach my $ otherpkglist ( @ otherpkglists ) {
if ( $ otherpkglist =~ /^$installdir\/kits\/custom\/$osimage\/KIT_COMPONENTS.otherpkgs.pkglist$/ ) {
$ match = 1 ;
last ;
}
}
unless ( $ match ) {
$ linuximagetable - > { otherpkglist } = $ linuximagetable - > { otherpkglist } . ',' . "$installdir/kits/custom/$osimage/KIT_COMPONENTS.otherpkgs.pkglist" ;
}
} else {
$ linuximagetable - > { otherpkglist } = "$installdir/kits/custom/$osimage/KIT_COMPONENTS.otherpkgs.pkglist" ;
}
}
# Remove this component basename and pkgnames from KIT_RMPKGS.otherpkg.pkglist
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" ) ) {
@ lines = <RMOTHERPKGLIST> ;
close ( RMOTHERPKGLIST ) ;
if ( $ ::VERBOSE ) {
$ callback - > ( { data = > [ "\nReading kit component rmpkgs file $installdir/kits/custom/$osimage/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 ] } ) ;
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 ;
}
}
if ( $ line =~ /^-$basename$/ ) {
$ matched = 1 ;
$ changed = 1 ;
}
unless ( $ matched ) {
push @ l , "$line\n" ;
}
}
if ( scalar ( @ l ) and $ changed ) {
if ( open ( RMPKGLIST , ">" , "$installdir/kits/custom/$osimage/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 {
$ callback - > ( { error = > [ "Could not open kit component table and read basename for kit component $kitcomp" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
#TODO: adding driverpacks
# 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 } ) ;
}
2012-09-24 15:02:51 +00:00
#-------------------------------------------------------
= head3 addkit
Add Kits into xCAT
= cut
#-------------------------------------------------------
sub addkit
{
my $ request = shift ;
my $ callback = shift ;
my $ kitdir ;
my $ rc ;
my % kithash ;
my % kitrepohash ;
my % kitcomphash ;
my $ xusage = sub {
2012-09-29 17:03:42 +00:00
my % rsp ;
2012-09-24 15:02:51 +00:00
push @ { $ rsp { data } } , "addkit: add Kits into xCAT from a list of tarball file or directory which have the same structure with tarball file" ;
push @ { $ rsp { data } } , "Usage: " ;
push @ { $ rsp { data } } , "\taddkit [-h|--help]" ;
push @ { $ rsp { data } } , "\taddkit [-p|--path <path>] <kitlist>] [-V]" ;
$ 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 ,
'p|path=s' = > \ $ kitdir
) ;
if ( $ help ) {
$ xusage - > ( 0 ) ;
return ;
}
my % tabs = ( ) ;
my @ tables = qw( kit kitrepo kitcomponent ) ;
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 ;
}
}
my $ basename ;
my $ des = shift @ ARGV ;
2012-09-29 17:03:42 +00:00
my @ kits = split ',' , $ des ;
2012-09-24 15:02:51 +00:00
foreach my $ kit ( @ kits ) {
# extract the Kit to kitdir
my $ installdir = xCAT::TableUtils - > getInstallDir ( ) ;
unless ( $ installdir ) {
$ installdir = '/install' ;
}
$ installdir =~ s/\/$// ;
my $ dir = $ request - > { cwd } ; #getcwd;
$ dir = $ dir - > [ 0 ] ;
unless ( - r $ kit ) {
$ kit = "$dir/$kit" ;
}
unless ( - r $ kit ) {
$ callback - > ( { error = > [ "Can not find $kit" ] , errorcode = > [ 1 ] } ) ;
return ;
}
if ( ! $ kitdir ) {
$ kitdir = $ installdir . "/kits" ;
}
if ( $ ::VERBOSE ) {
$ callback - > ( { data = > [ "Create Kit directory $kitdir" ] } ) ;
}
$ kitdir =~ s/\/$// ;
mkdir ( $ kitdir ) ;
if ( - d "$kit" ) {
# This is a directory.
# TODO: check if this is a valid kit directory.
if ( $ ::VERBOSE ) {
$ callback - > ( { data = > [ "Copying Kit from $kit to $kitdir" ] } ) ;
$ rc = system ( "cp -rfv $kit $kitdir" ) ;
} else {
$ rc = system ( "cp -rf $kit $kitdir" ) ;
}
$ basename = basename ( $ kit ) ;
} else {
# should be a tar.bz2 file
if ( $ ::VERBOSE ) {
$ callback - > ( { data = > [ "Extract Kit $kit to $kitdir" ] } ) ;
$ rc = system ( "tar jxvf $kit -C $kitdir" ) ;
} else {
$ rc = system ( "tar jxf $kit -C $kitdir" ) ;
}
# Need discussion of how to get dirname from kit tarball file. For example, how to get kit-test from kit-test.tar.bz2.
# Remove the tar.bz2 directly or extract it to a clean dir and get its name?
$ basename = basename ( $ kit ) ;
$ basename =~ s/.tar.bz2// ;
}
$ kitdir = $ kitdir . "/" . $ basename ;
chmod ( 0666 , "$kitdir/*" ) ;
if ( $ rc ) {
$ callback - > ( { error = > [ "Failed to extract Kit $kit, (Maybe there was no space left?)" ] , errorcode = > [ 1 ] } ) ;
}
# Read kit info from kit.conf
my @ lines ;
if ( open ( KITCONF , "<$kitdir/$kitconf" ) ) {
@ lines = <KITCONF> ;
close ( KITCONF ) ;
if ( $ ::VERBOSE ) {
$ callback - > ( { data = > [ "\nReading kit configuration file $kitdir/$kitconf\n" ] } ) ;
}
} else {
$ callback - > ( { error = > [ "Could not open kit configuration file $kitdir/$kitconf\n" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
my $ sec ;
my $ kitname ;
my $ kitreponame ;
my $ kitcompname ;
2012-09-29 17:03:42 +00:00
my $ scripts ;
2012-09-24 15:02:51 +00:00
foreach my $ line ( @ lines ) {
# Read through each line of kit.conf.
my $ key , $ value ;
chomp $ line ;
next if ( $ line =~ /^$/ ) ;
next if ( $ line =~ /^\s*#/ ) ;
# Split the kit.conf to different parts: kit, kitrepo, kitcomponent.
if ( $ line =~ /kit:/ ) {
$ sec = "KIT" ;
next ;
} elsif ( $ line =~ /kitrepo:/ ) {
$ sec = "KITREPO" ;
next ;
} elsif ( $ line =~ /kitcomponent:/ ) {
$ sec = "KITCOMPONENT" ;
next ;
} else {
( $ key , $ value ) = split /=/ , $ line ;
}
# Add each attribute to different hash.
if ( $ sec =~ /KIT$/ ) {
if ( $ key =~ /kitname/ ) {
$ kitname = $ value ;
$ kithash { $ kitname } { kitdir } = $ kitdir ;
} else {
$ kithash { $ kitname } { $ key } = $ value ;
}
} elsif ( $ sec =~ /KITREPO$/ ) {
if ( $ key =~ /kitreponame/ ) {
$ kitreponame = $ value ;
2012-09-29 17:03:42 +00:00
$ kitrepohash { $ kitreponame } { kitrepodir } = $ kitdir . "/repos/" . $ kitreponame ;
2012-09-24 15:02:51 +00:00
} else {
$ kitrepohash { $ kitreponame } { $ key } = $ value ;
}
} elsif ( $ sec =~ /KITCOMPONENT$/ ) {
if ( $ key =~ /kitcompname/ ) {
$ kitcompname = $ value ;
2012-09-29 17:03:42 +00:00
} elsif ( $ key =~ /postboot/ ) {
$ scripts = $ scripts . ',' . $ value ;
2012-09-24 15:02:51 +00:00
} else {
$ kitcomphash { $ kitcompname } { $ key } = $ value ;
}
}
}
#TODO: add check to see the the attributes name are acceptable by xCAT DB.
2012-09-29 17:03:42 +00:00
#TODO: need to check if the files are existing or not, like exlist,
2012-09-24 15:02:51 +00:00
# Write to DB
if ( $ ::VERBOSE ) {
$ callback - > ( { data = > [ "Writing kit configuration into xCAT DB\n" ] } ) ;
}
unless ( keys % kithash ) {
$ callback - > ( { error = > [ "Failed to add kit because there is no kit.conf or kit.conf is empty" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
foreach my $ kitname ( keys % kithash ) {
$ tabs { kit } - > setAttribs ( { kitname = > $ kitname } , \ % { $ kithash { $ kitname } } ) ;
}
foreach my $ kitreponame ( keys % kitrepohash ) {
$ tabs { kitrepo } - > setAttribs ( { kitreponame = > $ kitreponame } , \ % { $ kitrepohash { $ kitreponame } } ) ;
}
foreach my $ kitcompname ( keys % kitcomphash ) {
$ tabs { kitcomponent } - > setAttribs ( { kitcompname = > $ kitcompname } , \ % { $ kitcomphash { $ kitcompname } } ) ;
}
# Coying scripts to /installdir/postscripts/
if ( $ ::VERBOSE ) {
2012-09-29 17:03:42 +00:00
$ callback - > ( { data = > [ "Copying kit scripts from $kitdir/other_files/ to $installdir/postscripts" ] } ) ;
}
my @ script = split ',' , $ scripts ;
foreach ( @ script ) {
next unless ( $ _ ) ;
if ( $ ::VERBOSE ) {
$ rc = system ( "cp -rfv $kitdir/other_files/$_ $installdir/postscripts/" ) ;
} else {
$ rc = system ( "cp -rf $kitdir/other_files/$_ $installdir/postscripts/" ) ;
}
chmod ( 0755 , "$installdir/postscripts/$_" ) ;
2012-09-24 15:02:51 +00:00
}
if ( $ rc ) {
$ callback - > ( { error = > [ "Failed to copy scripts from $kitdir/scripts/ to $installdir/postscripts\n" ] , errorcode = > [ 1 ] } ) ;
}
# Copying plugins to /opt/xcat/lib/perl/xCAT_plugin/
chmod ( 644 , "$kitdir/plugins/*" ) ;
if ( $ ::VERBOSE ) {
2012-09-29 17:03:42 +00:00
$ callback - > ( { data = > [ "\nCopying kit plugins from $kitdir/plugins/ to $::XCATROOT/lib/perl/xCAT_plugin" ] } ) ;
2012-09-24 15:02:51 +00:00
$ rc = system ( "cp -rfv $kitdir/plugins/* $::XCATROOT/lib/perl/xCAT_plugin/" ) ;
} else {
$ rc = system ( "cp -rf $kitdir/plugins/* $::XCATROOT/lib/perl/xCAT_plugin/" ) ;
}
if ( $ rc ) {
$ callback - > ( { error = > [ "Failed to copy plugins from $kitdir/plugins/ to $::XCATROOT/lib/perl/xCAT_plugin\n" ] , errorcode = > [ 1 ] } ) ;
}
$ callback - > ( { data = > [ "\nKit $kit was successfully added." ] } ) ;
}
# Issue xcatd reload to load the new plugins
2012-09-29 17:03:42 +00:00
system ( "/etc/init.d/xcatd reload" ) ;
2012-09-24 15:02:51 +00:00
}
#-------------------------------------------------------
= head3 rmkit
Remove auto - generated files and their name from persistant file .
= cut
#-------------------------------------------------------
sub rm_gen_file
{
my $ kitcomponent = shift ;
}
#-------------------------------------------------------
= head3 rmkit
Remove Kits from xCAT
= cut
#-------------------------------------------------------
sub rmkit
{
my $ request = shift ;
my $ callback = shift ;
my $ kitdir ;
my $ rc ;
my $ xusage = sub {
2012-09-29 17:03:42 +00:00
my % rsp ;
2012-09-24 15:02:51 +00:00
push @ { $ rsp { data } } , "rmkit: remove Kits from xCAT" ;
push @ { $ rsp { data } } , "Usage: " ;
push @ { $ rsp { data } } , "\trmkit [-h|--help]" ;
push @ { $ rsp { data } } , "\trmkit [-f|--force] <kitlist>] [-V]" ;
$ 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 ,
'f|force' = > \ $ force
) ;
if ( $ help ) {
$ xusage - > ( 0 ) ;
return ;
}
my % tabs = ( ) ;
my @ tables = qw( kit kitrepo kitcomponent osimage ) ;
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 ;
}
}
# Convert to kitname if input is a basename
2012-09-29 17:03:42 +00:00
my % kitnames ;
2012-09-24 15:02:51 +00:00
my $ des = shift @ ARGV ;
2012-09-29 17:03:42 +00:00
my @ kits = split ',' , $ des ;
2012-09-24 15:02:51 +00:00
foreach my $ kit ( @ kits ) {
# Check if it is a kitname or basename
2012-09-29 17:03:42 +00:00
( my $ ref1 ) = $ tabs { kit } - > getAttribs ( { kitname = > $ kit } , 'basename' ) ;
2012-09-24 15:02:51 +00:00
if ( $ ref1 and $ ref1 - > { 'basename' } ) {
2012-09-29 17:03:42 +00:00
$ kitnames { $ kit } = 1 ;
2012-09-24 15:02:51 +00:00
} else {
my @ entries = $ tabs { kit } - > getAllAttribsWhere ( "basename = '$kit'" , 'kitname' ) ;
2012-09-29 17:03:42 +00:00
unless ( @ entries ) {
$ callback - > ( { error = > [ "Kit $kit could not be found in DB $t\n" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
2012-09-24 15:02:51 +00:00
foreach my $ entry ( @ entries ) {
2012-09-29 17:03:42 +00:00
$ kitnames { $ entry - > { kitname } } = 1 ;
2012-09-24 15:02:51 +00:00
}
}
}
# Remove each kit
my @ entries = $ tabs { 'osimage' } - > getAllAttribs ( 'imagename' , 'kitcomponents' ) ;
2012-09-29 17:03:42 +00:00
foreach my $ kitname ( keys % kitnames ) {
2012-09-24 15:02:51 +00:00
# Remove osimage.kitcomponents.
# Find all the components in this kit.
my $ kitcompnames ;
my @ kitcomphash = $ tabs { kitcomponent } - > getAllAttribsWhere ( "kitname = '$kitname'" , 'kitcompname' ) ;
if ( defined ( @ entries ) && ( @ entries > 0 ) ) {
if ( $ ::VERBOSE ) {
2012-09-29 17:03:42 +00:00
$ callback - > ( { data = > [ "Removing kit components from osimage.kitcomponents" ] } ) ;
2012-09-24 15:02:51 +00:00
}
my @ newkitcomponents ;
foreach my $ entry ( @ entries ) {
my $ catched = 0 ;
# Check osimage.kitcomponents
2012-09-29 17:03:42 +00:00
my @ kitcomponents = split ',' , $ entry - > { kitcomponents } ;
2012-09-24 15:02:51 +00:00
foreach my $ kitcomponent ( @ kitcomponents ) {
chomp $ kitcomponent ;
# Compare with each component in osimage.kitcomponents list.
foreach my $ kitcomp ( @ kitcomphash ) {
my $ kitcompname = $ kitcomp - > { kitcompname } ;
# Remove this component from osimage.kitcomponents if -f option.
if ( "$kitcompname" =~ /^$kitcomponent$/ ) {
unless ( $ force ) {
$ callback - > ( { error = > [ "Failed to remove kit component $kitcomponent because:$kitcomponent is being used by osimage $entry->{imagename}\n" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
# Remove this component from osimage.kitcomponents. Mark here.
$ catched = 1 ;
} else {
push @ newkitcomponents , $ kitcomponent ;
}
}
}
# Some kitcomponents attributes changed, set it back to DB.
if ( $ catched ) {
my $ newnewkitcomponent = join ',' , @ newkitcomponents ;
$ tabs { osimage } - > setAttribs ( { imagename = > $ entry - > { imagename } } , { kitcomponents = > "$newnewkitcomponent" } ) ;
}
# Check if this kit component generated files has been put to osimage.exlist,osimage.otherpkglist.
# Don't need to check -f option again, it should have returned if no -f option while checking osimage.kitcomponents.
# rm_gen_files();
}
2012-09-29 17:03:42 +00:00
}
my $ kitdir ;
( my $ ref1 ) = $ tabs { kit } - > getAttribs ( { kitname = > $ kitname } , 'kitdir' ) ;
if ( $ ref1 and $ ref1 - > { 'kitdir' } ) {
$ kitdir = $ ref1 - > { 'kitdir' } ;
chomp $ kitdir ;
2012-09-24 15:02:51 +00:00
# remove kit plugins from /opt/xcat/lib/perl/xCAT_plugin
if ( $ ::VERBOSE ) {
2012-09-29 17:03:42 +00:00
$ callback - > ( { data = > [ "Removing kit plugins from $::XCATROOT/lib/perl/xCAT_plugin/" ] } ) ;
}
opendir ( $ dir , $ kitdir . "/plugins" ) ;
my @ files = readdir ( $ dir ) ;
foreach my $ file ( @ files ) {
if ( $ file eq '.' or $ file eq '..' ) { next ; }
if ( - e "$::XCATROOT/lib/perl/xCAT_plugin/$file" ) {
if ( $ ::VERBOSE ) {
system ( "rm -rfv $::XCATROOT/lib/perl/xCAT_plugin/$file" ) ;
} else {
system ( "rm -rf $::XCATROOT/lib/perl/xCAT_plugin/$file" ) ;
2012-09-24 15:02:51 +00:00
}
}
}
2012-09-29 17:03:42 +00:00
if ( $ ::VERBOSE ) {
$ callback - > ( { data = > [ "Removing kit scripts from /install/postscripts/" ] } ) ;
}
# remove kit scripts from /install/postscripts/
my $ installdir = xCAT::TableUtils - > getInstallDir ( ) ;
unless ( $ installdir ) {
$ installdir = '/install' ;
}
$ installdir =~ s/\/$// ;
opendir ( $ dir , $ kitdir . "/scripts" ) ;
my @ files = readdir ( $ dir ) ;
foreach my $ file ( @ files ) {
if ( $ file eq '.' or $ file eq '..' ) { next ; }
if ( - e "$installdir/postscripts/$file" ) {
if ( $ ::VERBOSE ) {
system ( "rm -rfv $installdir/postscripts/$file" ) ;
} else {
system ( "rm -rf $installdir/postscripts/$file" ) ;
}
2012-09-24 15:02:51 +00:00
}
}
2012-09-29 17:03:42 +00:00
# remove kitdir from /install/kits/
if ( $ ::VERBOSE ) {
$ callback - > ( { data = > [ "Removing kitdir from installdir" ] } ) ;
system ( "rm -rfv $kitdir" ) ;
} else {
system ( "rm -rf $kitdir" ) ;
}
2012-09-24 15:02:51 +00:00
}
2012-09-29 17:03:42 +00:00
2012-09-24 15:02:51 +00:00
if ( $ ::VERBOSE ) {
2012-09-29 17:03:42 +00:00
$ callback - > ( { data = > [ "Removing kit from xCAT DB" ] } ) ;
2012-09-24 15:02:51 +00:00
}
# Remove kitcomponent
foreach my $ kitcomp ( @ kitcomphash ) {
my $ kitcompname = $ kitcomp - > { kitcompname } ;
$ tabs { kitcomponent } - > delEntries ( { kitcompname = > $ kitcompname } ) ;
}
# Remove kitrepo
my @ kitrepohash = $ tabs { kitrepo } - > getAllAttribsWhere ( "kitname = '$kitname'" , 'kitreponame' ) ;
foreach my $ kitrepo ( @ kitrepohash ) {
my $ kitreponame = $ kitrepo - > { kitreponame } ;
$ tabs { kitrepo } - > delEntries ( { kitreponame = > $ kitreponame } ) ;
}
# Remove kit
$ tabs { kit } - > delEntries ( { kitname = > $ kitname } ) ;
$ callback - > ( { data = > [ "Kit $kitname was successfully removed." ] } ) ;
}
# Issue xcatd reload to load the new plugins
2012-09-29 17:03:42 +00:00
system ( "/etc/init.d/xcatd reload" ) ;
}
#-------------------------------------------------------
= head3 addkitcomp
Assign Kit component to osimage
= cut
#-------------------------------------------------------
sub addkitcomp
{
my $ request = shift ;
my $ callback = shift ;
my $ kitdir ;
my $ rc ;
my $ xusage = sub {
my % rsp ;
push @ { $ rsp { data } } , "addkitcomp: assign kit component to osimage" ;
push @ { $ rsp { data } } , "Usage: " ;
push @ { $ rsp { data } } , "\taddkitcomp [-h|--help]" ;
push @ { $ rsp { data } } , "\taddkitcomp [-a|--adddeps] [-f|--force] [-V|--verbose] -i <osimage> <kitcompname_list>" ;
$ 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 ,
'a|adddeps' = > \ $ adddeps ,
'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' ) ;
if ( $ kitcomptable and $ kitcomptable - > { 'kitname' } ) {
$ kitcomps { $ kitcomponent } { name } = $ kitcomponent ;
} 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 ;
}
}
# Verify if the kitcomponents fitting to the osimage or not.
my % os ;
my $ osdistrotable ;
( my $ osimagetable ) = $ tabs { osimage } - > getAttribs ( { imagename = > $ osimage } , 'osdistroname' , 'serverrole' , 'kitcomponents' ) ;
if ( $ osimagetable and $ osimagetable - > { 'osdistroname' } ) {
( $ osdistrotable ) = $ tabs { osdistro } - > getAttribs ( { osdistroname = > $ osimagetable - > { 'osdistroname' } } , 'basename' , 'majorversion' , 'minorversion' , 'arch' , 'type' ) ;
if ( ! $ osdistrotable or ! $ osdistrotable - > { basename } ) {
$ callback - > ( { error = > [ "$osdistroname osdistro does not exist\n" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
# Read basename,majorversion,minorversion,arch,type, from osdistro table
$ os { $ osimage } { basename } = lc ( $ osdistrotable - > { basename } ) ;
$ os { $ osimage } { majorversion } = lc ( $ osdistrotable - > { majorversion } ) ;
$ os { $ osimage } { minorversion } = lc ( $ osdistrotable - > { minorversion } ) ;
$ os { $ osimage } { arch } = lc ( $ osdistrotable - > { arch } ) ;
$ os { $ osimage } { type } = lc ( $ osdistrotable - > { type } ) ;
# Read serverrole from osimage.
$ os { $ osimage } { serverrole } = lc ( $ osimagetable - > { 'serverrole' } ) ;
} else {
$ callback - > ( { error = > [ "$osimage osimage does not exist or not saticified\n" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
foreach my $ kitcomp ( keys % kitcomps ) {
( my $ kitcomptable ) = $ tabs { kitcomponent } - > getAttribs ( { kitcompname = > $ kitcomp } , 'kitname' , 'kitreponame' , 'serverroles' ) ;
if ( $ kitcomptable and $ kitcomptable - > { 'kitname' } and $ kitcomptable - > { 'kitreponame' } ) {
# Read serverroles from kitcomponent table
$ kitcomps { $ kitcomp } { serverroles } = lc ( $ kitcomptable - > { 'serverroles' } ) ;
# Read ostype from kit table
( my $ kittable ) = $ tabs { kit } - > getAttribs ( { kitname = > $ kitcomptable - > { 'kitname' } } , 'ostype' ) ;
if ( $ kittable and $ kittable - > { ostype } ) {
$ kitcomps { $ kitcomp } { ostype } = lc ( $ kittable - > { ostype } ) ;
} else {
$ callback - > ( { error = > [ "$kitcomptable->{'kitname'} ostype does not exist\n" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
# Read osbasename, osmajorversion,osminorversion,osarch,compat_osbasenames from kitrepo table
( my $ kitrepotable ) = $ tabs { kitrepo } - > getAttribs ( { kitreponame = > $ kitcomptable - > { 'kitreponame' } } , 'osbasename' , 'osmajorversion' , 'osminorversion' , 'osarch' , 'compat_osbasenames' ) ;
if ( $ kitrepotable and $ kitrepotable - > { osbasename } and $ kitrepotable - > { osmajorversion } and $ kitrepotable - > { osarch } ) {
if ( $ kitrepotable - > { compat_osbasenames } ) {
$ kitcomps { $ kitcomp } { osbasename } = lc ( $ kitrepotable - > { osbasename } ) . ',' . lc ( $ kitrepotable - > { compat_osbasenames } ) ;
} else {
$ kitcomps { $ kitcomp } { osbasename } = lc ( $ kitrepotable - > { osbasename } ) ;
}
$ kitcomps { $ kitcomp } { osmajorversion } = lc ( $ kitrepotable - > { osmajorversion } ) ;
$ kitcomps { $ kitcomp } { osminorversion } = lc ( $ kitrepotable - > { osminorversion } ) ;
$ kitcomps { $ kitcomp } { osarch } = lc ( $ kitrepotable - > { osarch } ) ;
} else {
$ callback - > ( { error = > [ "$kitcomp osbasename,osmajorversion,osminorversion or osarch does not exist\n" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
} else {
$ callback - > ( { error = > [ "$kitcomp kitname or kitrepo name does not exist\n" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
# Validate each attribute in kitcomp.
my $ catched = 0 ;
my @ osbasename = split ',' , $ kitcomps { $ kitcomp } { osbasename } ;
foreach ( @ osbasename ) {
if ( $ os { $ osimage } { basename } eq $ _ ) {
$ catched = 1 ;
}
}
unless ( $ catched ) {
$ callback - > ( { error = > [ "osimage $osimage doesn't fit to kit component $kitcomp with attribute OS \n" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
if ( $ os { $ osimage } { majorversion } ne $ kitcomps { $ kitcomp } { osmajorversion } ) {
$ callback - > ( { error = > [ "osimage $osimage doesn't fit to kit component $kitcomp with attribute majorversion\n" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
if ( $ os { $ osimage } { minorversion } and ( $ os { $ osimage } { minorversion } ne $ kitcomps { $ kitcomp } { osminorversion } ) ) {
$ callback - > ( { error = > [ "osimage $osimage doesn't fit to kit component $kitcomp with attribute minorversion\n" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
if ( $ os { $ osimage } { arch } ne $ kitcomps { $ kitcomp } { osarch } ) {
$ callback - > ( { error = > [ "osimage $osimage doesn't fit to kit component $kitcomp with attribute arch\n" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
if ( $ os { $ osimage } { type } ne $ kitcomps { $ kitcomp } { ostype } ) {
$ callback - > ( { error = > [ "osimage $osimage doesn't fit to kit component $kitcomp with attribute type\n" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
if ( $ os { $ osimage } { serverrole } and ( $ os { $ osimage } { serverrole } ne $ kitcomps { $ kitcomp } { serverroles } ) ) {
$ callback - > ( { error = > [ "osimage $osimage doesn't fit to kit component $kitcomp with attribute serverrole\n" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
#TODO add checks to kit components' dependencies.
}
# Now assign each component to the osimage
my @ kitcomps ;
my $ catched = 0 ;
if ( $ osimagetable and $ osimagetable - > { 'kitcomponents' } ) {
@ oskitcomps = split ',' , $ osimagetable - > { 'kitcomponents' } ;
}
foreach my $ kitcomp ( keys % kitcomps ) {
# 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" ] } ) ;
$ catched = 1 ;
last ;
}
}
# No matching kitcomponent name in osimage.kitcomponents, now checking their basenames.
if ( ! $ catched ) {
my $ add = 0 ;
foreach my $ oskitcomp ( @ oskitcomps ) {
# Compare this kit component's basename with basenames in osimage.kitcomponents
( my $ kitcomptable ) = $ tabs { kitcomponent } - > getAttribs ( { kitcompname = > $ kitcomp } , 'basename' , 'version' , 'release' ) ;
if ( ! $ kitcomptable or ! $ kitcomptable - > { 'basename' } ) {
$ callback - > ( { error = > [ "$kitcomp kit component does not have basename" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
( my $ oskitcomptable ) = $ tabs { kitcomponent } - > getAttribs ( { kitcompname = > $ oskitcomp } , 'basename' , 'version' , 'release' ) ;
if ( ! $ oskitcomptable or ! $ oskitcomptable - > { 'basename' } ) {
$ callback - > ( { error = > [ "$oskitcomp kit component does not have basename" ] , errorcode = > [ 1 ] } ) ;
next ;
}
if ( $ kitcomptable - > { 'basename' } eq $ oskitcomptable - > { 'basename' } ) {
my $ rc = compare_version ( $ oskitcomptable , $ kitcomptable , 'kitcompname' , 'version' , 'release' ) ;
if ( $ rc == 1 ) {
$ callback - > ( { data = > [ "Upgrading kit component $oskitcomp to $kitcomp" ] } ) ;
system ( "rmkitcomp -f -u -i $osimage $kitcomp" ) ;
$ add = 1 ;
} elsif ( $ rc == 0 ) {
$ callback - > ( { data = > [ "Do nothing since kit component $oskitcomp in osimage $osimage has the same basename/version and release with kit component $kitcomp." ] } ) ;
next ;
} else {
$ callback - > ( { error = > [ "kit component $oskitcomp is already in osimage $osimage, and has a newer release/version than $kitcomp. Downgrading kit component is not supported" ] , errorcode = > [ 1 ] } ) ;
return 1 ;
}
}
}
# Now assign this component to osimage
my $ rc = assign_to_osimage ( $ osimage , $ kitcomp , $ callback , \ % tabs ) ;
}
}
2012-09-24 15:02:51 +00:00
}
2012-09-29 17:03:42 +00:00
#-------------------------------------------------------
= head3 rmkitcomp
Remove Kit component from osimage
= cut
#-------------------------------------------------------
sub rmkitcomp
{
}
2012-09-24 15:02:51 +00:00
1 ;