diff options
author | Felix Fietkau <nbd@openwrt.org> | 2005-03-19 22:51:51 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2005-03-19 22:51:51 +0000 |
commit | 682367d8ec7ec429de0f89a5b6679ec2abd70325 (patch) | |
tree | 27e1619e831268ea1fef78626ca3380be26e4325 /openwrt/scripts/download.pl | |
parent | 97d994fb22b2c9044f5e8ee72b9842c3827ddeb9 (diff) | |
download | mtk-20170518-682367d8ec7ec429de0f89a5b6679ec2abd70325.zip mtk-20170518-682367d8ec7ec429de0f89a5b6679ec2abd70325.tar.gz mtk-20170518-682367d8ec7ec429de0f89a5b6679ec2abd70325.tar.bz2 |
add downloading script (with md5sum checking and sourceforge downloading support)
SVN-Revision: 391
Diffstat (limited to 'openwrt/scripts/download.pl')
-rwxr-xr-x | openwrt/scripts/download.pl | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/openwrt/scripts/download.pl b/openwrt/scripts/download.pl new file mode 100755 index 0000000..a3a5f09 --- /dev/null +++ b/openwrt/scripts/download.pl @@ -0,0 +1,76 @@ +#!/usr/bin/perl +use strict; +use warnings; + +my $target = shift @ARGV; +my $filename = shift @ARGV; +my $md5sum = shift @ARGV; +my @mirrors = @ARGV; + +my $ok; + +@mirrors > 0 or die "Syntax: $0 <target dir> <filename> <md5sum> <mirror> [<mirror> ...]\n"; + +sub download +{ + my $mirror = shift; + + open WGET, "wget -t1 --connect-timeout=20 --read-timeout=15 -O- \"$mirror/$filename\" |" or die "Cannot launch wget.\n"; + open MD5SUM, "| md5sum > \"$target/$filename.md5sum\"" or die "Cannot launch md5sum.\n"; + open OUTPUT, "> $target/$filename.dl" or die "Cannot create file $target/$filename.dl: $!\n"; + my $buffer; + while (read WGET, $buffer, 1048576) { + print MD5SUM $buffer; + print OUTPUT $buffer; + } + close MD5SUM; + close WGET; + close OUTPUT; + + if (($? >> 8) != 0 ) { + print STDERR "Download failed.\n"; + cleanup(); + return; + } + + my $sum = `cat "$target/$filename.md5sum"`; + $sum =~ /^(\w+)\s+/ or die "Could not generate md5sum\n"; + $sum = $1; + + if (($md5sum =~ /\w{32}/) and ($sum ne $md5sum)) { + print STDERR "MD5 sum of the downloaded file does not match - deleting download.\n"; + cleanup(); + return; + } + + unlink "$target/$filename"; + system("mv \"$target/$filename.dl\" \"$target/$filename\""); +} + +sub cleanup +{ + unlink "$target/$filename.dl"; + unlink "$target/$filename.md5sum"; +} + +while (!$ok) { + my $mirror = shift @mirrors; + $mirror or die "No more mirrors to try - giving up.\n"; + + if ($mirror =~ /^\@SF\/(.+)$/) { + my $sfpath = $1; + open SF, "wget -t1 -q -O- 'http://prdownloads.sf.net/$sfpath/$filename' |"; + while (<SF>) { + /RADIO NAME=use_default VALUE=(\w+) OnClick="form\.submit\(\)">/ and do { + push @mirrors, "http://$1.dl.sourceforge.net/sourceforge/$sfpath"; + }; + } + close SF; + } else { + download($mirror); + } + -f "$target/$filename" and $ok = 1; +} + +$SIG{INT} = \&cleanup; + |