# -*-perl-*-

$xinstalled = 0;

sub load_series {
    local ( $series_version, $series_file, $series_name );

    if ($installsource eq "ftp") {
	$series_file = $ftp_series_file;
    } elsif ($installsource eq "floppy") {
	$series_file = "/tmp/series";
    } else {
	$series_file = "/image/RedHat/base/series";
    }

    open(S, $series_file);
    $series_version = <S>;
    chop($series_version);
    $series_name = "";
    @series_names = ();
    $series_count = 0;
    while (<S>) {
	chop;
	( $first, $rest ) = split;
	next if ($first eq "");
	next if ($first =~ /^\#/);
	next if ($first =~ /@/);
	if ($first eq "end") {
	    $series_package_count{$series_name} = $count;
	    $series_name = "";
	    next;
	}
	if (! $series_name) {
	    ($default, $series_name) = $_ =~ /^([01])\s*(.*)/;
	    $series_names[$series_count] = $series_name;
	    $series_count++;
	    $count = 0;
	} else {
	    $series_packages{"$series_name:$count"} = $first;
	    $count++;
	}
    }
    close(S);
}

sub series_select {
    local (@s);

    if (! $series_loaded) {
	&load_series;
	$series_loaded = 1;
    }

    @series_to_install = ("Base");
    @s = ();
    foreach (@series_names) {
	if ($_ ne "Base") {
	    push (@s, $_);
	}
    }

    if (! &rhs_checklistl("Select Series",
<<EOM
>
Select each series that you want to install. 
The Base series is not shown, but is always installed.
>
EOM
                              , 78, scalar(@s), @s)) {
	return 0;
    }
    
    foreach (@dialog_result) {
	push (@series_to_install, $_);
	if ($_ =~ /.*X Windows.*/) {
	    $xinstalled = 1;
	}
    }

    if ($xinstalled) {
	&select_x_server;
	$xserver_rpm = "XFree86-$xserver";
    }

    return 1;
}

sub series_install {
    local ( $rpms, @rpms, @avail_list, @files );
    local ( $file, $count, $total, $nogauge, $failed_packages );
    local ( $msg, $omsg, $res, %doshack, $filename, %already_installed );
    local ( $error );

    &get_rpms_list(*rpms) || return 0;

    $total = scalar(@rpms);
    $failed_packages = "";
    $nogauge = 1;
    foreach $rpm (@rpms) {
	$count++;

	$filename = $rpm;
	$filename =~ s|.*\/||;

	$already_installed{$filename} && next;
	$already_installed{$filename} = 1;

	undef($removefile);
	if ($installsource eq "floppy") {
	    $msg = ">\n" . 
		   "> Reading       : $filename\n" .
                   "> Package Number: $count of $total\n" .
		   ">\n";
	    if ($nogauge) {
		&rhs_gauge("Package Installation", $msg, 70, 0);
		$nogauge = 0;
	    } else {
		&rhs_update_gauge_and_message($msg, 0);
	    }

	    &floppy_copy_file($filename, "/mnt/tmp", *nogauge);
	    $nogauge = 1;
	    $removefile = "/mnt/tmp/$filename";
	}

	# print "getting ready to rpm -i $rpm <>\n";
	# <STDIN>;
	
	open (INST, "rpm -i --percent --force --root /mnt $rpm 2>&1 |");

	if ($installsource eq "ftp") {
	    $msg = ">\n" . 
		   "> Downloading   : $filename\n" .
                   "> Package Number: $count of $total\n" .
		   ">\n";
	} else {
	    $msg = ">\n" . 
		   "> Installing    : $filename\n" .
                   "> Package Number: $count of $total\n" .
		   ">\n";
	}
	if ($nogauge) {
	    &rhs_gauge("Package Installation", $msg, 70, 0);
	    $nogauge = 0;
	} else {
	    &rhs_update_gauge_and_message($msg, 0);
	}

	while (<INST>) {
	    if (/.*failed.*/) {
		$failed_packages .= " " . $file;
		&rhs_stop_gauge;
		$nogauge = 1;
		if ($installsource eq "ftp") {
		    $error = "FTP";
		} else {
		    $error = "Package install";
		}
		&rhs_infobox("$error Failed", 
			     ">\n" .
			     "> $error of $filename failed.\n" .
			     ">\n",
			    , 60);
		sleep(3);
	    }

	    if (/^%%/) {
		# Update (and create if necessary) the gauge
		$omsg = $msg;
		$_ =~ m|%% (.*)|;
		$percent = int($1);
		$percent = 0 if (! $percent);
		if ($percent > 99) {
		    $msg = ">\n".
			   "> Recording     : $filename\n" .
                           "> Package Number: $count of $total\n" .
			   ">\n";
		} else {
		    $msg = ">\n".
			   "> Installing    : $filename\n" .
                           "> Package Number: $count of $total\n" .
			   ">\n";
		}
		if ($nogauge) {
		    &rhs_gauge("Package Installation", $msg, 70, $percent);
		    $nogauge = 0;
		} else {
		    if ($msg ne $omsg) {
			&rhs_update_gauge_and_message($msg, $percent);
		    } else {
			&rhs_update_gauge($percent);
		    }
		}
	    }
	}
	close(INST);

	$removefile && unlink($removefile);
    }

    if ($failed_packages) {
	if ($installsource eq "ftp") {
	    $error = ", probably due to FTP failure.";
	} else {
	    $error = ".";
	}
	&rhs_msgbox("Failed Packages",
<<EOM
>
The following packages failed to install$error
You may wish to
install these packages after completing the
installation.
>
$failed_packages
>
EOM
		    , 70);
    }

#    &rhs_msgbox("Package Installation",
#<<EOM
#>
#Package Installation is complete.
#>
#EOM
#		, 70);

    return 1;
}

sub generate_rpms_to_install {
    local ( @avail ) = @_;
    local ( @series_rpms );
    local ( $rpm, @rpms_to_install );

    # First generate a uniq list of package names
    foreach (@series_to_install) {
	foreach $x (0 .. $series_package_count{$_}) {
	    if (! &member($series_packages{"$_:$x"}, @series_rpms)) {
		push(@series_rpms, $series_packages{"$_:$x"});
	    }
	}
    }
    if ($xinstalled) {
	push(@series_rpms, $xserver_rpm);
    }

    foreach $rpm (@avail) {
	$rpm =~ /(.*)-.*-.*\..*\.rpm/;
	$name = $1;
	if (&member($name, @series_rpms)) {
	    push(@rpms_to_install, $rpm);
	}
    }

    return @rpms_to_install;
}

sub get_rpms_list {
    local (*rpms) = @_;
    local (@files, @avail_list, %doshack, @rpms_to_install, @tmprpms);

    ($installsource eq "nfs" || $installsource eq "cdrom") && do {
	opendir(D, "/image/RedHat/RPMS");
	@files = readdir(D);
	closedir(D);
	@avail_list = grep(m|.*\.rpm|, @files);
	@rpms_to_install = &generate_rpms_to_install(@avail_list);
	@rpms = sort(grep(s|^|/image/RedHat/RPMS/|, @rpms_to_install));
    } ;

    ($installsource eq "hard drive")  && do {
	require "rpmhead";

	&get_name_file_dict(*doshack) || return 0;

	@avail_list = keys(%doshack);
	@rpms_to_install = &generate_rpms_to_install(@avail_list);

	foreach (@rpms_to_install) {
	    push(@tmprpms, $doshack{$_});
	}

	@rpms = sort(grep(s|^|/image/RedHat/RPMS/|, @tmprpms));
    };

    ($installsource eq "ftp")  && do {
	&ftp_get_file_list(*files) || return 0;

	# Generate the list of rpms
	@avail_list = grep(m|.*\.rpm|, @files);
	@rpms_to_install = &generate_rpms_to_install(@avail_list);
	@rpms = sort(grep(s|^|ftp://$ftp_site$ftp_dir/RedHat/RPMS/|, 
                       @rpms_to_install));
    } ;

    ($installsource eq "floppy") && do {
	@avail_list = &floppy_get_rpm_list();
	@rpms_to_install = &generate_rpms_to_install(@avail_list);
	@rpms = &floppy_sort_rpms(@rpms);
	@rpms = grep(s|^|/mnt/tmp/|, @rpms_to_install);
    };


    return 1;
}

#########
1;
