X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=blobdiff_plain;f=scripts%2Fdownload.pl;h=d6a55b634c4ac58215433ac326dbc890ca06c05b;hp=e63595497f79591a1e0b76fda80424cc11e7c429;hb=fc3c757f2e951c70e8d467bd841b020249ac0562;hpb=039f6d8d0ff55e2812264fa905125adb3ec0b99f diff --git a/scripts/download.pl b/scripts/download.pl index e63595497f..d6a55b634c 100755 --- a/scripts/download.pl +++ b/scripts/download.pl @@ -9,6 +9,7 @@ use strict; use warnings; use File::Basename; +use File::Copy; @ARGV > 2 or die "Syntax: $0 [ ...]\n"; @@ -24,7 +25,7 @@ sub localmirrors { open LM, "$scriptdir/localmirrors" and do { while () { chomp $_; - push @mlist, $_; + push @mlist, $_ if $_; } close LM; }; @@ -32,7 +33,8 @@ sub localmirrors { while () { /^CONFIG_LOCALMIRROR="(.+)"/ and do { chomp; - push @mlist, $1; + my @local_mirrors = split(/;/, $1); + push @mlist, @local_mirrors; }; } close CONFIG; @@ -50,28 +52,59 @@ sub which($) { return $res; } -my $md5cmd = which("md5sum"); -$md5cmd or $md5cmd = which("md5"); -$md5cmd or die 'no md5 checksum program found, please install md5 or md5sum'; +my $md5cmd = which("md5sum") || which("md5") || die 'no md5 checksum program found, please install md5 or md5sum'; chomp $md5cmd; sub download { my $mirror = shift; - my $options = $ENV{WGET_OPTIONS}; - $options or $options = ""; - - $mirror =~ s/\/$//; - if( $mirror =~ /^file:\/\// ) { - my $cache = $mirror; - $cache =~ s/file:\/\///g; - print "Checking local cache: $cache\n"; - system("mkdir -p $target/"); - system("cp -f $cache/$filename $target/$filename.dl") == 0 or return; - system("$md5cmd $target/$filename.dl > \"$target/$filename.md5sum\" ") == 0 or return; + my $options = $ENV{WGET_OPTIONS} || ""; + + $mirror =~ s!/$!!; + + if ($mirror =~ s!^file://!!) { + if (! -d "$mirror") { + print STDERR "Wrong local cache directory -$mirror-.\n"; + cleanup(); + return; + } + + if (! -d "$target") { + system("mkdir", "-p", "$target/"); + } + + if (! open TMPDLS, "find $mirror -follow -name $filename 2>/dev/null |") { + print("Failed to search for $filename in $mirror\n"); + return; + } + + my $link; + + while (defined(my $line = readline TMPDLS)) { + chomp ($link = $line); + if ($. > 1) { + print("$. or more instances of $filename in $mirror found . Only one instance allowed.\n"); + return; + } + } + + close TMPDLS; + + if (! $link) { + print("No instances of $filename found in $mirror.\n"); + return; + } + + print("Copying $filename from $link\n"); + copy($link, "$target/$filename.dl"); + + if (system("$md5cmd '$target/$filename.dl' > '$target/$filename.md5sum'")) { + print("Failed to generate md5 sum for $filename\n"); + return; + } } else { - open WGET, "wget -t5 --timeout=20 $options -O- \"$mirror/$filename\" |" or die "Cannot launch wget.\n"; - open MD5SUM, "| $md5cmd > \"$target/$filename.md5sum\"" or die "Cannot launch md5sum.\n"; + open WGET, "wget -t5 --timeout=20 --no-check-certificate $options -O- '$mirror/$filename' |" or die "Cannot launch wget.\n"; + open MD5SUM, "| $md5cmd > '$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) { @@ -82,7 +115,7 @@ sub download close WGET; close OUTPUT; - if (($? >> 8) != 0 ) { + if ($? >> 8) { print STDERR "Download failed.\n"; cleanup(); return; @@ -100,7 +133,7 @@ sub download } unlink "$target/$filename"; - system("mv \"$target/$filename.dl\" \"$target/$filename\""); + system("mv", "$target/$filename.dl", "$target/$filename"); cleanup(); } @@ -119,21 +152,22 @@ foreach my $mirror (@ARGV) { push @mirrors, "http://downloads.sourceforge.net/$1"; } } elsif ($mirror =~ /^\@GNU\/(.+)$/) { - push @mirrors, "ftp://ftp.gnu.org/gnu/$1"; + push @mirrors, "http://ftpmirror.gnu.org/$1"; + push @mirrors, "http://ftp.gnu.org/pub/gnu/$1"; push @mirrors, "ftp://ftp.belnet.be/mirror/ftp.gnu.org/gnu/$1"; push @mirrors, "ftp://ftp.mirror.nl/pub/mirror/gnu/$1"; push @mirrors, "http://mirror.switch.ch/ftp/mirror/gnu/$1"; - push @mirrors, "ftp://ftp.uu.net/archive/systems/gnu/$1"; - push @mirrors, "ftp://ftp.eu.uu.net/pub/gnu/$1"; - push @mirrors, "ftp://ftp.leo.org/pub/comp/os/unix/gnu/$1"; - push @mirrors, "ftp://ftp.digex.net/pub/gnu/$1"; } elsif ($mirror =~ /^\@KERNEL\/(.+)$/) { - push @mirrors, "ftp://ftp.all.kernel.org/pub/$1"; - push @mirrors, "http://ftp.all.kernel.org/pub/$1"; - push @mirrors, "ftp://ftp.de.kernel.org/pub/$1"; - push @mirrors, "http://ftp.de.kernel.org/pub/$1"; - push @mirrors, "ftp://ftp.fr.kernel.org/pub/$1"; - push @mirrors, "http://ftp.fr.kernel.org/pub/$1"; + my @extra = ( $1 ); + if ($filename =~ /linux-\d+\.\d+(?:\.\d+)?-rc/) { + push @extra, "$extra[0]/testing"; + } elsif ($filename =~ /linux-(\d+\.\d+(?:\.\d+)?)/) { + push @extra, "$extra[0]/longterm/v$1"; + } + foreach my $dir (@extra) { + push @mirrors, "ftp://ftp.all.kernel.org/pub/$dir"; + push @mirrors, "http://ftp.all.kernel.org/pub/$dir"; + } } elsif ($mirror =~ /^\@GNOME\/(.+)$/) { push @mirrors, "http://ftp.gnome.org/pub/GNOME/sources/$1"; push @mirrors, "http://ftp.unina.it/pub/linux/GNOME/sources/$1";