70
70
return undef ;
71
71
}
72
72
73
- sub download_cmd ($) {
73
+ sub download_cmd {
74
74
my $url = shift ;
75
75
my $have_curl = 0;
76
-
77
- if (open CURL, " curl --version 2>/dev/null |" ) {
76
+ my $have_aria2c = 0;
77
+ my $filename = shift ;
78
+ my @additional_mirrors = @_ ;
79
+ my $mirrors_url = " '$url '" ;
80
+
81
+ my @chArray = (' a' ..' z' , ' A' ..' Z' , 0..9);
82
+ my $rfn = join ' ' , map { $chArray [int rand @chArray ] } 0..9;
83
+ if (open CURL, ' -|' , ' curl' , ' --version' ) {
78
84
if (defined (my $line = readline CURL)) {
79
85
$have_curl = 1 if $line =~ / ^curl / ;
80
86
}
81
87
close CURL;
82
88
}
89
+ if (open ARIA2C, ' -|' , ' aria2c' , ' --version' ) {
90
+ if (defined (my $line = readline ARIA2C)) {
91
+ $have_aria2c = 1 if $line =~ / ^aria2 / ;
92
+ }
93
+ close ARIA2C;
94
+ }
83
95
84
- return $have_curl
85
- ? (qw( curl -f --connect-timeout 20 --retry 5 --location) ,
96
+ for my $mirror (@additional_mirrors ) {
97
+ $mirrors_url = $mirrors_url ." '$mirror /$filename '" ;
98
+ }
99
+
100
+ if ($have_aria2c ) {
101
+ return join (" " , " touch /dev/shm/${rfn} _spp;" ,
102
+ qw( aria2c --stderr -c -x2 -s10 -j10 -k1M) , $mirrors_url ,
103
+ $check_certificate ? () : ' --check-certificate=false' ,
104
+ " --server-stat-of=/dev/shm/${rfn} _spp" ,
105
+ " --server-stat-if=/dev/shm/${rfn} _spp" ,
106
+ " -d /dev/shm -o $rfn ;" ,
107
+ " cat /dev/shm/$rfn ;" , " rm /dev/shm/$rfn /dev/shm/${rfn} _spp" );
108
+ } elsif ($have_curl ) {
109
+ return (qw( curl -f --connect-timeout 20 --retry 5 --location) ,
86
110
$check_certificate ? () : ' --insecure' ,
87
111
shellwords($ENV {CURL_OPTIONS } || ' ' ),
88
- $url )
89
- : (qw( wget --tries=5 --timeout=20 --output-document=-) ,
112
+ $url );
113
+ } else {
114
+ return (qw( wget --tries=5 --timeout=20 --output-document=-) ,
90
115
$check_certificate ? () : ' --no-check-certificate' ,
91
116
shellwords($ENV {WGET_OPTIONS } || ' ' ),
92
- $url )
93
- ;
117
+ $url );
118
+ }
94
119
}
95
120
96
121
my $hash_cmd = hash_cmd();
@@ -100,6 +125,7 @@ sub download
100
125
{
101
126
my $mirror = shift ;
102
127
my $download_filename = shift ;
128
+ my @additional_mirrors = @_ ;
103
129
104
130
$mirror =~ s ! /$!! ;
105
131
@@ -146,9 +172,9 @@ sub download
146
172
}
147
173
};
148
174
} else {
149
- my @cmd = download_cmd(" $mirror /$download_filename " );
175
+ my @cmd = download_cmd(" $mirror /$download_filename " , $download_filename , @additional_mirrors );
150
176
print STDERR " + " .join (" " ,@cmd )." \n " ;
151
- open (FETCH_FD, ' -|' , @cmd ) or die " Cannot launch curl or wget.\n " ;
177
+ open (FETCH_FD, ' -|' , @cmd ) or die " Cannot launch aria2c, curl or wget.\n " ;
152
178
$hash_cmd and do {
153
179
open MD5SUM, " | $hash_cmd > '$target /$filename .hash'" or die " Cannot launch $hash_cmd .\n " ;
154
180
};
@@ -296,10 +322,11 @@ sub cleanup
296
322
my $mirror = shift @mirrors ;
297
323
$mirror or die " No more mirrors to try - giving up.\n " ;
298
324
299
- download($mirror , $url_filename );
325
+ download($mirror , $url_filename , @mirrors );
300
326
if (!-f " $target /$filename " && $url_filename ne $filename ) {
301
- download($mirror , $filename );
327
+ download($mirror , $filename , @mirrors );
302
328
}
329
+ @mirrors =();
303
330
}
304
331
305
332
$SIG {INT } = \&cleanup;
0 commit comments