Add the new plugin to handle the geninitrd command that regenerate (hack) initrd for stateful osimage
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@16975 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
parent
d18c4b0307
commit
d36a03cc36
182
xCAT-server/lib/xcat/plugins/geninitrd.pm
Normal file
182
xCAT-server/lib/xcat/plugins/geninitrd.pm
Normal file
@ -0,0 +1,182 @@
|
||||
# IBM(c) 2013 EPL license http://www.eclipse.org/legal/epl-v10.html
|
||||
package xCAT_plugin::geninitrd;
|
||||
BEGIN
|
||||
{
|
||||
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
|
||||
}
|
||||
|
||||
use strict;
|
||||
use lib "$::XCATROOT/lib/perl";
|
||||
use File::Copy;
|
||||
use xCAT::MsgUtils;
|
||||
use xCAT::TableUtils;
|
||||
use xCAT::Table;
|
||||
use xCAT::Scope;
|
||||
|
||||
sub handled_commands
|
||||
{
|
||||
return {
|
||||
geninitrd => "geninitrd",
|
||||
}
|
||||
}
|
||||
|
||||
sub preprocess_request
|
||||
{
|
||||
my $req = shift;
|
||||
my $callback = shift;
|
||||
|
||||
unless (defined ($req->{arg}) && $req->{arg}->[0]) {
|
||||
xCAT::MsgUtils->message("E", {error=>["An osimage name needs to be specified."], errorcode=>["1"]}, $callback);
|
||||
return;
|
||||
}
|
||||
|
||||
#if tftpshared is not set, dispatch this command to all the service nodes
|
||||
my @entries = xCAT::TableUtils->get_site_attribute("sharedtftp");
|
||||
my $t_entry = $entries[0];
|
||||
if ( defined($t_entry) and ($t_entry == 0 or $t_entry =~ /no/i)) {
|
||||
$req->{'_disparatetftp'}=[1];
|
||||
return xCAT::Scope->get_broadcast_scope($req,@_);
|
||||
}
|
||||
return [$req];
|
||||
}
|
||||
|
||||
|
||||
sub process_request
|
||||
{
|
||||
my $req = shift;
|
||||
my $callback = shift;
|
||||
|
||||
if ($req->{command}->[0] eq 'geninitrd')
|
||||
{
|
||||
return geninitrd($req, $callback);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sub geninitrd {
|
||||
my $req = shift;
|
||||
my $callback = shift;
|
||||
|
||||
my $osimage = $req->{arg}->[0];
|
||||
|
||||
my ($osvers, $arch, $pkgdir, $driverupdatesrc, $netdrivers, $osdisupdir);
|
||||
|
||||
# get attributes from osimage table
|
||||
my $osimagetab=xCAT::Table->new('osimage');
|
||||
unless ($osimagetab) {
|
||||
xCAT::MsgUtils->message("E", {error=>["Cannot open the table osimage."], errorcode=>["1"]}, $callback);
|
||||
return;
|
||||
}
|
||||
|
||||
my $oient = $osimagetab->getAttribs({imagename => $osimage}, 'osvers', 'osarch', 'osupdatename');
|
||||
unless ($oient && $oient->{'osvers'} && $oient->{'osarch'} ) {
|
||||
xCAT::MsgUtils->message("E", {error=>["The osimage [$osimage] was not defined or [osvers, osarch] attributes were not set."], errorcode=>["1"]}, $callback);
|
||||
return;
|
||||
}
|
||||
$osvers = $oient->{'osvers'};
|
||||
$arch = $oient->{'osarch'};
|
||||
|
||||
# get attributes from linuximage table
|
||||
my $linuximagetab=xCAT::Table->new('linuximage');
|
||||
unless ($linuximagetab) {
|
||||
xCAT::MsgUtils->message("E", {error=>["Cannot open the table linuximage."], errorcode=>["1"]}, $callback);
|
||||
return;
|
||||
}
|
||||
|
||||
my $lient = $linuximagetab->getAttribs({imagename => $osimage}, 'pkgdir', 'driverupdatesrc', 'netdrivers');
|
||||
unless ($lient && $lient->{'pkgdir'}) {
|
||||
xCAT::MsgUtils->message("E", {error=>["The osimage [$osimage] was not defined or [pkgdir] attribute was not set."], errorcode=>["1"]}, $callback);
|
||||
return;
|
||||
}
|
||||
$pkgdir = $lient->{'pkgdir'};
|
||||
$driverupdatesrc = $lient->{'driverupdatesrc'};
|
||||
$netdrivers = $lient->{'netdrivers'};
|
||||
|
||||
# get the path list of the osdistroupdate
|
||||
if ($oient->{'osupdatename'}) {
|
||||
my @osupdatenames = split (/,/, $oient->{'osupdatename'});
|
||||
|
||||
my $osdistrouptab=xCAT::Table->new('osdistroupdate', -create=>1);
|
||||
unless ($osdistrouptab) {
|
||||
xCAT::MsgUtils->message("E", { error => ["Cannot open the table osdistroupdate."], errorcode => [1] }, $callback);
|
||||
return;
|
||||
}
|
||||
|
||||
my @osdup = $osdistrouptab->getAllAttribs("osupdatename", "dirpath");
|
||||
foreach my $upname (@osupdatenames) {
|
||||
foreach my $upref (@osdup) {
|
||||
if ($upref->{'osupdatename'} eq $upname) {
|
||||
$osdisupdir .= ",$upref->{'dirpath'}";
|
||||
last;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$osdisupdir =~ s/^,//;
|
||||
}
|
||||
|
||||
# get the source path of initrd and kernel from the pkgdir of osimage
|
||||
# copy the initrd and kernel to /tftpboot
|
||||
# pass the path of initrd and kernel in /tftpboot to insertdd
|
||||
my $initrdpath;
|
||||
my $kernelpath;
|
||||
my $tftpdir = "/tftpboot";
|
||||
my @entries = xCAT::TableUtils->get_site_attribute("$tftpdir");
|
||||
my $t_entry = $entries[0];
|
||||
if ( defined($t_entry) ) {
|
||||
$tftpdir = $t_entry;
|
||||
}
|
||||
my $tftppath = "$tftpdir/xcat/osimage/$osimage";
|
||||
if ($arch =~ /x86/) {
|
||||
if ($osvers =~ /(^ol[0-9].*)|(centos.*)|(rh.*)|(fedora.*)|(SL.*)/) {
|
||||
$kernelpath = "$tftppath/vmlinuz";
|
||||
copy("$pkgdir/images/pxeboot/vmlinuz", $kernelpath);
|
||||
$initrdpath = "$tftppath/initrd.img";
|
||||
copy("$pkgdir/images/pxeboot/initrd.img", $initrdpath);
|
||||
} elsif ($osvers =~ /(sles.*)|(suse.*)/) {
|
||||
$kernelpath = "$tftppath/linux";
|
||||
copy("$pkgdir/1/boot/$arch/loader/linux", $kernelpath);
|
||||
$initrdpath = "$tftppath/initrd";
|
||||
copy("$pkgdir/1/boot/$arch/loader/initrd", $initrdpath);
|
||||
} else {
|
||||
xCAT::MsgUtils->message("E", { error => ["unknow osvers [$osvers]."], errorcode => [1] }, $callback);
|
||||
return;
|
||||
}
|
||||
} elsif ($arch =~ /ppc/) {
|
||||
if ($osvers =~ /(^ol[0-9].*)|(centos.*)|(rh.*)|(fedora.*)|(SL.*)/) {
|
||||
$kernelpath = "$tftppath/vmlinuz";
|
||||
copy("$pkgdir/ppc/ppc64/vmlinuz", $kernelpath);
|
||||
if (-r "$pkgdir/ppc/ppc64/ramdisk.image.gz") {
|
||||
$initrdpath = "$tftppath/initrd.img";
|
||||
copy ("$pkgdir/ppc/ppc64/ramdisk.image.gz", $initrdpath);
|
||||
} elsif (-r "$pkgdir/ppc/ppc64/initrd.img") {
|
||||
$initrdpath = "$tftppath/initrd.img";
|
||||
copy("$pkgdir/ppc/ppc64/initrd.img", $initrdpath);
|
||||
}
|
||||
} elsif ($osvers =~ /(sles.*)|(suse.*)/) {
|
||||
$kernelpath = undef;
|
||||
$initrdpath = "$tftppath/inst64";
|
||||
copy ("$pkgdir/1/suseboot/inst64", $initrdpath);
|
||||
} else {
|
||||
xCAT::MsgUtils->message("E", { error => ["unknow osvers [$osvers]."], errorcode => [1] }, $callback);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
xCAT::MsgUtils->message("E", { error => ["unknow arch [$arch]."], errorcode => [1] }, $callback);
|
||||
return;
|
||||
}
|
||||
|
||||
# call the insert_dd function in the anaconda or sles to hack the initrd that:
|
||||
# 1. Get the new kernel from update distro and copy it to /tftpboot
|
||||
# 2. Inject the drivers to initrd in /tftpboot base on the new kernel ver
|
||||
if ($osvers =~ /(^ol[0-9].*)|(centos.*)|(rh.*)|(fedora.*)|(SL.*)/) {
|
||||
require xCAT_plugin::anaconda;
|
||||
xCAT_plugin::anaconda->insert_dd($callback, $osvers, $arch, $initrdpath, $kernelpath, $driverupdatesrc, $netdrivers, $osdisupdir);
|
||||
} elsif ($osvers =~ /(sles.*)|(suse.*)/) {
|
||||
require xCAT_plugin::sles;
|
||||
xCAT_plugin::sles->insert_dd($callback, $osvers, $arch, $initrdpath, $kernelpath, $driverupdatesrc, $netdrivers, $osdisupdir);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
1;
|
Loading…
Reference in New Issue
Block a user