#!/usr/bin/perl BEGIN { $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : -d '/opt/xcat' ? '/opt/xcat' : '/usr'; } use lib "$::XCATROOT/lib/perl"; use strict; use Getopt::Long; require xCAT::MsgUtils; require xCAT::DSHCLI; use xCAT::Utils; use Term::ANSIColor; use File::Basename; # genimage is a wrapper to the genimages located in # /opt/xcat/share/xcat/netboot// # put tab completion # colors # remember the last one done $::XCATROOT = "/opt/xcat"; my $os = ""; my $profile = ""; my $interface = ""; my $version; my $drivers = ""; my $otherInterfaces = ""; my $kernel = ""; my @oses; # available OSes. my @profiles; # available profiles my $profDir; # root where you do ./genimage from my $help; my $match = 0; #----------------------------------------------------------------------------- =head3 print_usage - usage message =cut #----------------------------------------------------------------------------- sub print_usage { print "Usage: genimage -h\n"; print " genimage -v\n"; print " genimage [-i ] [-n ] [-r ]\n [-o ] [-p ] [-k ]\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"; return; } if (!GetOptions( 'o=s' => \$os, 'i=s' => \$interface, 'p=s' => \$profile, 'n=s' => \$drivers, 'k=s' => \$kernel, 'r=s' => \$otherInterfaces, 'h|help' => \$help, 'v|version' => \$version )) { &print_usage; exit 1; } if($help){ print "genimage is a shell for the genimage located in /opt/xcat/share/xcat/netboot/.\n"; &print_usage; exit 0; } if ($version){ my $version = xCAT::Utils->Version(); xCAT::MsgUtils->message("N", $version); exit 0; } 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"), "Available OSes: \n", color("reset"); foreach(@oses){ print color("yellow bold"), "$_\n", color("reset"); } # 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 = ; 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"), "os: $os\n", 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"), "$_\n", color("reset"); } # 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 = ; chomp($profile); if($profile eq ""){ $profile = $profiles[0]; last; } foreach(@profiles){ if($profile eq $_){ $match = 1; } } if($match eq 1){ last; } } } print color("cyan"), "profile: $profile\n", color("reset"); # 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 = ; chomp($interface); if($interface eq ""){ $interface = "eth0"; last; }else{ print "You want your stateless machines to boot off of "; print color("cyan"), $interface ,color("reset"); print "? "; print color("bold"),"[Y/n] ", color("reset"); my $conf = ; chomp($conf); if($conf eq ""){ last; } if($conf =~ /Y|y|[Yy][Ee][Ss]/){ last; } } } } print color("cyan"), "interface: $interface\n", color("reset"); # get drivers unless($drivers){ while(1){ print "Which network drivers will you need? (press enter if you're not sure) "; print color("bold"), "\n[igb,e1000e,e1000,bnx2,tg3] ", color("reset"); $drivers = ; 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"), $drivers ,color("reset"); print "? "; print color("bold"),"[Y/n] ", color("reset"); my $conf = ; chomp($conf); if($conf eq ""){ last; } if($conf =~ /Y|y|[Yy][Ee][Ss]/){ last; } } } } print color("cyan"), "$drivers\n", color("reset"); # 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 = ; 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 = ; chomp($tmp); if($tmp eq ""){ last; }else{ print "You want to also set up:"; print color("cyan"), $tmp ,color("reset"); print "? "; print color("bold"),"[Y/n] ", color("reset"); my $conf = ; 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"), "Other Interfaces: $otherInterfaces\n", color("reset"); } # get kernel info unless($kernel){ while(1){ print "Which kernel do you want to use? ["; print color("bold"), "default" , color("reset"); print "] "; $kernel = ; chomp($kernel); if($kernel eq ""){ # special case of RHEL5.4 where kenrel must be specified or you # get some other one if($os eq "rhels5.4"){ $kernel = "2.6.18-164.el5"; } last; }else{ print "You want to use: "; print color("cyan"), $kernel ,color("reset"); print "? "; print color("bold"),"[Y/n] ", color("reset"); my $conf = ; chomp($conf); if($conf eq ""){ last; } if($conf =~ /Y|y|[Yy][Ee][Ss]/){ last; } } } } # end unless kernel if($kernel){ print color("blue"), "kernel: $kernel\n", color("reset"); } 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"; } print color("cyan"), "cd $profDir\n", color("reset"); print color("cyan"), "$cmd\n", color("reset"); exec("cd $profDir; $cmd");