From 6ff27831b174271461f1ab27e1fc509010baed51 Mon Sep 17 00:00:00 2001 From: vallard Date: Sat, 7 Nov 2009 22:09:57 +0000 Subject: [PATCH] make genimage more convienient and easier to use by placing a wrapper on the front end that prompts for necessary components git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@4515 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-client/bin/genimage | 316 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 316 insertions(+) create mode 100755 xCAT-client/bin/genimage diff --git a/xCAT-client/bin/genimage b/xCAT-client/bin/genimage new file mode 100755 index 000000000..9940829a9 --- /dev/null +++ b/xCAT-client/bin/genimage @@ -0,0 +1,316 @@ +#!/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 @oses; # available OSes. +my @profiles; # available profiles +my $profDir; # root where you do ./genimage from +my $help; +my $match = 0; + +GetOptions( + 'o=s' => \$os, + 'i=s' => \$interface, + 'p=s' => \$profile, + 'n=s' => \$drivers, + 'k=s' => \$kernel, + 'r=s' => \$otherInterfaces, + 'h|help' => \$help +); + +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 ]'."\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"), "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");