summaryrefslogtreecommitdiffstats
path: root/ftp.pm
diff options
context:
space:
mode:
authorDaouda Lo <daouda@mandriva.com>2002-03-13 15:04:36 +0000
committerDaouda Lo <daouda@mandriva.com>2002-03-13 15:04:36 +0000
commit4370059f7ace6ff794a5d520dbbe3247cf7f6bd2 (patch)
tree22e5bd368b1dbcffc6d469c294eb87a51818bc0e /ftp.pm
parentd6cb0dc6d209d18178f086e7bf4b4be4fc04c44d (diff)
downloadmgaonline-4370059f7ace6ff794a5d520dbbe3247cf7f6bd2.tar
mgaonline-4370059f7ace6ff794a5d520dbbe3247cf7f6bd2.tar.gz
mgaonline-4370059f7ace6ff794a5d520dbbe3247cf7f6bd2.tar.bz2
mgaonline-4370059f7ace6ff794a5d520dbbe3247cf7f6bd2.tar.xz
mgaonline-4370059f7ace6ff794a5d520dbbe3247cf7f6bd2.zip
add crypto.pm, ftp.pm, http.pm
Diffstat (limited to 'ftp.pm')
-rw-r--r--ftp.pm84
1 files changed, 84 insertions, 0 deletions
diff --git a/ftp.pm b/ftp.pm
new file mode 100644
index 00000000..20b837b8
--- /dev/null
+++ b/ftp.pm
@@ -0,0 +1,84 @@
+package ftp; # $Id$
+
+use Net::FTP;
+
+use network;
+use log;
+
+my %hosts;
+
+1;
+
+sub fromEnv() {
+ #- now URLPREFIX is generated from what is given by mdk-stage1 which is only this 4 variables.
+ $ENV{URLPREFIX} = "ftp://" . ($ENV{LOGIN} && ("$ENV{LOGIN}" . ($ENV{PASSWORD} && ":$ENV{PASSWORD}") . '@')) .
+ "$ENV{HOST}/$ENV{PREFIX}";
+ @ENV{qw(HOST PREFIX LOGIN PASSWORD)};
+}
+
+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;
+ foreach (1..10) {
+ $ftp = Net::FTP->new(network::resolv($host), %options) or die;
+ $ftp && $ftp->login($login, $password) and last;
+
+ log::l("ftp login failed, sleeping before trying again");
+ sleep 5 * $_;
+ }
+ $ftp or die "unable to open ftp connection to $host";
+ $ftp->binary;
+ $ftp->cwd($prefix);
+
+ my @l = ($ftp, \ (my $retr = undef));
+ $hosts{"$host$prefix"} = \@l;
+ @l;
+ }};
+ wantarray ? @l : $l[0];
+}
+
+sub getFile {
+ my ($f, @para) = @_;
+ $f eq 'XXX' and rewindGetFile(), return; #- special case to force closing connection.
+ foreach (1..3) {
+ my ($ftp, $retr) = new(@para ? @para : fromEnv);
+ $$retr->close if $$retr;
+ $$retr = $ftp->retr($f) and return $$retr;
+ ($ftp->code == 550) and log::l("FTP: 550 file unavailable"), return;
+ rewindGetFile();
+ log::l("ftp get failed, sleeping before trying again");
+ sleep 1;
+ }
+}
+
+#-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, $retr) = @{$_ || []};
+ $$retr->close if $$retr;
+ $ftp->close() if $ftp;
+ }
+
+ #- make sure to reconnect to server.
+ %hosts = ();
+}