xcat-core/xCAT-client/bin/genimage
2009-12-15 20:27:36 +00:00

379 lines
8.4 KiB
Perl
Executable File

#!/usr/bin/perl
use strict;
use Term::ANSIColor;
use File::Basename;
use Getopt::Long;
# genimage is a wrapper to the genimages located in
# /opt/xcat/share/xcat/netboot/<os>/
# put tab completion
# colors
# remember the last one done
$::XCATROOT = "/opt/xcat";
my $os = "";
my $profile = "";
my $interface = "";
my $drivers = "";
my $otherInterfaces = "";
my $kernel = "";
my $method = "";
my @oses; # available OSes.
my @profiles; # available profiles
my $profDir; # root where you do ./genimage from
my $help;
my $match = 0;
my $color = 0;
GetOptions(
'o=s' => \$os,
'i=s' => \$interface,
'p=s' => \$profile,
'n=s' => \$drivers,
'k=s' => \$kernel,
'r=s' => \$otherInterfaces,
'h|help' => \$help,
'm=s' => \$method,
'c' => \$color
);
if($help){
print 'genimage is a shell for the genimage located in /opt/xcat/share/xcat/netboot/<osfamily>/\n';
print 'Usage: genimage [-i <nodebootif>] [-n <nodenetdrivers>] [-r <otherifaces>] [-o <OSVER>] [-p <PROFILE>] [-k <KERNELVER>] <-m statelite>'."\n";
print "Examples:\n";
print " genimage -i eth0 -n igb,e1000e,bnx2 -o centos5.4 -p compute\n";
print " genimage -o suse11\n";
print " genimage\n";
exit 1;
}
unless($os){
# get the install directory
my $installdir = `gettab key=installdir site.value`;
chomp($installdir);
# lots of error checking to make sure it exists.
if($installdir eq ''){
print "Could not get install directory from site table. Assuming your OSes are stored in '/install'\n";
$installdir = "/install";
}
unless(-d $installdir){
print "The directory where your OS distributions resides: $installdir does not exist. Please check site table\n";
exit 1;
}
my @dircontents = `ls $installdir`;
chomp(@dircontents);
foreach (@dircontents) {
if($_ =~ /(rhel|fedora|sl|centos|suse)/){
push @oses,$_;
}
}
if($#oses eq -1){
print "There are no OS repositories in $installdir. Please run copycds for the OS first.\n";
exit 1;
}
# now they have the OSes, make sure they select one that is available
$match = 0;
while(1){
print color("bold") if $color;
print "Available OSes: \n";
print color("reset") if $color;
foreach(@oses){
print color("yellow bold") if $color;
print "$_\n";
print color("reset") if $color;
}
# default is the first OS cause in many cases, they'll only have 1.
print "Which OS to you want to build a netboot image for? [";
print color("bold"), $oses[0] , color("reset");
print "] ";
$os = <stdin>;
chomp($os);
if($os eq ""){
$os = @oses[0];
last;
}
foreach(@oses){
if($os eq $_){
$match = 1;
}
}
if($match){
last;
}else{
print color("red bold"), "$os is not found in '$installdir'\n", color("reset");
}
}
chomp($os);
}
print color("cyan") if $color;
print "os: $os\n";
print color("reset");
### Get the Profile ####
my $osfamily = $os;
$osfamily =~ s/\d+//g;
$osfamily =~ s/\.//g;
if($osfamily =~ /rh/){
$osfamily = "rh";
}
#print "OSfamily: $osfamily\n";
$profDir = "$::XCATROOT/share/xcat/netboot/$osfamily";
unless(-d $profDir){
print color("red bold") , "Unable to find profiles in $profDir\n", color("reset");
exit 1;
}
unless($profile){
my @proList = `ls $profDir/*.pkglist`;
my %seen = ();
foreach (@proList) {
my $f = basename($_);
$f =~ s/([^\.]*).*/$1/;
chomp($f);
$seen{$f}++;
}
@profiles = keys %seen;
if($#profiles eq -1){
print color("red bold"), "There are no profiles in $::XCATROOT/share/xcat/netboot/$osfamily.\n", color("reset");
exit 1;
}
$match = 0;
while(1){
print color("bold"), "Available Profiles for $os: \n", color("reset");
foreach(@profiles){
print color("yellow bold") if $color;
print "$_\n";
print color("reset") if $color;
}
# default is the first OS cause in many cases, they'll only have 1.
print "Which profile do you want to use for $os? [";
print color("bold"), $profiles[0] , color("reset");
print "] ";
$profile = <stdin>;
chomp($profile);
if($profile eq ""){
$profile = $profiles[0];
last;
}
foreach(@profiles){
if($profile eq $_){
$match = 1;
}
}
if($match eq 1){
last;
}
}
}
print color("cyan") if $color;
print "profile: $profile\n";
print color("reset") if $color;
# get the interface
unless($interface){
while(1){
print "Which network interface do you want the image to boot from? [";
print color("bold"), "eth0" ,color("reset");
print "] ";
$interface = <stdin>;
chomp($interface);
if($interface eq ""){
$interface = "eth0";
last;
}else{
print "You want your stateless machines to boot off of ";
print color("cyan") if $color;
print $interface;
print color("reset") if $color;
print "? ";
print color("bold"),"[Y/n] ", color("reset");
my $conf = <stdin>;
chomp($conf);
if($conf eq ""){
last;
}
if($conf =~ /Y|y|[Yy][Ee][Ss]/){
last;
}
}
}
}
print color("cyan") if $color;
print "interface: $interface\n";
print color("reset") if $color;
# get drivers
unless($drivers){
while(1){
print "Which network drivers will you need? (press enter if you're not sure) ";
print color("bold");
print "\n[igb,e1000e,e1000,bnx2,tg3] ";
print color("reset");
$drivers = <stdin>;
chomp($drivers);
if($drivers eq ""){
$drivers = "igb,e1000e,e1000,bnx2,tg3";
last;
}else{
print "You want to use the following driver(s):";
print color("cyan") if $color;
print $drivers;
print color("reset") if $color;
print "? ";
print color("bold"),"[Y/n] ", color("reset");
my $conf = <stdin>;
chomp($conf);
if($conf eq ""){
last;
}
if($conf =~ /Y|y|[Yy][Ee][Ss]/){
last;
}
}
}
}
print color("cyan") if $color;
print "$drivers\n";
print color("reset") if $color;
# get other interfaces
unless($otherInterfaces){
while(1){
print "Do you need to set up other interfaces? ";
print color("bold"), "[y/N] ",color("reset");
my $conf = <stdin>;
chomp($conf);
if($conf eq "" || $conf =~/N|n|[Nn][Oo]/){
$otherInterfaces ="";
last;
}else{
$otherInterfaces = "eth1";
if($otherInterfaces eq $interface){
$otherInterfaces = "eth0";
}
print "What other interface do you need? [";
print color("bold"), $otherInterfaces, color("reset");
print "] ";
my $tmp = <stdin>;
chomp($tmp);
if($tmp eq ""){
last;
}else{
print "You want to also set up:";
print color("cyan") if $color;
print $tmp ;
print color("reset") if $color;
print "? ";
print color("bold"),"[Y/n] ", color("reset");
my $conf = <stdin>;
chomp($conf);
if($conf eq ""){
$otherInterfaces = $tmp;
last;
}
if($conf =~ /Y|y|[Yy][Ee][Ss]/){
last;
}
} #end confirmation
} # end part where they don't want default
} # end question loop
} # end getting other interfaces
if($otherInterfaces){
print color("cyan") if $color;
print "Other Interfaces: $otherInterfaces\n";
print color("reset") if $color;
}
# get kernel info
unless($kernel){
while(1){
print "Which kernel do you want to use? [";
print color("bold"), "default" , color("reset");
print "] ";
$kernel = <stdin>;
chomp($kernel);
if($kernel eq ""){
# special case of RHEL5.4 where kenrel must be specified or you
# get some other one
if($os =~ /rhels5.4|centos5.4/){
$kernel = "2.6.18-164.el5";
}
last;
}else{
print "You want to use: ";
print color("cyan") if $color;
print $kernel;
print color("reset") if $color;
print "? ";
print color("bold"),"[Y/n] ", color("reset");
my $conf = <stdin>;
chomp($conf);
if($conf eq ""){
last;
}
if($conf =~ /Y|y|[Yy][Ee][Ss]/){
last;
}
}
}
} # end unless kernel
unless($method){
while(1){
print "Do you want the image to be statelite? [";
print color("bold"), "[y/N] ", color("reset");
my $conf = <stdin>;
chomp($conf);
if($conf =~ /Y|y|[Yy][Ee][Ss]/){
$method = "statelite";
last;
}
if($conf eq ""){
last;
}
if($conf =~ /N|n|[Nn][Oo]/){
last;
}
}
}
if($kernel){
print color("blue") if $color;
print "kernel: $kernel\n";
print color("reset") if $color;
}
print "Generating image:\n";
my $cmd = "./genimage -i $interface -n $drivers -o $os -p $profile ";
if($kernel){
$cmd .= " -k $kernel";
}
if($otherInterfaces){
$cmd .= " -r $otherInterfaces";
}
if($method){
$cmd .= " -m $method";
}
print color("cyan") if $color;
print "cd $profDir\n";
print color("reset") if $color;
print color("cyan") if $color;
print "$cmd\n";
print color("reset") if $color;
exec("cd $profDir; $cmd");