#!/usr/bin/perl

use Expect;
use File::Copy;
use lib '/var/spool/baracus/www/modules';
use BATools qw(:standard);
use MIME::Base64;

$Expect::Log_Stdout=1;

my $filePath = "/$BATools::baPath/htdocs/pool/";
my $logPath = "/$BATools::baPath/tmp/";

my $op = @ARGV[0];
my $distro = @ARGV[1]; 
my $addon = @ARGV[2]
my $user = @ARGV[3]; 
my $ePass = @ARGV[4];

my $paddr = @ARGV[5];
my $puser = @ARGV[6];
my $pePass = @ARGV[7];

my $fileName = @ARGV[7]; 

if( $addon ne "NOADDON")
{
		$addon = "--addon $addon";
}
else
{
	$addon = "";
}

my $log = $fileName."-log";
my $cmd = "sudo /usr/sbin/basource $op --distro=$distro $addon -i -p";

my $pass = decode_base64( $ePass);
my $ppass = decode_base64( $pePass);

#Debug Code
open (TF, ">/tmp/baexpect.log") || die "Error: $!";
my $argc = @ARGV;
print TF "fn: $fileName\n";
print TF "path: $filePath\n";
print TF "ePass: $ePass\n";
print TF "pass: $pass\n";
print TF "op: $op\n";
print TF "distro: $distro\n";
print TF "user: $user\n";
print TF "log: $log\n";
print TF "cmd: $cmd\n";
print TF "call: $0\n";
print TF "argc: $argc\n";
print TF "paddr: $paddr\n";
print TF "puser: $puser\n";
print TF "ppass: $ppass\n";
print TF "pePass: $pePass\n";
close(TF);
# Close Debug Code

my $date = `date`;
$fileName = $filePath.$fileName;
$log = $logPath.$log;

chomp($date);
my $header = "basource $op $distro --iso --proxy ----- $date\n\n";

open (NEWFILE, ">$fileName") || die "Error: $!";
print NEWFILE "$header";
close (NEWFILE);

open (LOGFILE, ">$log") || die "Error: $!";
print LOGFILE "$header";
close (LOGFILE);

(my $ba = Expect->spawn( $cmd)) || die "Couldn't spawn basource, $!";
$ba->log_file($log);

unless ($ba->expect(5, "address:"))
{
	#no login required - wait for process to end.
	copy( $log, $fileName);
	#$ba->expect(undef);
}
else
{
    print $ba "$paddr\r";
   
    unless ($ba->expect(10, "username:"))
    {
	    die "Never got proxy username:, ".$ba->exp_error()."\n";
    }
   
    print $ba "$puser\r";

    unless ($ba->expect(10, "password:"))
    {
	    die "Never got proxy password prompt:, ".$ba->exp_error()."\n";
    }
   
    print $ba "$ppass\r";
    
    unless ($ba->expect(10, "userid:"))
    {
	    die "Never got download username prompt:, ".$ba->exp_error()."\n";
    }
   
    print $ba "$user\r";

    unless ($ba->expect(10, "password:"))
    {
	    die "Never got download password prompt:, ".$ba->exp_error()."\n";
    }
   
    print $ba "$pass\r";
    
    unless ($ba->expect(10, "[ 0% ]"))
    {
		copy( $log, $fileName);
    }
    else
    {
      	open(FILE, "$log") or die;

		my $iter = 0;
	    while( !$ba->exitstatus())
	    {
			if( $ba->exitstatus() eq 0)
			{
				last;
			}
			
			$pos = -2;  # Use this to get past EOF and last newline
			my $char = "";
			while($char ne "\r")
			{
				seek FILE, $pos, 2;
				read FILE, $char, 1;
				$pos--;
			}
		
			$final = <FILE> ;
			print "$final\n";
			if( $final ne $finalOld)
			{
				open (NEWFILE, ">>$fileName") || die "Error: $!";
				print NEWFILE "$final\n";
				close (NEWFILE);
			}
			   
			$finalOld = $final;
			$ba->expect(2);
		}
		#close(FILE);
	    #ok, we're done

		$pos = -2;  # Use this to get past EOF and last newline
		$char = "";
		while($char ne "]")
		{
			if( !(seek FILE, $pos, 2))
			{
				last;
			}
			read FILE, $char, 1;
			$pos--;
		}
		open (NEWFILE, ">>$fileName") || die "Error: $!";
		while(<FILE>)
		{
			$final = <FILE> ;
			print NEWFILE "$final\n";
		}
		close (NEWFILE);
		close(FILE);

		$ba->log_file(undef);
	}
}

open (NEWFILE, ">>$fileName") || die "Error: $!";
print NEWFILE "\n\nFINISHED\n\n";
close (NEWFILE);

unlink($log);
sleep 60;
unlink($fileName);

