#!/usr/bin/perl 
# -*-perl-*-

#use strict;
#use diagnostics;

use Net::FTP;

# deal with arguments
my $vardir = $ARGV[0];
my $method = $ARGV[1];
my $option = $ARGV[2];

if ($option eq "manual") {
    print "Enter package file names or a blank line to finish\n";
    while(1) {
	print "Enter package file name:";
	my $fn = <STDIN>;
	chomp $fn;
	if ( $fn == "") {
	    exit 0;
	}
	if ( -f $fn ) {
	    system ("dpkg", "--merge-avail", $fn);
	} else {
	    print "Couldn't find $fn, try again\n";
	}
    };
};

#print "vardir: $vardir, method: $method, option: $option\n";

my $arch=`dpkg --print-architecture`;
$arch='i386' if $?;
chomp $arch;
my $exit = 0;

# get info from control file
do "$vardir/methods/ftp/vars" or die "Couldn't find state file (re-run Access method)";

chdir "$vardir/methods/ftp";

print "Getting Packages files...(stop with ^C)\n\n";

my @pkgfiles;

sub download {
    print "Connecting to $::ftpsite...\n";
    my $ftp = Net::FTP->new($::ftpsite, Passive => $::passive);
    if(!$ftp || !$ftp->ok) { print "Failed to connect\n"; die "error"; }
#    $ftp->debug(1);
    print "Login as $::username...\n";
    my $pass = $::password;
    if($pass eq "?") {
	print "Enter password for ftp: ";
	system("stty", "-echo");
	$pass = <STDIN>;
	chomp $pass;
	print "\n";
	system("stty", "echo");
    }
    if(!$ftp->login($::username, $pass)) { print $ftp->message() . "\n"; die "error"; }
    print "Setting transfer mode to binary...\n";
    if(!$ftp->binary()) { print $ftp->message . "\n"; die "error"; }
    print "Cd to $::ftpdir...\n";
    if(!$ftp->cwd($::ftpdir)) { print $ftp->message . "\n"; die "error"; }
#    if(!$ftp->pasv()) { print $ftp->message . "\n"; die "error"; }
    
    my @dists = split(/ +/, $::distribs);
    my $dist;
    foreach $dist (@dists) {
	my $dir = "$dist/binary-$arch";
	print "Getting Packages file from $dir...\n";
	my $got_pkgfile = 0;
	-f "Packages.gz" and unlink "Packages.gz";
	-f "Packages" and unlink "Packages";
	if ($ftp->get("$dist/binary-$arch/Packages.gz", "Packages.gz")) {
	    if(system("gunzip", "Packages.gz")) {
		print "Couldn't gunzip Packages.gz, stopped";
		die "error";
	    }
	} elsif(!$ftp->get("$dist/binary-$arch/Packages", "Packages")) {
	    print "Couldn't find Packages[.gz] in $dir, stopped";
	    die "error";
	} 
	$dist =~ tr/\//_/;
	if(!rename "Packages", "Packages.$dist") {
	    print "Couldn't rename Packages to Packages.$dist";
	    die "error";
	}
	push @pkgfiles, "Packages.$dist";
    }
    $ftp->quit();
}
eval {
    local $SIG{INT} = sub {
	die "Interrupted!\n";
    };
    download();
};
if($@) {
    if($@ =~ /timeout/i) {
	print "FTP TIMEOUT\n";
    } else {
	print "FTP ERROR\n";
    }
    $exit = 1;
};

my $ans;

if(!$exit) { # don't clear if we had an error
    print <<EOM;

It is a good idea to clear the available list of old packages.
However if you have only downloaded a Package files from non-main
distributions you might not want to do this.

EOM
    print "Do you want to clear available list [y]: ";
    $ans=<STDIN>;
    chomp $ans;
    if($ans =~ /^Yy/) {
	if(system("dpkg", "--clear-avail")) {
	    print "dpkg --clear-avail failed.";
	    die "error";
	}
    }
}

my $file;

foreach $file (@pkgfiles) {
    if(system ("dpkg", "--merge-avail", $file)) {
	print "Dpkg merge available failed on $file";
	$exit = 1;
    }
}

if(system("dpkg", "--forget-old-unavail")) {
    print "dpkg --forget-old-unavail failed";
    die "error";
}

exit $exit;
