2008-02-22 21:15:19 +00:00
|
|
|
package xCAT_plugin::mknb;
|
2008-07-18 19:59:20 +00:00
|
|
|
use strict;
|
2008-02-22 21:15:19 +00:00
|
|
|
use File::Temp qw(tempdir);
|
|
|
|
use xCAT::Utils;
|
|
|
|
use File::Path;
|
|
|
|
use File::Copy;
|
|
|
|
|
|
|
|
sub handled_commands {
|
|
|
|
return {
|
|
|
|
mknb => 'mknb',
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
sub process_request {
|
|
|
|
my $request = shift;
|
|
|
|
my $callback = shift;
|
|
|
|
my $sitetab = xCAT::Table->new('site');
|
|
|
|
my $serialport;
|
|
|
|
my $serialspeed;
|
|
|
|
my $serialflow;
|
|
|
|
my $xcatdport = 3001;
|
|
|
|
if ($sitetab) {
|
2008-02-25 14:37:58 +00:00
|
|
|
my $portent = $sitetab->getAttribs({key=>'defserialport'},'value');
|
2008-02-22 21:15:19 +00:00
|
|
|
if ($portent and defined($portent->{value})) {
|
|
|
|
$serialport=$portent->{value};
|
|
|
|
}
|
2008-02-25 14:37:58 +00:00
|
|
|
$portent = $sitetab->getAttribs({key=>'defserialspeed'},'value');
|
2008-02-22 21:15:19 +00:00
|
|
|
if ($portent and defined($portent->{value})) {
|
|
|
|
$serialspeed=$portent->{value};
|
|
|
|
}
|
2008-02-25 14:37:58 +00:00
|
|
|
$portent = $sitetab->getAttribs({key=>'defserialflow'},'value');
|
2008-02-22 21:15:19 +00:00
|
|
|
if ($portent and defined($portent->{value})) {
|
|
|
|
$serialflow=$portent->{value};
|
|
|
|
}
|
2008-02-25 14:37:58 +00:00
|
|
|
$portent = $sitetab->getAttribs({key=>'xcatdport'},'value');
|
2008-02-22 21:15:19 +00:00
|
|
|
if ($portent and defined($portent->{value})) {
|
|
|
|
$xcatdport=$portent->{value};
|
|
|
|
}
|
|
|
|
$sitetab->close;
|
|
|
|
}
|
|
|
|
|
|
|
|
my $installdir = "/install";
|
|
|
|
my $tftpdir = "/tftpboot";
|
|
|
|
if (scalar(@{$request->{arg}}) != 1) {
|
2008-04-25 14:03:55 +00:00
|
|
|
$callback->({error=>"Need to specifiy architecture (x86, x86_64 or ppc64)"},{errorcode=>[1]});
|
2008-02-22 21:15:19 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
my $arch = $request->{arg}->[0];
|
|
|
|
unless (-d "$::XCATROOT/share/xcat/netboot/$arch") {
|
|
|
|
$callback->({error=>"Unable to find directory $::XCATROOT/share/xcat/netboot/$arch",errorcode=>[1]});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
unless ( -r "/root/.ssh/id_rsa.pub" ) {
|
2008-05-16 19:17:44 +00:00
|
|
|
if (-r "/root/.ssh/id_rsa") {
|
|
|
|
$callback->({data=>["Extracting ssh public key from private key"]});
|
|
|
|
my $rc = system('ssh-keygen -y -f /root/.ssh/id_rsa > /root/.ssh/id_rsa.pub');
|
|
|
|
if ($rc) {
|
|
|
|
$callback->({error=>["Failure executing ssh-keygen for root"],errorcode=>[1]});
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$callback->({data=>["Generating ssh private key for root"]});
|
|
|
|
my $rc=system('ssh-keygen -t rsa -q -b 2048 -N "" -f /root/.ssh/id_rsa');
|
|
|
|
if ($rc) {
|
|
|
|
$callback->({error=>["Failure executing ssh-keygen for root"],errorcode=>[1]});
|
|
|
|
}
|
2008-02-22 21:15:19 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
my $tempdir = tempdir("mknb.$$.XXXXXX",TMPDIR=>1);
|
|
|
|
unless ($tempdir) {
|
|
|
|
$callback->({error=>["Failed to create a temporary directory"],errorcode=>[1]});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
my $rc = system("cp -a $::XCATROOT/share/xcat/netboot/$arch/nbroot/* $tempdir");
|
|
|
|
if ($rc) {
|
|
|
|
system("rm -rf $tempdir");
|
|
|
|
$callback->({error=>["Failed to copy $::XCATROOT/share/xcat/netboot/$arch/nbroot/ contents"],errorcode=>[1]});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
mkpath($tempdir."/root/.ssh");
|
2008-02-25 19:52:00 +00:00
|
|
|
chmod(0700,$tempdir."/root/.ssh");
|
2008-02-22 21:15:19 +00:00
|
|
|
copy("/root/.ssh/id_rsa.pub","$tempdir/root/.ssh/authorized_keys");
|
2008-02-25 19:52:00 +00:00
|
|
|
chmod(0600,"$tempdir/root/.ssh/authorized_keys");
|
2009-02-10 19:48:29 +00:00
|
|
|
if (-r "/etc/xcat/hostkeys/ssh_host_key") {
|
|
|
|
copy("/etc/xcat/hostkeys/ssh_host_key","$tempdir/etc/ssh_host_key");
|
|
|
|
copy("/etc/xcat/hostkeys/ssh_host_rsa_key","$tempdir/etc/ssh_host_rsa_key");
|
|
|
|
copy("/etc/xcat/hostkeys/ssh_host_dsa_key","$tempdir/etc/ssh_host_dsa_key");
|
2008-02-25 19:47:41 +00:00
|
|
|
chmod(0600,<$tempdir/etc/ssh_*>);
|
2008-02-22 21:15:19 +00:00
|
|
|
}
|
|
|
|
unless (-r "$tempdir/etc/ssh_host_key") {
|
|
|
|
system("ssh-keygen -t rsa1 -f $tempdir/etc/ssh_host_key -C '' -N ''");
|
|
|
|
system("ssh-keygen -t rsa -f $tempdir/etc/ssh_host_rsa_key -C '' -N ''");
|
|
|
|
system("ssh-keygen -t dsa -f $tempdir/etc/ssh_host_dsa_key -C '' -N ''");
|
|
|
|
}
|
|
|
|
$callback->({data=>["Creating nbfs.$arch.gz in $tftpdir/xcat"]});
|
|
|
|
system("cd $tempdir; find . | cpio -o -H newc | gzip -9 > $tftpdir/xcat/nbfs.$arch.gz");
|
2008-05-07 19:50:14 +00:00
|
|
|
system ("rm -rf $tempdir");
|
2008-02-22 21:15:19 +00:00
|
|
|
my $hexnets = xCAT::Utils->my_hexnets();
|
2009-06-26 19:29:01 +00:00
|
|
|
my $normnets = xCAT::Utils->my_nets();
|
2008-02-22 21:15:19 +00:00
|
|
|
my $consolecmdline;
|
2008-02-25 14:37:58 +00:00
|
|
|
if (defined($serialport) and $serialspeed) {
|
2008-02-22 21:15:19 +00:00
|
|
|
$consolecmdline = "console=ttyS$serialport,$serialspeed";
|
|
|
|
if ($serialflow =~ /cts/ or $serialflow =~ /hard/) {
|
|
|
|
$consolecmdline .= "n8r";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
my $cfgfile;
|
2008-02-26 18:48:43 +00:00
|
|
|
if ($arch =~ /x86/) {
|
2009-06-26 19:29:01 +00:00
|
|
|
mkpath("$tftpdir/xcat/xnba/nets");
|
|
|
|
chmod(0755,"$tftpdir/xcat/xnba");
|
2009-06-29 18:37:45 +00:00
|
|
|
chmod(0755,"$tftpdir/xcat/xnba/nets");
|
2008-02-27 19:06:18 +00:00
|
|
|
mkpath("$tftpdir/pxelinux.cfg");
|
|
|
|
chmod(0755,"$tftpdir/pxelinux.cfg");
|
2008-02-26 18:48:43 +00:00
|
|
|
if (! -r "$tftpdir/pxelinux.0") {
|
2008-06-26 14:35:44 +00:00
|
|
|
unless (-r "/usr/lib/syslinux/pxelinux.0" or -r "/usr/share/syslinux/pxelinux.0") {
|
2008-02-26 18:48:43 +00:00
|
|
|
$callback->({error=>["Unable to find pxelinux.0 "],errorcode=>[1]});
|
|
|
|
return;
|
|
|
|
}
|
2008-06-26 14:35:44 +00:00
|
|
|
if (-r "/usr/lib/syslinux/pxelinux.0") {
|
|
|
|
copy("/usr/lib/syslinux/pxelinux.0","$tftpdir/pxelinux.0");
|
|
|
|
} else {
|
|
|
|
copy("/usr/share/syslinux/pxelinux.0","$tftpdir/pxelinux.0");
|
|
|
|
}
|
2008-02-26 18:48:43 +00:00
|
|
|
chmod(0644,"$tftpdir/pxelinux.0");
|
|
|
|
}
|
2009-02-05 15:46:43 +00:00
|
|
|
} elsif ($arch =~ /ppc/) {
|
|
|
|
mkpath("$tftpdir/etc");
|
|
|
|
if (! -r "$tftpdir/yaboot") {
|
|
|
|
$callback->({error=>["Unable to locate yaboot to boot ppc clients, install yaboot-xcat"],errorcode=>[1]});
|
|
|
|
}
|
2008-02-26 18:48:43 +00:00
|
|
|
}
|
2008-04-25 14:03:55 +00:00
|
|
|
my $dopxe=0;
|
2009-06-26 19:29:01 +00:00
|
|
|
foreach (keys %{$normnets}) {
|
|
|
|
my $net = $_;
|
|
|
|
$net =~s/\//_/;
|
|
|
|
$dopxe=0;
|
|
|
|
if ($arch =~ /x86/) { #only do pxe if just x86 or x86_64 and no x86
|
|
|
|
if ($arch =~ /x86_64/) {
|
2009-06-29 18:37:45 +00:00
|
|
|
if (-r "$tftpdir/xcat/xnba/nets/$net") {
|
2009-06-26 19:29:01 +00:00
|
|
|
my $cfg;
|
|
|
|
my @contents;
|
|
|
|
open($cfg,"<","$tftpdir/xcat/xnba/nets/$net");
|
|
|
|
@contents = <$cfg>;
|
|
|
|
close($cfg);
|
|
|
|
if (grep (/x86_64/,@contents)) {
|
|
|
|
$dopxe=1;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$dopxe = 1;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$dopxe = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($dopxe) {
|
|
|
|
my $cfg;
|
|
|
|
open($cfg,">","$tftpdir/xcat/xnba/nets/$net");
|
|
|
|
print $cfg "#!gpxe\n";
|
2009-06-29 18:37:45 +00:00
|
|
|
print $cfg 'imgfetch -n kernel http://${next-server}/tftpboot/xcat/nbk.'."$arch quiet xcatd=".$normnets->{$_}.":$xcatdport $consolecmdline\n";
|
|
|
|
print $cfg 'imgfetch -n nbfs http://${next-server}/tftpboot/xcat/nbfs.'."$arch.gz\n";
|
2009-06-26 19:29:01 +00:00
|
|
|
print $cfg "imgload kernel\n";
|
|
|
|
print $cfg "imgexec kernel\n";
|
|
|
|
close($cfg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$dopxe=0;
|
2008-02-22 21:15:19 +00:00
|
|
|
foreach (keys %{$hexnets}) {
|
2008-04-25 14:03:55 +00:00
|
|
|
$dopxe=0;
|
|
|
|
if ($arch =~ /x86/) { #only do pxe if just x86 or x86_64 and no x86
|
|
|
|
if ($arch =~ /x86_64/) {
|
|
|
|
if (-r "$tftpdir/pxelinux.cfg/".uc($_)) {
|
|
|
|
my $pcfg;
|
|
|
|
open($pcfg,"<","$tftpdir/pxelinux.cfg/".uc($_));
|
|
|
|
my @pcfgcontents = <$pcfg>;
|
|
|
|
close($pcfg);
|
|
|
|
if (grep (/x86_64/,@pcfgcontents)) {
|
|
|
|
$dopxe=1;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$dopxe=1;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$dopxe=1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($dopxe) {
|
2008-02-22 21:15:19 +00:00
|
|
|
open($cfgfile,">","$tftpdir/pxelinux.cfg/".uc($_));
|
|
|
|
print $cfgfile "DEFAULT xCAT\n";
|
|
|
|
print $cfgfile " LABEL xCAT\n";
|
|
|
|
print $cfgfile " KERNEL xcat/nbk.$arch\n";
|
2008-03-21 20:00:07 +00:00
|
|
|
print $cfgfile " APPEND initrd=xcat/nbfs.$arch.gz quiet xcatd=".$hexnets->{$_}.":$xcatdport $consolecmdline\n";
|
2008-02-22 21:15:19 +00:00
|
|
|
close($cfgfile);
|
|
|
|
} elsif ($arch =~ /ppc/) {
|
|
|
|
open($cfgfile,">","$tftpdir/etc/".lc($_));
|
|
|
|
print $cfgfile "timeout=5\n";
|
2008-02-28 00:17:24 +00:00
|
|
|
print $cfgfile " label=xcat\n";
|
|
|
|
print $cfgfile " image=xcat/nbk.$arch\n";
|
|
|
|
print $cfgfile " initrd=xcat/nbfs.$arch.gz\n";
|
2008-03-21 20:00:07 +00:00
|
|
|
print $cfgfile ' append="quiet xcatd='.$hexnets->{$_}.":$xcatdport $consolecmdline\"\n";
|
2008-02-22 21:15:19 +00:00
|
|
|
close($cfgfile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
1;
|