diff options
Diffstat (limited to 'perl-install/ftp.pm')
-rw-r--r-- | perl-install/ftp.pm | 84 |
1 files changed, 57 insertions, 27 deletions
diff --git a/perl-install/ftp.pm b/perl-install/ftp.pm index e6c27e68c..a82729c6e 100644 --- a/perl-install/ftp.pm +++ b/perl-install/ftp.pm @@ -1,19 +1,18 @@ -package ftp; +package ftp; # $Id$ use Net::FTP; use install_any; +use network; use log; -# non-rentrant!! +my %hosts; -my %options = (Passive => 1); -$options{Firewall} = $ENV{PROXY} if $ENV{PROXY}; -$options{Port} = $ENV{PROXYPORT} if $ENV{PROXYPORT}; -my @l; -unless ($ENV{HOST}) { - # must be in kickstart, using URLPREFIX to find out information - ($ENV{LOGIN}, $ENV{PASSWORD}, $ENV{HOST}, $ENV{PREFIX}) = @l = +1; + +sub fromEnv() { + # using URLPREFIX to find out information if kickstart + ($ENV{LOGIN}, $ENV{PASSWORD}, $ENV{HOST}, $ENV{PREFIX}) = $ENV{URLPREFIX} =~ m| :// (?: ([^:]*) # login @@ -21,29 +20,60 @@ unless ($ENV{HOST}) { @)? ([^/]*) # host /?(.*) # prefix - |x; -} -unless ($ENV{LOGIN}) { - $ENV{LOGIN} = 'anonymous'; - $ENV{PASSWORD} = 'mdkinst@test'; + |x unless $ENV{HOST}; + + @ENV{qw(HOST PREFIX LOGIN PASSWORD)}; } -my $host = $ENV{HOST}; -if ($host !~ /^[.\d]+$/) { - $host = join ".", unpack "C4", (gethostbyname $host)[4]; - print ">>>>> $host <<<<<<\n"; -} +sub new { + my ($host, $prefix, $login, $password) = @_; + my @l = do { if ($hosts{"$host$prefix"}) { + @{$hosts{"$host$prefix"}}; + } else { + my %options = (Passive => 1, Timeout => 60, Port => 21); + $options{Firewall} = $ENV{PROXY} if $ENV{PROXY}; + $options{Port} = $ENV{PROXYPORT} if $ENV{PROXYPORT}; + unless ($login) { + $login = 'anonymous'; + $password = '-drakx@'; + } -my $ftp = Net::FTP->new($host, %options) or die; -$ftp->login($ENV{LOGIN}, $ENV{PASSWORD}) or die; -$ftp->binary; + my $ftp = Net::FTP->new(network::resolv($host), %options) or die ''; + $ftp->login($login, $password) or die ''; + $ftp->binary; + $ftp->cwd($prefix); -my $retr; + my @l = ($ftp, \ (my $retr = undef)); + $hosts{"$host$prefix"} = \@l; + @l; + }}; + wantarray ? @l : $l[0]; +} -1; +sub getFile { + my $f = shift; + my ($ftp, $retr) = new(@_ ? @_ : fromEnv); + $$retr->close if $$retr; + $$retr = $ftp->retr($f) or rewindGetFile(); + $$retr ||= $ftp->retr($f); +} + +#-sub closeFiles() { +#- #- close any existing connections +#- foreach (values %hosts) { +#- my $retr = $_->[1] if ref $_; +#- $$retr->close if $$retr; +#- undef $$retr; +#- } +#-} +sub rewindGetFile() { + #- close any existing connection. + foreach (values %hosts) { + my ($ftp) = @{$_ || []}; + $ftp->close() if $ftp; + } -sub getFile($) { - $retr->close if $retr; - $retr = $ftp->retr($ENV{PREFIX} . "/" . install_any::relGetFile($_[0])); + #- make sure to reconnect to server. + %hosts = (); } |