Blame inc/Module/Install/Fetch.pm

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;