#!/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// # 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//\n'; print 'Usage: genimage [-i ] [-n ] [-r ] [-o ] [-p ] [-k ] <-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 = ; 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 = ; 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 = ; 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 = ; 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 = ; 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 = ; 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 = ; 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") if $color; print $tmp ; print color("reset") if $color; 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") 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 = ; 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 = ; 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){ 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");