urpmi
view release on metacpan or search on metacpan
urpm/download.pm view on Meta::CPAN
do {
local $_;
my $buf = '';
my $cmd = join(" ", "/usr/bin/rsync",
($limit_rate ? "--bwlimit=$limit_rate" : @{[]}),
($options->{quiet} ? qw(-q) : qw(--progress -v --no-human-readable)),
($options->{compress} ? qw(-z) : @{[]}),
($options->{ssh} ? qq(-e $options->{ssh}) :
("--timeout=$CONNECT_TIMEOUT",
"--contimeout=$CONNECT_TIMEOUT")),
qw(--partial --no-whole-file --no-motd --copy-links),
(defined $options->{'rsync-options'} ? split /\s+/, $options->{'rsync-options'} : @{[]}),
"'$file' '$options->{dir}' 2>&1");
$options->{debug} and $options->{debug}($cmd);
open(my $rsync, "$cmd |");
local $/ = \1; #- read input by only one char, this is slow but very nice (and it works!).
local $_;
while (<$rsync>) {
$buf .= $_;
if ($_ eq "\r" || $_ eq "\n") {
if ($options->{callback}) {
if (my ($percent, $speed) = $buf =~ /^\s*\d+\s+(\d+)%\s+(\S+)\s+/) {
propagate_sync_callback($options, 'progress', $file, $percent, undef, undef, $speed);
} else {
$options->{debug} and $options->{debug}($buf);
}
} else {
$options->{quiet} or print STDERR $buf;
$options->{debug} and $options->{debug}($buf);
}
$buf = '';
}
}
close $rsync;
} while ($? != 0 && --$count > 0 && -e $options->{dir} . "/$basename");
propagate_sync_callback($options, 'end', $file);
}
chdir $cwd;
$? == 0 or _error('rsync');
}
our $SSH_PATH;
sub _init_ssh_path() {
foreach (qw(/usr/bin/ssh /bin/ssh)) {
-x $_ and $SSH_PATH = $_;
next;
}
}
#- Don't generate a tmp dir name, so when we restart urpmi, the old ssh
#- connection can be reused
our $SSH_CONTROL_DIR = $ENV{TMP} || $ENV{TMPDIR} || '/tmp';
our $SSH_CONTROL_OPTION;
sub sync_ssh {
$SSH_PATH or _init_ssh_path();
$SSH_PATH or die N("ssh is missing\n");
my $options = shift;
$options = { dir => $options } if !ref $options;
unless ($options->{'rsync-options'} =~ /(?:-e|--rsh)\b/) {
my ($server, $user) = ('', getpwuid($<));
$_[0] =~ /((?:\w|\.)*):/ and $server = $1;
$_[0] =~ /((?:\w|-)*)@/ and $user = $1;
$SSH_CONTROL_OPTION = "-o 'ControlPath $SSH_CONTROL_DIR/ssh-urpmi-$$-%h_%p_%r' -o 'ControlMaster auto'";
if (start_ssh_master($server, $user)) {
$options->{ssh} = qq("$SSH_PATH $SSH_CONTROL_OPTION");
} else {
#- can't start master, use single connection
$options->{ssh} = $SSH_PATH;
}
}
sync_rsync($options, @_);
}
sub sync_prozilla {
-x "/usr/bin/proz" or die N("prozilla is missing\n");
my $options = shift;
$options = { dir => $options } if !ref $options;
#- force download to be done in cachedir to avoid polluting cwd.
(my $cwd) = getcwd() =~ /(.*)/;
chdir $options->{dir};
my $proz_command = join(" ", map { "'$_'" }
"/usr/bin/proz",
"--no-curses",
(defined $options->{'prozilla-options'} ? split /\s+/, $options->{'prozilla-options'} : @{[]}),
@_
);
my $ret = system($proz_command);
chdir $cwd;
if ($ret) {
if ($? == -1) {
die N("Couldn't execute prozilla\n");
} else {
_error('prozilla');
}
}
}
sub sync_aria2 {
my ($urpm, $medium, $rel_files, $options) = @_;
-x "/usr/bin/aria2c" or die N("aria2 is missing\n");
#- force download to be done in cachedir to avoid polluting cwd.
(my $cwd) = getcwd() =~ /(.*)/;
chdir $options->{dir};
my $stat_file = ($< ? $ENV{HOME} : '/root') . '/.aria2-adaptive-stats';
my $aria2c_command = join(" ", map { "'$_'" }
"/usr/bin/aria2c", $options->{debug} ? ('--log', "$options->{dir}/.aria2.log") : @{[]},
'--auto-file-renaming=false',
'--ftp-pasv',
'--summary-interval=1',
'--follow-metalink=mem',
$medium->{mirrorlist} ? (
'--metalink-enable-unique-protocol=true', # do not try to connect to the same server using the same protocol
'--metalink-preferred-protocol=http', # try http as first protocol as they're stateless and
# will put less strain on ie. the ftp servers which connections
# are statefull for, causing unhappy mirror admins complaining
# about increase of connections, increasing resource usage.
( run in 3.512 seconds using v1.01-cache-2.11-cpan-0fb53d1c279 )