add chkosimage command

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@6503 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
nott 2010-06-17 13:09:43 +00:00
parent b2bcfd6929
commit a15004f8de
2 changed files with 286 additions and 5 deletions

View File

@ -4,7 +4,7 @@
#
# xCAT plugin package to handle the following commands.
# mkdsklsnode, rmdsklsnode, mknimimage,
# rmnimimage, nimnodecust, & nimnodeset
# rmnimimage, chkosimage, nimnodecust, & nimnodeset
#
#####################################################
@ -40,7 +40,7 @@ $Getopt::Long::ignorecase = 0;
=head1 aixinstall
This program module file supports the mkdsklsnode, rmdsklsnode,
rmnimimage, mknimimage, nimnodecust, & nimnodeset commands.
rmnimimage, chkosimage, mknimimage, nimnodecust, & nimnodeset commands.
=cut
@ -68,6 +68,7 @@ sub handled_commands
return {
mknimimage => "aixinstall",
rmnimimage => "aixinstall",
chkosimage => "aixinstall",
mkdsklsnode => "aixinstall",
rmdsklsnode => "aixinstall",
nimnodeset => "aixinstall",
@ -196,6 +197,15 @@ sub preprocess_request
}
}
if ($command =~ /chkosimage/)
{
my $reqcopy = {%$req};
$reqcopy->{'_xcatdest'} = $nimprime;
push @requests, $reqcopy;
return \@requests;
}
#
# get the hash of service nodes - for the nodes that were provided
#
@ -411,8 +421,11 @@ sub process_request
elsif ($command eq "rmnimimage")
{
($ret, $msg) = &rmnimimage($callback, $imagehash, $sub_req);
}
elsif ($command eq "chkosimage")
{
($ret, $msg) = &chkosimage($callback, $imagehash, $sub_req);
}
elsif ($command eq "rmdsklsnode")
{
($ret, $msg) = &rmdsklsnode($callback, $nodes, $sub_req);
@ -1363,6 +1376,253 @@ srvnode.";
return 0;
}
#----------------------------------------------------------------------------
=head3 chkosimage
Checks an xCAT osimage
Arguments:
Returns:
0 - OK
1 - error
Usage:
chkosimage -h
chkosimage [-V] osimage_name
=cut
#-----------------------------------------------------------------------------
sub chkosimage
{
my $callback = shift;
my $subreq = shift;
my $image_name;
if (defined(@{$::args}))
{
@ARGV = @{$::args};
}
else
{
&chkosimage_usage($callback);
return 0;
}
Getopt::Long::Configure("no_pass_through");
if (
!GetOptions(
'h|help' => \$::HELP,
'verbose|V' => \$::VERBOSE,
'v|version' => \$::VERSION,
)
)
{
&chkosimage_usage($callback);
return 0;
}
# display the usage if -h or --help is specified
if ($::HELP)
{
&chkosimage_usage($callback);
return 0;
}
# display the version statement if -v or --verison is specified
if ($::VERSION)
{
my $version = xCAT::Utils->Version();
my $rsp;
push @{$rsp->{data}}, "chkosimage $version\n";
xCAT::MsgUtils->message("I", $rsp, $callback);
return 0;
}
# get this systems name as known by xCAT management node
my $Sname = xCAT::InstUtils->myxCATname();
chomp $Sname;
# get the name of the primary NIM server
# - either the NIMprime attr of the site table or the management node
my $nimprime = xCAT::InstUtils->getnimprime();
chomp $nimprime;
#
# process @ARGV
#
# the first arg should be a noderange - the other should be attr=val
# - put attr=val operands in %::attrres hash
while (my $a = shift(@ARGV))
{
if (!($a =~ /=/))
{
$image_name = $a;
chomp $image_name;
}
else
{
# if it has an "=" sign its an attr=val - we hope
# attr must be a NIM resource type and val must be a resource name
my ($attr, $value) = $a =~ /^\s*(\S+?)\s*=\s*(\S*.*)$/;
if (!defined($attr) || !defined($value))
{
my $rsp;
$rsp->{data}->[0] = "Incorrect \'attr=val\' pair - $a\n";
xCAT::MsgUtils->message("E", $rsp, $::callback);
return 1;
}
# put attr=val in hash
$::attrres{$attr} = $value;
}
}
# get the xCAT image definition
my %objtype;
$objtype{$image_name} = 'osimage';
my %imagedef = xCAT::DBobjUtils->getobjdefs(\%objtype, $callback);
if (!(%imagedef))
{
my $rsp;
push @{$rsp->{data}}, "Could not get xCAT image definition.\n";
xCAT::MsgUtils->message("E", $rsp, $callback);
return 1;
}
#
# check to see if all the software is available in the lpp_source
# directories
#
# create a list
my @pkglist;
my @install_list;
# start with otherpkgs
if ($imagedef{$image_name}{otherpkgs})
{
foreach my $pkg (split(/,/, $imagedef{$image_name}{otherpkgs}))
{
if (!grep(/^$pkg$/, @pkglist))
{
push(@pkglist, $pkg);
}
}
}
# add installp_bundle contents
if ($imagedef{$image_name}{installp_bundle})
{
my @bndlist = split(/,/, $imagedef{$image_name}{installp_bundle});
foreach my $bnd (@bndlist)
{
my ($rc, $list, $loc) = xCAT::InstUtils->readBNDfile($callback, $bnd, $nimprime, $subreq);
foreach my $pkg (@$list)
{
chomp $pkg;
if (!grep(/^$&pkg$/, @pkglist))
{
push(@pkglist, $pkg);
}
}
}
}
foreach my $pkg (@pkglist)
{
if (($pkg =~ /R:/) || ($pkg =~ /I:/) )
{
my ($junk, $pname) = split(/:/, $pkg);
push(@install_list, $pname);
} else {
push(@install_list, $pkg);
}
}
# get a list of software from the lpp_source dirs
my @srclist;
my $lpp_loc = xCAT::InstUtils->get_nim_attr_val($imagedef{$image_name}{lpp_source}, 'location', $callback, $nimprime, $subreq);
my $rpm_srcdir = "$lpp_loc/RPMS/ppc";
my $instp_srcdir = "$lpp_loc/installp/ppc";
# get rpm packages
my $rcmd = qq~/usr/bin/ls $rpm_srcdir 2>/dev/null~;
my @rlist = xCAT::Utils->runcmd("$rcmd", -1);
foreach my $f (@rlist) {
if ($f =~ /\.rpm/) {
if (!grep(/^$f$/, @srclist)) {
push (@srclist, $f);
}
}
}
# get epkg files
# epkg files should go with installp filesets - I think?
my $ecmd = qq~/usr/bin/ls $instp_srcdir 2>/dev/null~;
my @elist = xCAT::Utils->runcmd("$ecmd", -1);
foreach my $f (@elist) {
if (($f =~ /epkg\.Z/)) {
if (!grep(/^$f$/, @srclist)) {
push (@srclist, $f);
}
}
}
# get installp filesets in this dir
my $icmd = qq~installp -L -d $instp_srcdir | /usr/bin/cut -f1 -d':' 2>/dev/null~;
my @ilist = xCAT::Utils->runcmd("$icmd", -1);
foreach my $f (@ilist) {
if (!grep(/^$f$/, @srclist)) {
push (@srclist, $f);
}
}
my $error = 0;
# check for each one - give msg if missing
foreach my $file (@install_list) {
if ($::VERBOSE) {
# my $rsp;
# push @{$rsp->{data}}, "Check for \'$file\'.";
# xCAT::MsgUtils->message("I", $rsp, $callback);
}
if (!grep(/^$file$/, @srclist))
{
my $rsp;
push @{$rsp->{data}}, "Could not find $file in $imagedef{$image_name}{lpp_source}.\n";
xCAT::MsgUtils->message("W", $rsp, $callback);
$error++;
} else {
if ($::VERBOSE) {
my $rsp;
push @{$rsp->{data}}, "Found \'$file\'.";
xCAT::MsgUtils->message("I", $rsp, $callback);
}
}
}
if ($error) {
my $rsp;
push @{$rsp->{data}}, "One or more software packages could not be found in $imagedef{$image_name}{lpp_source}.\n";
xCAT::MsgUtils->message("W", $rsp, $callback);
return 1;
} else {
my $rsp;
push @{$rsp->{data}}, "All the software packages were found in the lpp_source \'$imagedef{$image_name}{lpp_source}\'\n";
xCAT::MsgUtils->message("I", $rsp, $callback);
return 0;
}
return 0;
}
#----------------------------------------------------------------------------
=head3 mknimimage
@ -8248,6 +8508,27 @@ sub mknimimage_usage
#----------------------------------------------------------------------------
=head3 chkosimage_usage
=cut
#-----------------------------------------------------------------------------
sub chkosimage_usage
{
my $callback = shift;
my $rsp;
push @{$rsp->{data}}, "\n chkosimage - Check an xCAT osimage.";
push @{$rsp->{data}}, " Usage: ";
push @{$rsp->{data}}, "\tchkosimage [-h | --help]";
push @{$rsp->{data}}, "or";
push @{$rsp->{data}}, "\tchkosimage [-V] image_name\n";
xCAT::MsgUtils->message("I", $rsp, $callback);
return 0;
}
#----------------------------------------------------------------------------
=head3 rmnimimage_usage
=cut

View File

@ -1439,7 +1439,7 @@ sub doAIXcopy
{
foreach $pkg (split(/,/, $imagedef{$img}{otherpkgs}))
{
if (!grep(/^$&pkg$/, @pkglist))
if (!grep(/^$pkg$/, @pkglist))
{
push(@pkglist, $pkg);
}
@ -1454,7 +1454,7 @@ sub doAIXcopy
foreach my $pkg (@$list)
{
chomp $pkg;
if (!grep(/^$&pkg$/, @pkglist))
if (!grep(/^$pkg$/, @pkglist))
{
push(@pkglist, $pkg);
}