download.pl: add aria2c support
Use aria2c download tool by default on package download if available in the system. aria2c permits to use multiple mirrors and may improve download speed on special context where servers are hard to reach. Co-authored-by: Christian Marangi <ansuelsmth@gmail.com> Signed-off-by: Bradford Zhang <zyc@zyc.name> [ fix wrong var in the script and improve commit description ] Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
This commit is contained in:
		 Bradford Zhang
					Bradford Zhang
				
			
				
					committed by
					
						 Christian Marangi
						Christian Marangi
					
				
			
			
				
	
			
			
			 Christian Marangi
						Christian Marangi
					
				
			
						parent
						
							a67f484e67
						
					
				
				
					commit
					d391236269
				
			| @@ -70,27 +70,52 @@ sub hash_cmd() { | |||||||
| 	return undef; | 	return undef; | ||||||
| } | } | ||||||
|  |  | ||||||
| sub download_cmd($) { | sub download_cmd { | ||||||
| 	my $url = shift; | 	my $url = shift; | ||||||
| 	my $have_curl = 0; | 	my $have_curl = 0; | ||||||
|  | 	my $have_aria2c = 0; | ||||||
|  | 	my $filename = shift; | ||||||
|  | 	my @additional_mirrors = @_; | ||||||
|  | 	my $mirrors_url = "'$url'"; | ||||||
|  |  | ||||||
| 	if (open CURL, "curl --version 2>/dev/null |") { | 	my @chArray = ('a'..'z', 'A'..'Z', 0..9); | ||||||
|  | 	my $rfn = join '', map{ $chArray[int rand @chArray] } 0..9; | ||||||
|  | 	if (open CURL, '-|', 'curl', '--version') { | ||||||
| 		if (defined(my $line = readline CURL)) { | 		if (defined(my $line = readline CURL)) { | ||||||
| 			$have_curl = 1 if $line =~ /^curl /; | 			$have_curl = 1 if $line =~ /^curl /; | ||||||
| 		} | 		} | ||||||
| 		close CURL; | 		close CURL; | ||||||
| 	} | 	} | ||||||
|  | 	if (open ARIA2C, '-|', 'aria2c', '--version') { | ||||||
|  | 		if (defined(my $line = readline ARIA2C)) { | ||||||
|  | 			$have_aria2c = 1 if $line =~ /^aria2 /; | ||||||
|  | 		} | ||||||
|  | 		close ARIA2C; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return $have_curl | 	for my $mirror (@additional_mirrors ) { | ||||||
| 		? (qw(curl -f --connect-timeout 20 --retry 5 --location), | 		$mirrors_url = $mirrors_url ." '$mirror /$filename'"; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	if ($have_aria2c) { | ||||||
|  | 		return join(" ", "touch /dev/shm/${rfn}_spp;", | ||||||
|  | 			qw(aria2c --stderr -c -x2 -s10 -j10 -k1M), $mirrors_url , | ||||||
|  | 			$check_certificate ? () : '--check-certificate=false', | ||||||
|  | 			"--server-stat-of=/dev/shm/${rfn}_spp", | ||||||
|  | 			"--server-stat-if=/dev/shm/${rfn}_spp", | ||||||
|  | 			"-d /dev/shm -o $rfn;", | ||||||
|  | 			"cat /dev/shm/$rfn;", "rm /dev/shm/$rfn /dev/shm/${rfn}_spp"); | ||||||
|  | 	} elsif ($have_curl) { | ||||||
|  | 		return (qw(curl -f --connect-timeout 20 --retry 5 --location), | ||||||
| 			$check_certificate ? () : '--insecure', | 			$check_certificate ? () : '--insecure', | ||||||
| 			shellwords($ENV{CURL_OPTIONS} || ''), | 			shellwords($ENV{CURL_OPTIONS} || ''), | ||||||
| 			$url) | 			$url); | ||||||
| 		: (qw(wget --tries=5 --timeout=20 --output-document=-), | 	} else { | ||||||
|  | 		return (qw(wget --tries=5 --timeout=20 --output-document=-), | ||||||
| 			$check_certificate ? () : '--no-check-certificate', | 			$check_certificate ? () : '--no-check-certificate', | ||||||
| 			shellwords($ENV{WGET_OPTIONS} || ''), | 			shellwords($ENV{WGET_OPTIONS} || ''), | ||||||
| 			$url) | 			$url); | ||||||
| 	; | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| my $hash_cmd = hash_cmd(); | my $hash_cmd = hash_cmd(); | ||||||
| @@ -100,6 +125,7 @@ sub download | |||||||
| { | { | ||||||
| 	my $mirror = shift; | 	my $mirror = shift; | ||||||
| 	my $download_filename = shift; | 	my $download_filename = shift; | ||||||
|  | 	my @additional_mirrors = @_; | ||||||
|  |  | ||||||
| 	$mirror =~ s!/$!!; | 	$mirror =~ s!/$!!; | ||||||
|  |  | ||||||
| @@ -146,9 +172,9 @@ sub download | |||||||
| 			} | 			} | ||||||
| 		}; | 		}; | ||||||
| 	} else { | 	} else { | ||||||
| 		my @cmd = download_cmd("$mirror/$download_filename"); | 		my @cmd = download_cmd("$mirror/$download_filename", $download_filename, @additional_mirrors); | ||||||
| 		print STDERR "+ ".join(" ",@cmd)."\n"; | 		print STDERR "+ ".join(" ",@cmd)."\n"; | ||||||
| 		open(FETCH_FD, '-|', @cmd) or die "Cannot launch curl or wget.\n"; | 		open(FETCH_FD, '-|', @cmd) or die "Cannot launch aria2c, curl or wget.\n"; | ||||||
| 		$hash_cmd and do { | 		$hash_cmd and do { | ||||||
| 			open MD5SUM, "| $hash_cmd > '$target/$filename.hash'" or die "Cannot launch $hash_cmd.\n"; | 			open MD5SUM, "| $hash_cmd > '$target/$filename.hash'" or die "Cannot launch $hash_cmd.\n"; | ||||||
| 		}; | 		}; | ||||||
| @@ -296,10 +322,11 @@ while (!-f "$target/$filename") { | |||||||
| 	my $mirror = shift @mirrors; | 	my $mirror = shift @mirrors; | ||||||
| 	$mirror or die "No more mirrors to try - giving up.\n"; | 	$mirror or die "No more mirrors to try - giving up.\n"; | ||||||
|  |  | ||||||
| 	download($mirror, $url_filename); | 	download($mirror, $url_filename, @mirrors); | ||||||
| 	if (!-f "$target/$filename" && $url_filename ne $filename) { | 	if (!-f "$target/$filename" && $url_filename ne $filename) { | ||||||
| 		download($mirror, $filename); | 		download($mirror, $filename, @mirrors); | ||||||
| 	} | 	} | ||||||
|  | 	@mirrors=(); | ||||||
| } | } | ||||||
|  |  | ||||||
| $SIG{INT} = \&cleanup; | $SIG{INT} = \&cleanup; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user