diff --git a/xCAT-server-2.0/usr/lib/xcat/plugins/rhel.pm b/xCAT-server-2.0/usr/lib/xcat/plugins/rhel.pm index dde055b58..86c94f12a 100644 --- a/xCAT-server-2.0/usr/lib/xcat/plugins/rhel.pm +++ b/xCAT-server-2.0/usr/lib/xcat/plugins/rhel.pm @@ -190,13 +190,23 @@ sub mkinstall { xCAT::Template->subvars("/usr/share/xcat/install/rh/".$ent->{profile}.".tmpl","/install/autoinst/".$node,$node); mkpath "/install/postscripts/"; xCAT::Postage->writescript($node,"/install/postscripts/".$node); - if (-r "/install/$os/$arch/images/pxeboot/vmlinuz" - and -r "/install/$os/$arch/images/pxeboot/initrd.img") { + if (($arch =~ /x86/ and + (-r "/install/$os/$arch/images/pxeboot/vmlinuz" and -r "/install/$os/$arch/images/pxeboot/initrd.img")) + or $arch =~ /ppc/ and + (-r "/install/$os/$arch/ppc/ppc64/vmlinuz" and -r "/install/$os/$arch/ppc/ppc64/ramdisk.image.gz")) { unless ($doneimgs{"$os|$arch"}) { #TODO: driver slipstream, targetted for network. mkpath("/tftpboot/xcat/$os/$arch"); - copy("/install/$os/$arch/images/pxeboot/vmlinuz","/tftpboot/xcat/$os/$arch/"); - copy("/install/$os/$arch/images/pxeboot/initrd.img","/tftpboot/xcat/$os/$arch/"); + if ($arch =~ /x86/) { + copy("/install/$os/$arch/images/pxeboot/vmlinuz","/tftpboot/xcat/$os/$arch/"); + copy("/install/$os/$arch/images/pxeboot/initrd.img","/tftpboot/xcat/$os/$arch/"); + } elsif ($arch =~ /ppc/) { + copy("/install/$os/$arch/ppc/ppc64/vmlinuz","/tftpboot/xcat/$os/$arch/"); + copy("/install/$os/$arch/ppc/ppc64/ramdisk.image.gz","/tftpboot/xcat/$os/$arch/initrd.img"); + } else { + $callback->({error=>["Plugin doesn't know how to handle architecture $arch"],errorcode=>[1]}); + next; + } $doneimgs{"$os|$arch"}=1; } #We have a shot... diff --git a/xCAT-server-2.0/usr/lib/xcat/plugins/yaboot.pm b/xCAT-server-2.0/usr/lib/xcat/plugins/yaboot.pm new file mode 100644 index 000000000..dc3a91efa --- /dev/null +++ b/xCAT-server-2.0/usr/lib/xcat/plugins/yaboot.pm @@ -0,0 +1,168 @@ +# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html +package xCAT_plugin::yaboot; +use Data::Dumper; +use Sys::Syslog; +use Socket; + +my $request; +my $callback; +my $dhcpconf = "/etc/dhcpd.conf"; +my $tftpdir = "/tftpboot"; +#my $dhcpver = 3; + +my %usage = ( + "nodeset" => "Usage: nodeset [install|shell|boot|runcmd=bmcsetup]", +); +sub handled_commands { + return { + nodeset => "noderes:netboot" + } +} + +sub check_dhcp { + #TODO: omapi magic to do things right + my $node = shift; + my $dhcpfile; + open ($dhcpfile,$dhcpconf); + while (<$dhcpfile>) { + if (/host $node\b/) { + close $dhcpfile; + return 1; + } + } + close $dhcpfile; + return 0; +} + +sub getstate { + my $node = shift; + if (check_dhcp($node)) { + if (-r $tftpdir . "/etc/".$node) { + my $fhand; + open ($fhand,$tftpdir . "/etc/".$node); + my $headline = <$fhand>; + close $fhand; + $headline =~ s/^#//; + chomp($headline); + return $headline; + } else { + return "boot"; + } + } else { + return "discover"; + } +} + +sub setstate { +=pod + + This function will manipulate the yaboot structure to match what the noderes/chain tables indicate the node should be booting. + +=cut + my $node = shift; + my $restab = xCAT::Table->new('noderes'); + my $kern = $restab->getNodeAttribs($node,['kernel','initrd','kcmdline']); + my $pcfg; + open($pcfg,'>',$tftpdir."/etc/".$node); + my $chaintab = xCAT::Table->new('chain'); + my $cref=$chaintab->getNodeAttribs($node,['currstate']); + if ($cref->{currstate}) { + print $pcfg "#".$cref->{currstate}."\n"; + } + print $pcfg "timeout=5\n"; + #print $pcfg "LABEL xCAT\n"; + my $chaintab = xCAT::Table->new('chain'); + my $stref = $chaintab->getNodeAttribs($node,['currstate']); + if ($stref and $stref->{currstate} eq "boot") { + #TODO use omapi to set the filename so no netboot is attempted? + print $pcfg "bye\n"; + close($pcfg); + } elsif ($kern and $kern->{kernel}) { + #It's time to set yaboot for this node to boot the kernel.. + print $pcfg "image=".$kern->{kernel}."\n\tlabel=xcat\n"; + if ($kern and $kern->{initrd}) { + print $pcfg "\tinitrd=".$kern->{initrd}."\n"; + } + if ($kern and $kern->{kcmdline}) { + print $pcfg "\tappend=\"".$kern->{kcmdline}."\"\n"; + } + close($pcfg); + my $inetn = inet_aton($node); + unless ($inetn) { + syslog("local1|err","xCAT unable to resolve IP for $node in yaboot plugin"); + return; + } + } else { #TODO: actually, should possibly default to xCAT image? + print $pcfg "bye\n"; + close($pcfg); + } + my $ip = inet_ntoa(inet_aton($node));; + unless ($ip) { + syslog("local1|err","xCAT unable to resolve IP in yaboot plugin"); + return; + } + my @ipa=split(/\./,$ip); + my $pname = sprintf("%02x%02x%02x%02x",@ipa); + link($tftpdir."/etc/".$node,$tftpdir."/etc/".$pname); +} + + + +my $errored = 0; +sub pass_along { + my $resp = shift; + $callback->($resp); + if ($resp and $resp->{errorcode} and $resp->{errorcode}->[0]) { + $errored=1; + } +} + + + + + +sub process_request { + $request = shift; + $callback = shift; + my $sub_req = shift; + my @args; + my @nodes; + if (ref($request->{node})) { + @nodes = @{$request->{node}}; + } else { + if ($request->{node}) { @nodes = ($request->{node}); } + } + unless (@nodes) { + if ($usage{$request->{command}->[0]}) { + $callback->({data=>$usage{$request->{command}->[0]}}); + } + return; + } + + if (ref($request->{arg})) { + @args=@{$request->{arg}}; + } else { + @args=($request->{arg}); + } + unless ($args[0] eq 'stat' or $args[0] eq 'enact') { + $sub_req->({command=>['setdestiny'], + node=>\@nodes, + arg=>[$args[0]]},\&pass_along); + } + if ($errored) { return; } + foreach (@nodes) { + my %response; + $response{node}->[0]->{name}->[0]=$_; + if ($args[0] eq 'stat') { + $response{node}->[0]->{data}->[0]= getstate($_); + $callback->(\%response); + } elsif ($args[0] eq 'enact') { + setstate($_); + } elsif ($args[0]) { #If anything else, send it on to the destiny plugin, then setstate + setstate($_); + } + } +} + + +1;