summaryrefslogtreecommitdiffstats
path: root/perl-install/ftp.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/ftp.pm')
-rw-r--r--perl-install/ftp.pm84
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 = ();
}