#!/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; my $color = 0; my $method; #----------------------------------------------------------------------------- =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 ] [-m ]\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, 'm=s' => \$method, 'c' => \$color )) { &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"); print "Available OSes: \n"; print color("reset"); foreach(@oses){ $color && print color("green" ); print "$_\n"; $color && print 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); } $color && print color("cyan"); print "os: $os\n"; $color && print color("reset"); ### Get the Profile #### my $osfamily = $os; $osfamily =~ s/\d+//g; $osfamily =~ s/\.//g; if($osfamily =~ /rh/){ $osfamily = "rh"; } # OS version on s390x can contain 'sp', e.g. sles11sp1 # If the $osfamily contains 'sles' and 'sp', the $osfamily = sles if ($osfamily =~ /sles/ && $osfamily =~ /sp/) { $osfamily = "sles"; } #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){ $color && print color("green"); print "$_\n"; $color && print 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; } } } $color && print color("cyan"); print "profile: $profile\n"; $color && print 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 "; $color && print color("cyan"); print "$interface"; $color && print 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; } } } } $color && print color("cyan"); print "interface: $interface\n"; $color && print 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): "; $color && print color("cyan"); print $drivers; $color && 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; } } } } $color && print color("cyan"); print "$drivers\n"; $color && print 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: "; $color && print color("cyan"); print $tmp; $color && print 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){ $color && print color("cyan"); print "Other Interfaces: $otherInterfaces\n"; $color && 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 =~ /rhels5.4|centos5.4|rhel5.4|sl5.4/){ $kernel = "2.6.18-164.el5"; } last; }else{ print "You want to use: "; $color && print color("cyan"); print $kernel; $color && print 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 unless($method){ while(1){ print "Do you want the image to be statelite? ["; print color("bold"), '[y/N] ', color("reset"); my $conf = ; 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){ $color && print color("blue"); print "kernel: $kernel\n"; $color && print 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"; } if($method){ $cmd .= " -m $method"; } $color && print color("cyan"); print "cd $profDir\n"; print "$cmd\n"; $color && print color("reset"); exec("cd $profDir; $cmd");