aboutsummaryrefslogtreecommitdiffstats
path: root/BSDmakefile
Commit message (Expand)AuthorAgeFilesLines
* add missing copyright headerFelix Fietkau2007-02-261-0/+5
* add BSDmakefile as a wrapper which calls gmakeFelix Fietkau2006-10-101-0/+2
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
#!/usr/bin/env perl
# 
# Copyright (C) 2006 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

use strict;
use warnings;
use File::Basename;

@ARGV > 2 or die "Syntax: $0 <target dir> <filename> <md5sum> [<mirror> ...]\n";

my $target = shift @ARGV;
my $filename = shift @ARGV;
my $md5sum = shift @ARGV;
my $scriptdir = dirname($0);
my @mirrors;
my $ok;

sub localmirrors {
	my @mlist;
	open LM, "$scriptdir/localmirrors" and do {
	    while (<LM>) {
			chomp $_;
			push @mlist, $_;
		}
		close LM;
	};
	open CONFIG, "<".$ENV{'TOPDIR'}."/.config" and do {
		while (<CONFIG>) {
			/^CONFIG_LOCALMIRROR="(.+)"/ and do {
				chomp;
				my @local_mirrors = split(/;/, $1);
				push @mlist, @local_mirrors;
			};
		}
		close CONFIG;
	};

	return @mlist;
}

sub which($) {
	my $prog = shift;
	my $res = `which $prog`;
	$res or return undef;
	$res =~ /^no / and return undef;
	$res =~ /not found/ and return undef;
	return $res;
}

my $md5cmd = which("md5sum");
$md5cmd or $md5cmd = which("md5");
$md5cmd or 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;
		if(system("test -d $cache")) {
			print STDERR "Wrong local cache directory -$cache-.\n";
			cleanup();
			return;
		}
		if(! -d $target) {
			system("mkdir -p $target/");
		}
		system("cp -vf $cache/$filename $target/$filename.dl") == 0 or return;
		system("$md5cmd $target/$filename.dl > \"$target/$filename.md5sum\" ") == 0 or 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 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 (file: $sum, requested: $md5sum) - deleting download.\n";
		cleanup();
		return;
	}

	unlink "$target/$filename";
	system("mv \"$target/$filename.dl\" \"$target/$filename\"");
	cleanup();
}

sub cleanup
{
	unlink "$target/$filename.dl";
	unlink "$target/$filename.md5sum";
}

@mirrors = localmirrors();

foreach my $mirror (@ARGV) {
	if ($mirror =~ /^\@SF\/(.+)$/) {
		# give sourceforge a few more tries, because it redirects to different mirrors
		for (1 .. 5) {
			push @mirrors, "http://downloads.sourceforge.net/$1";
		}
	} elsif ($mirror =~ /^\@GNU\/(.+)$/) {
		push @mirrors, "ftp://ftp.gnu.org/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.geo.kernel.org/pub/$1";
		push @mirrors, "http://ftp.geo.kernel.org/pub/$1";
		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";
    } elsif ($mirror =~ /^\@GNOME\/(.+)$/) {
		push @mirrors, "http://ftp.gnome.org/pub/GNOME/sources/$1";
		push @mirrors, "http://ftp.unina.it/pub/linux/GNOME/sources/$1";
		push @mirrors, "http://fr2.rpmfind.net/linux/gnome.org/sources/$1";
		push @mirrors, "ftp://ftp.dit.upm.es/pub/GNOME/sources/$1";
		push @mirrors, "ftp://ftp.no.gnome.org/pub/GNOME/sources/$1";
		push @mirrors, "http://ftp.acc.umu.se/pub/GNOME/sources/$1";
		push @mirrors, "http://ftp.belnet.be/mirror/ftp.gnome.org/sources/$1";
		push @mirrors, "http://linorg.usp.br/gnome/sources/$1";
		push @mirrors, "http://mirror.aarnet.edu.au/pub/GNOME/sources/$1";
		push @mirrors, "http://mirrors.ibiblio.org/pub/mirrors/gnome/sources/$1";
		push @mirrors, "ftp://ftp.cse.buffalo.edu/pub/Gnome/sources/$1";
		push @mirrors, "ftp://ftp.nara.wide.ad.jp/pub/X11/GNOME/sources/$1";
    }
    else {
		push @mirrors, $mirror;
	}
}

#push @mirrors, 'http://mirror1.openwrt.org';
push @mirrors, 'http://mirror2.openwrt.org/sources';
push @mirrors, 'http://downloads.openwrt.org/sources';

while (!$ok) {
	my $mirror = shift @mirrors;
	$mirror or die "No more mirrors to try - giving up.\n";

	download($mirror);
	-f "$target/$filename" and $ok = 1;
}

$SIG{INT} = \&cleanup;