#!/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/<os>/
# 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 <nodebootif>] [-n <nodenetdrivers>] [-r <additional_nics>]\n                [-o <os>] [-p <profile>] [-k <kernal_version>] [-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";
   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/<osfamily>.\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 = <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);
}
$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";
}

#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 = <stdin>;
		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 = <stdin>;
		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 = <stdin>;
			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 = <stdin>;
		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 = <stdin>;
			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 = <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: ";
				$color && print color("cyan"); 
				print $tmp;
				$color && print color("reset");
				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){
	$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 = <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|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 = <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){
	$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");