|
Packit |
ae5a87 |
#line 1
|
|
Packit |
ae5a87 |
package Module::Install::Fetch;
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
use strict;
|
|
Packit |
ae5a87 |
use Module::Install::Base ();
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
use vars qw{$VERSION @ISA $ISCORE};
|
|
Packit |
ae5a87 |
BEGIN {
|
|
Packit |
ae5a87 |
$VERSION = '0.95';
|
|
Packit |
ae5a87 |
@ISA = 'Module::Install::Base';
|
|
Packit |
ae5a87 |
$ISCORE = 1;
|
|
Packit |
ae5a87 |
}
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
sub get_file {
|
|
Packit |
ae5a87 |
my ($self, %args) = @_;
|
|
Packit |
ae5a87 |
my ($scheme, $host, $path, $file) =
|
|
Packit |
ae5a87 |
$args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return;
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
if ( $scheme eq 'http' and ! eval { require LWP::Simple; 1 } ) {
|
|
Packit |
ae5a87 |
$args{url} = $args{ftp_url}
|
|
Packit |
ae5a87 |
or (warn("LWP support unavailable!\n"), return);
|
|
Packit |
ae5a87 |
($scheme, $host, $path, $file) =
|
|
Packit |
ae5a87 |
$args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return;
|
|
Packit |
ae5a87 |
}
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
$|++;
|
|
Packit |
ae5a87 |
print "Fetching '$file' from $host... ";
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
unless (eval { require Socket; Socket::inet_aton($host) }) {
|
|
Packit |
ae5a87 |
warn "'$host' resolve failed!\n";
|
|
Packit |
ae5a87 |
return;
|
|
Packit |
ae5a87 |
}
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
return unless $scheme eq 'ftp' or $scheme eq 'http';
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
require Cwd;
|
|
Packit |
ae5a87 |
my $dir = Cwd::getcwd();
|
|
Packit |
ae5a87 |
chdir $args{local_dir} or return if exists $args{local_dir};
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
if (eval { require LWP::Simple; 1 }) {
|
|
Packit |
ae5a87 |
LWP::Simple::mirror($args{url}, $file);
|
|
Packit |
ae5a87 |
}
|
|
Packit |
ae5a87 |
elsif (eval { require Net::FTP; 1 }) { eval {
|
|
Packit |
ae5a87 |
# use Net::FTP to get past firewall
|
|
Packit |
ae5a87 |
my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600);
|
|
Packit |
ae5a87 |
$ftp->login("anonymous", 'anonymous@example.com');
|
|
Packit |
ae5a87 |
$ftp->cwd($path);
|
|
Packit |
ae5a87 |
$ftp->binary;
|
|
Packit |
ae5a87 |
$ftp->get($file) or (warn("$!\n"), return);
|
|
Packit |
ae5a87 |
$ftp->quit;
|
|
Packit |
ae5a87 |
} }
|
|
Packit |
ae5a87 |
elsif (my $ftp = $self->can_run('ftp')) { eval {
|
|
Packit |
ae5a87 |
# no Net::FTP, fallback to ftp.exe
|
|
Packit |
ae5a87 |
require FileHandle;
|
|
Packit |
ae5a87 |
my $fh = FileHandle->new;
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
local $SIG{CHLD} = 'IGNORE';
|
|
Packit |
ae5a87 |
unless ($fh->open("|$ftp -n")) {
|
|
Packit |
ae5a87 |
warn "Couldn't open ftp: $!\n";
|
|
Packit |
ae5a87 |
chdir $dir; return;
|
|
Packit |
ae5a87 |
}
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
my @dialog = split(/\n/, <<"END_FTP");
|
|
Packit |
ae5a87 |
open $host
|
|
Packit |
ae5a87 |
user anonymous anonymous\@example.com
|
|
Packit |
ae5a87 |
cd $path
|
|
Packit |
ae5a87 |
binary
|
|
Packit |
ae5a87 |
get $file $file
|
|
Packit |
ae5a87 |
quit
|
|
Packit |
ae5a87 |
END_FTP
|
|
Packit |
ae5a87 |
foreach (@dialog) { $fh->print("$_\n") }
|
|
Packit |
ae5a87 |
$fh->close;
|
|
Packit |
ae5a87 |
} }
|
|
Packit |
ae5a87 |
else {
|
|
Packit |
ae5a87 |
warn "No working 'ftp' program available!\n";
|
|
Packit |
ae5a87 |
chdir $dir; return;
|
|
Packit |
ae5a87 |
}
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
unless (-f $file) {
|
|
Packit |
ae5a87 |
warn "Fetching failed: $@\n";
|
|
Packit |
ae5a87 |
chdir $dir; return;
|
|
Packit |
ae5a87 |
}
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
return if exists $args{size} and -s $file != $args{size};
|
|
Packit |
ae5a87 |
system($args{run}) if exists $args{run};
|
|
Packit |
ae5a87 |
unlink($file) if $args{remove};
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
print(((!exists $args{check_for} or -e $args{check_for})
|
|
Packit |
ae5a87 |
? "done!" : "failed! ($!)"), "\n");
|
|
Packit |
ae5a87 |
chdir $dir; return !$?;
|
|
Packit |
ae5a87 |
}
|
|
Packit |
ae5a87 |
|
|
Packit |
ae5a87 |
1;
|