diff --git a/xCAT-server/lib/xcat/plugins/getpartition.pm b/xCAT-server/lib/xcat/plugins/getpartition.pm new file mode 100644 index 000000000..d585d1220 --- /dev/null +++ b/xCAT-server/lib/xcat/plugins/getpartition.pm @@ -0,0 +1,156 @@ +# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html +#------------------------------------------------------- + +=head1 + xCAT plugin package to handle getpartition command + Generally, the getpartitioin command is called from the stateless + node during the booting period to get the partition configureation + infomation to part the hard disk on the stateless node and to + manage the local disk space for statelite and swap space. +=cut + +#------------------------------------------------------- +package xCAT_plugin::getpartition; +use xCAT::Utils; +use xCAT::MsgUtils; +use xCAT::Table; +use xCAT::NodeRange; + +#------------------------------------------------------- + +=head3 handled_commands + +Return list of commands handled by this plugin + +=cut + +#------------------------------------------------------- + +sub handled_commands +{ + return {'getpartition' => "getpartition"}; +} + + +#------------------------------------------------------- + +=head3 process_request + + Process the command + +=cut + +#------------------------------------------------------- +sub process_request +{ + my $request = shift; + my $callback = shift; + my $subreq = shift; + + my $client; + if ($request->{'_xcat_clienthost'}) { + $client = $request->{'_xcat_clienthost'}->[0]; + } + + if ($client) { ($client) = noderange($client) }; + unless ($client) { #Not able to do identify the host in question + xCAT::MsgUtils->message("S","Received syncfiles from $client, which couldn't be correlated to a node (domain mismatch?)"); + return; + } + + parsepartition($client,$callback,$subreq); +} + + +#---------------------------------------------------------------------------- + +=head3 + + parseparition + + Description: Read the partition configuration file from + linuximage.partitionfile, parse the file and send back the partition + parameters to the node. + Arguments: + Returns: 0 - failed; 1 - succeeded; +=cut + +#----------------------------------------------------------------------------- + +sub parsepartition{ + my $node = shift; + my $callback = shift; + my $subreq = shift; + + # get the partition file from linuximage.partitionfile + my $partfile; + my $rsp; + + my $provmethod; + my ($os, $arch, $profile); + + my $nttab = xCAT::Table->new('nodetype', -create=>1); + if ($nttab) { + my $ntent = $nttab->getNodeAttribs($node, ['provmethod', 'os', 'arch', 'profile']); + unless ($ntent) { + push @{$rsp->{data}}, "Error: No entry in nodetype table"; + $callback->($rsp); + return; + } + $provmethod = $ntent->{'provmethod'}; + $os = $ntent->{'os'}; + $arch = $ntent->{'arch'}; + $profile = $ntent->{'profile'}; + } else { + push @{$rsp->{data}}, "Error: Could not open nodetype table"; + $callback->($rsp); + return; + } + + my $imagename; + if (($provmethod ne 'install') and ($provmethod ne 'netboot') and ($provmethod ne 'statelite')) { + $imagename = $provmethod; + } else { + $imagename = "$os-$arch-$provmethod-$profile"; + } + + my $linuximagetab = xCAT::Table->new('linuximage', -create=>1); + if ($linuximagetab) { + my $lient = $linuximagetab->getAttribs({imagename => $imagename}, ['partitionfile']); + unless ($lient) { + push @{$rsp->{data}}, "Error: No entry in linuximage table"; + $callback->($rsp); + return; + } + $partfile = $lient->{'partitionfile'}; + } else { + push @{$rsp->{data}}, "Error: Could not open linuximage table"; + $callback->($rsp); + return; + } + + my $cfgfile; + if ($partfile =~ /s:(.*)/) { + # It's a script that could be run directly to do the partition configuring + $cfgfile = $1; + push @{$rsp->{data}}, "type=script"; + #push @{$rsp->{data}}, "enable=yes"; + } else { + $cfgfile = $partfile; + push @{$rsp->{data}}, "type=format"; + } + + unless (-r $cfgfile) { + push @{$rsp->{data}}, "Error: Could not read the file $1"; + $callback->($rsp); + return; + } + open (FILE, "<$cfgfile"); + push @{$rsp->{data}}, ; + $callback->($rsp); + return; + + +} + +1;