diff --git a/media/img/flags/Argentina.gif b/media/img/flags/Argentina.gif new file mode 100644 index 00000000..c9f20220 Binary files /dev/null and b/media/img/flags/Argentina.gif differ diff --git a/media/img/flags/Australia.gif b/media/img/flags/Australia.gif new file mode 100644 index 00000000..5cc15b36 Binary files /dev/null and b/media/img/flags/Australia.gif differ diff --git a/media/img/flags/Austria.gif b/media/img/flags/Austria.gif new file mode 100644 index 00000000..d72b9457 Binary files /dev/null and b/media/img/flags/Austria.gif differ diff --git a/media/img/flags/Belgium.gif b/media/img/flags/Belgium.gif new file mode 100644 index 00000000..fba97dd0 Binary files /dev/null and b/media/img/flags/Belgium.gif differ diff --git a/media/img/flags/BosniaandHerzegovina.gif b/media/img/flags/BosniaandHerzegovina.gif new file mode 100644 index 00000000..c0d92dca Binary files /dev/null and b/media/img/flags/BosniaandHerzegovina.gif differ diff --git a/media/img/flags/Brazil.gif b/media/img/flags/Brazil.gif new file mode 100644 index 00000000..ea5fa810 Binary files /dev/null and b/media/img/flags/Brazil.gif differ diff --git a/media/img/flags/Bulgaria.gif b/media/img/flags/Bulgaria.gif new file mode 100644 index 00000000..35c0b117 Binary files /dev/null and b/media/img/flags/Bulgaria.gif differ diff --git a/media/img/flags/Canada.gif b/media/img/flags/Canada.gif new file mode 100644 index 00000000..322d4b98 Binary files /dev/null and b/media/img/flags/Canada.gif differ diff --git a/media/img/flags/Chile.gif b/media/img/flags/Chile.gif new file mode 100644 index 00000000..12b6a900 Binary files /dev/null and b/media/img/flags/Chile.gif differ diff --git a/media/img/flags/China.gif b/media/img/flags/China.gif new file mode 100644 index 00000000..4baf243f Binary files /dev/null and b/media/img/flags/China.gif differ diff --git a/media/img/flags/Colombia.gif b/media/img/flags/Colombia.gif new file mode 100644 index 00000000..a4f604bf Binary files /dev/null and b/media/img/flags/Colombia.gif differ diff --git a/media/img/flags/CostaRica.gif b/media/img/flags/CostaRica.gif new file mode 100644 index 00000000..d3a31431 Binary files /dev/null and b/media/img/flags/CostaRica.gif differ diff --git a/media/img/flags/Croatia.gif b/media/img/flags/Croatia.gif new file mode 100644 index 00000000..1e4e8ae5 Binary files /dev/null and b/media/img/flags/Croatia.gif differ diff --git a/media/img/flags/CzechRepublic.gif b/media/img/flags/CzechRepublic.gif new file mode 100644 index 00000000..62515e3a Binary files /dev/null and b/media/img/flags/CzechRepublic.gif differ diff --git a/media/img/flags/Denmark.gif b/media/img/flags/Denmark.gif new file mode 100644 index 00000000..4dce860a Binary files /dev/null and b/media/img/flags/Denmark.gif differ diff --git a/media/img/flags/Estonia.gif b/media/img/flags/Estonia.gif new file mode 100644 index 00000000..b8bbf1db Binary files /dev/null and b/media/img/flags/Estonia.gif differ diff --git a/media/img/flags/Finland.gif b/media/img/flags/Finland.gif new file mode 100644 index 00000000..a43a398f Binary files /dev/null and b/media/img/flags/Finland.gif differ diff --git a/media/img/flags/France.gif b/media/img/flags/France.gif new file mode 100644 index 00000000..13fcbf29 Binary files /dev/null and b/media/img/flags/France.gif differ diff --git a/media/img/flags/Georgia.gif b/media/img/flags/Georgia.gif new file mode 100644 index 00000000..1c73cd52 Binary files /dev/null and b/media/img/flags/Georgia.gif differ diff --git a/media/img/flags/Germany.gif b/media/img/flags/Germany.gif new file mode 100644 index 00000000..e25a855b Binary files /dev/null and b/media/img/flags/Germany.gif differ diff --git a/media/img/flags/Greece.gif b/media/img/flags/Greece.gif new file mode 100644 index 00000000..1ede215a Binary files /dev/null and b/media/img/flags/Greece.gif differ diff --git a/media/img/flags/HongKong.gif b/media/img/flags/HongKong.gif new file mode 100644 index 00000000..ef316432 Binary files /dev/null and b/media/img/flags/HongKong.gif differ diff --git a/media/img/flags/Hungary.gif b/media/img/flags/Hungary.gif new file mode 100644 index 00000000..eca0e109 Binary files /dev/null and b/media/img/flags/Hungary.gif differ diff --git a/media/img/flags/Iceland.gif b/media/img/flags/Iceland.gif new file mode 100644 index 00000000..ee4d17f5 Binary files /dev/null and b/media/img/flags/Iceland.gif differ diff --git a/media/img/flags/India.gif b/media/img/flags/India.gif new file mode 100644 index 00000000..aab1776b Binary files /dev/null and b/media/img/flags/India.gif differ diff --git a/media/img/flags/Indonesia.gif b/media/img/flags/Indonesia.gif new file mode 100644 index 00000000..463f457a Binary files /dev/null and b/media/img/flags/Indonesia.gif differ diff --git a/media/img/flags/Ireland.gif b/media/img/flags/Ireland.gif new file mode 100644 index 00000000..a5506787 Binary files /dev/null and b/media/img/flags/Ireland.gif differ diff --git a/media/img/flags/Israel.gif b/media/img/flags/Israel.gif new file mode 100644 index 00000000..11453ed1 Binary files /dev/null and b/media/img/flags/Israel.gif differ diff --git a/media/img/flags/Italy.gif b/media/img/flags/Italy.gif new file mode 100644 index 00000000..511dba80 Binary files /dev/null and b/media/img/flags/Italy.gif differ diff --git a/media/img/flags/Japan.gif b/media/img/flags/Japan.gif new file mode 100644 index 00000000..37ebca66 Binary files /dev/null and b/media/img/flags/Japan.gif differ diff --git a/media/img/flags/Korea.gif b/media/img/flags/Korea.gif new file mode 100644 index 00000000..57b52b38 Binary files /dev/null and b/media/img/flags/Korea.gif differ diff --git a/media/img/flags/Latvia.gif b/media/img/flags/Latvia.gif new file mode 100644 index 00000000..5a768d05 Binary files /dev/null and b/media/img/flags/Latvia.gif differ diff --git a/media/img/flags/Lithuania.gif b/media/img/flags/Lithuania.gif new file mode 100644 index 00000000..dda119a0 Binary files /dev/null and b/media/img/flags/Lithuania.gif differ diff --git a/media/img/flags/Malaysia.gif b/media/img/flags/Malaysia.gif new file mode 100644 index 00000000..d83c1d04 Binary files /dev/null and b/media/img/flags/Malaysia.gif differ diff --git a/media/img/flags/Mexico.gif b/media/img/flags/Mexico.gif new file mode 100644 index 00000000..8a6687ab Binary files /dev/null and b/media/img/flags/Mexico.gif differ diff --git a/media/img/flags/Netherlands.gif b/media/img/flags/Netherlands.gif new file mode 100644 index 00000000..c09d3eb4 Binary files /dev/null and b/media/img/flags/Netherlands.gif differ diff --git a/media/img/flags/NewZealand.gif b/media/img/flags/NewZealand.gif new file mode 100644 index 00000000..e3292851 Binary files /dev/null and b/media/img/flags/NewZealand.gif differ diff --git a/media/img/flags/Norway.gif b/media/img/flags/Norway.gif new file mode 100644 index 00000000..20d23b78 Binary files /dev/null and b/media/img/flags/Norway.gif differ diff --git a/media/img/flags/Pakistan.gif b/media/img/flags/Pakistan.gif new file mode 100644 index 00000000..7bd8a67a Binary files /dev/null and b/media/img/flags/Pakistan.gif differ diff --git a/media/img/flags/Philippines.gif b/media/img/flags/Philippines.gif new file mode 100644 index 00000000..540d455e Binary files /dev/null and b/media/img/flags/Philippines.gif differ diff --git a/media/img/flags/Poland.gif b/media/img/flags/Poland.gif new file mode 100644 index 00000000..756f9398 Binary files /dev/null and b/media/img/flags/Poland.gif differ diff --git a/media/img/flags/Portugal.gif b/media/img/flags/Portugal.gif new file mode 100644 index 00000000..91bf32ad Binary files /dev/null and b/media/img/flags/Portugal.gif differ diff --git a/media/img/flags/PuertoRico.gif b/media/img/flags/PuertoRico.gif new file mode 100644 index 00000000..3eabf92e Binary files /dev/null and b/media/img/flags/PuertoRico.gif differ diff --git a/media/img/flags/Romania.gif b/media/img/flags/Romania.gif new file mode 100644 index 00000000..2d38df26 Binary files /dev/null and b/media/img/flags/Romania.gif differ diff --git a/media/img/flags/Russia.gif b/media/img/flags/Russia.gif new file mode 100644 index 00000000..f72e7f78 Binary files /dev/null and b/media/img/flags/Russia.gif differ diff --git a/media/img/flags/Serbia.gif b/media/img/flags/Serbia.gif new file mode 100644 index 00000000..e666fd6b Binary files /dev/null and b/media/img/flags/Serbia.gif differ diff --git a/media/img/flags/Singapore.gif b/media/img/flags/Singapore.gif new file mode 100644 index 00000000..20ec5604 Binary files /dev/null and b/media/img/flags/Singapore.gif differ diff --git a/media/img/flags/SlovakRepublic.gif b/media/img/flags/SlovakRepublic.gif new file mode 100644 index 00000000..f3486fbf Binary files /dev/null and b/media/img/flags/SlovakRepublic.gif differ diff --git a/media/img/flags/Slovenia.gif b/media/img/flags/Slovenia.gif new file mode 100644 index 00000000..53182017 Binary files /dev/null and b/media/img/flags/Slovenia.gif differ diff --git a/media/img/flags/South-korea.gif b/media/img/flags/South-korea.gif new file mode 100644 index 00000000..57b52b38 Binary files /dev/null and b/media/img/flags/South-korea.gif differ diff --git a/media/img/flags/SouthAfrica.gif b/media/img/flags/SouthAfrica.gif new file mode 100644 index 00000000..015d07eb Binary files /dev/null and b/media/img/flags/SouthAfrica.gif differ diff --git a/media/img/flags/Spain.gif b/media/img/flags/Spain.gif new file mode 100644 index 00000000..72fc29ae Binary files /dev/null and b/media/img/flags/Spain.gif differ diff --git a/media/img/flags/Sweden.gif b/media/img/flags/Sweden.gif new file mode 100644 index 00000000..4f2f53c5 Binary files /dev/null and b/media/img/flags/Sweden.gif differ diff --git a/media/img/flags/Switzerland.gif b/media/img/flags/Switzerland.gif new file mode 100644 index 00000000..98cef7c2 Binary files /dev/null and b/media/img/flags/Switzerland.gif differ diff --git a/media/img/flags/Taiwan.gif b/media/img/flags/Taiwan.gif new file mode 100644 index 00000000..e7698460 Binary files /dev/null and b/media/img/flags/Taiwan.gif differ diff --git a/media/img/flags/Thailand.gif b/media/img/flags/Thailand.gif new file mode 100644 index 00000000..a317e752 Binary files /dev/null and b/media/img/flags/Thailand.gif differ diff --git a/media/img/flags/Turkey.gif b/media/img/flags/Turkey.gif new file mode 100644 index 00000000..3d28b894 Binary files /dev/null and b/media/img/flags/Turkey.gif differ diff --git a/media/img/flags/USA.gif b/media/img/flags/USA.gif new file mode 100644 index 00000000..bcf49295 Binary files /dev/null and b/media/img/flags/USA.gif differ diff --git a/media/img/flags/Ukraine.gif b/media/img/flags/Ukraine.gif new file mode 100644 index 00000000..b951bef5 Binary files /dev/null and b/media/img/flags/Ukraine.gif differ diff --git a/media/img/flags/UnitedKingdom.gif b/media/img/flags/UnitedKingdom.gif new file mode 100644 index 00000000..0f555d07 Binary files /dev/null and b/media/img/flags/UnitedKingdom.gif differ diff --git a/media/img/flags/Vietnam.gif b/media/img/flags/Vietnam.gif new file mode 100644 index 00000000..9f693d26 Binary files /dev/null and b/media/img/flags/Vietnam.gif differ diff --git a/pgweb/downloads/admin.py b/pgweb/downloads/admin.py index 71751e2f..3c48d53d 100644 --- a/pgweb/downloads/admin.py +++ b/pgweb/downloads/admin.py @@ -2,12 +2,19 @@ from django.contrib import admin from util.admin import register_markdown, MarkdownPreviewAdmin from models import * +class MirrorAdmin(admin.ModelAdmin): + list_display = ('__unicode__', 'country_name', 'country_code', 'mirror_index', 'mirror_last_rsync', 'host_sponsor', ) + list_filter = ('country_name', 'mirror_active', ) + search_fields = ('country_name', 'host_sponsor', 'host_notes', ) + ordering = ('country_code', ) + class ProductAdmin(MarkdownPreviewAdmin): list_display = ('name', 'publisher', 'approved', 'lastconfirmed',) list_filter = ('approved',) search_fields = ('name', 'description', ) ordering = ('name', ) +admin.site.register(Mirror, MirrorAdmin) admin.site.register(Category) admin.site.register(LicenceType) admin.site.register(Product, ProductAdmin) diff --git a/pgweb/downloads/models.py b/pgweb/downloads/models.py index e12f7533..f7f3dca8 100644 --- a/pgweb/downloads/models.py +++ b/pgweb/downloads/models.py @@ -6,6 +6,50 @@ from pgweb.core.models import Organisation from datetime import datetime +class Mirror(models.Model): + country_name = models.CharField(max_length=50, null=False, blank=False) + country_code = models.CharField(max_length=2, null=False, blank=False) + mirror_created = models.DateTimeField(null=False, blank=False, default=datetime.now()) + mirror_last_rsync = models.DateTimeField(null=False, blank=False, default=datetime(1970,1,1)) + mirror_index = models.IntegerField(null=False) + host_addr = models.IPAddressField(null=True, default='0.0.0.0') + host_path = models.CharField(max_length=100, null=True) + host_sponsor = models.CharField(max_length=100, null=True) + host_contact = models.CharField(max_length=100, null=True) + host_email = models.CharField(max_length=100, null=True) + host_notes = models.TextField(null=True) + rsync_host1 = models.CharField(max_length=100, null=True) + rsync_host2 = models.CharField(max_length=100, null=True) + mirror_active = models.BooleanField(null=False, default=True) + mirror_dns = models.BooleanField(null=False, default=False) + mirror_private = models.BooleanField(null=False, default=False) + host_use_cname = models.BooleanField(null=True, default=False) + host_cname_host = models.CharField(max_length=100, null=True) + mirror_primary = models.BooleanField(null=False, default=False) + error_count = models.IntegerField(null=False, default=0) + alternate_protocol = models.BooleanField(null=False, default=False) + alternate_at_root = models.BooleanField(null=False, default=False) + + class Meta: + db_table='mirrors' + + def __unicode__(self): + return "%s.%s" % (self.country_code, self.mirror_index) + + def get_host_name(self): + if self.mirror_index == 0: + return "ftp.%s.postgresql.org" % self.country_code + else: + return "ftp%s.%s.postgresql.org" % (self.mirror_index, self.country_code) + + def get_root_path(self, method): + if method == 'f' or not self.alternate_at_root: + # FTP method, or http with same path, build complete one + return ("%s/%s" % (self.get_host_name(), self.host_path)).replace('//','/').rstrip('/') + else: + # http with alternate_at_root - thus, ignore the path element + return self.get_host_name() + class Category(models.Model): catname = models.CharField(max_length=100, null=False, blank=False) blurb = models.TextField(null=False, blank=True) diff --git a/pgweb/downloads/views.py b/pgweb/downloads/views.py index cfb57809..5948bb43 100644 --- a/pgweb/downloads/views.py +++ b/pgweb/downloads/views.py @@ -2,10 +2,12 @@ from django.shortcuts import render_to_response, get_object_or_404 from django.http import HttpResponse, Http404, HttpResponseRedirect from django.template import TemplateDoesNotExist, loader, Context from django.contrib.auth.decorators import login_required +from django.db import connection, transaction from django.conf import settings import os from datetime import datetime +import urlparse from pgweb.util.decorators import ssl_required from pgweb.util.contexts import NavContext @@ -103,7 +105,76 @@ def ftpbrowser(request, subpath): 'maintainer': _getfile(fspath, 'CURRENT_MAINTAINER'), }, NavContext(request, 'download')) +def _get_numeric_ip(request): + try: + ip = request.META['REMOTE_ADDR'] + p = ip.split('.') + return int(p[0])*16777216 + int(p[1])*65536 + int(p[2])*256 + int(p[3]) + except: + return None +def mirrorselect(request, path): + try: + numericip = _get_numeric_ip(request) + near_mirrors = Mirror.objects.filter(mirror_active=True, mirror_private=False, mirror_dns=True).extra(where=["mirror_last_rsync>(now() - '48 hours'::interval)","country_code IN (SELECT lower(countrycode) FROM iptocountry WHERE %s BETWEEN startip AND endip)" % numericip]).order_by('country_name', 'mirror_index') + except: + near_mirrors = None + all_mirrors = Mirror.objects.filter(mirror_active=True, mirror_private=False, mirror_dns=True).extra(where=["mirror_last_rsync>(now() - '48 hours'::interval)"]).order_by('country_name', 'mirror_index') + return render_to_response('downloads/mirrorselect.html', { + 'path': path, + 'all_mirrors': all_mirrors, + 'near_mirrors': near_mirrors, + 'masterserver': settings.MASTERSITE_ROOT, + }, NavContext(request, 'download')) + +def _mirror_redirect_internal(request, scheme, host, path): + # Log the access + curs = connection.cursor() + curs.execute("""INSERT INTO clickthrus (scheme, host, path, country) +VALUES (%(scheme)s, %(host)s, %(path)s, ( +SELECT countrycode FROM iptocountry WHERE %(ip)s BETWEEN startip and endip LIMIT 1))""", { + 'scheme': scheme, + 'host': host, + 'path': path, + 'ip': _get_numeric_ip(request), +}) + transaction.commit_unless_managed() + + # Redirect! + newurl = "%s://%s/%s" % (scheme, host, path) + return HttpResponseRedirect(newurl) + +def mirror_redirect(request, mirrorid, protocol, path): + try: + mirror = Mirror.objects.get(pk=mirrorid) + except Mirror.NotFound: + raise Http404("Specified mirror not found") + + return _mirror_redirect_internal( + request, + protocol=='h' and 'http' or 'ftp', + mirror.get_root_path(protocol), + path, + ) + +def mirror_redirect_old(request): + # Version of redirect that takes parameters in the querystring. This is + # only used by the stackbuilder. + if not request.GET['sb'] == "1": + raise Http404("Page not found, you should be using the new URL format!") + + urlpieces = urlparse.urlparse(request.GET['url']) + if urlpieces.query: + path = "%s?%s" % (urlpieces.path, urlpieces.query) + else: + path = urlpieces.path + + return _mirror_redirect_internal( + request, + urlpieces.scheme, + urlpieces.netloc, + path, + ) ####### # Product catalogue diff --git a/pgweb/settings.py b/pgweb/settings.py index 0802b195..9d003d61 100644 --- a/pgweb/settings.py +++ b/pgweb/settings.py @@ -107,6 +107,7 @@ INSTALLED_APPS = [ SITE_ROOT="http://www.postgresql.org" +MASTERSITE_ROOT="http://wwwmaster.postgresql.org" # Load local settings overrides from settings_local import * diff --git a/pgweb/urls.py b/pgweb/urls.py index 67f58ffb..3c0efd2a 100644 --- a/pgweb/urls.py +++ b/pgweb/urls.py @@ -29,8 +29,11 @@ urlpatterns = patterns('', (r'^about/quotesarchive/$', 'quotes.views.allquotes'), (r'^ftp/(.*/)?$', 'downloads.views.ftpbrowser'), + (r'^download/mirrors-ftp/+(.*)$', 'downloads.views.mirrorselect'), (r'^download/product-categories/$', 'downloads.views.categorylist'), (r'^download/products/(\d+)(-.*)?/$', 'downloads.views.productlist'), + (r'^redir/(\d+)/([hf])/([a-zA-Z0-9/\._-]+)$', 'downloads.views.mirror_redirect'), + (r'^redir$', 'downloads.views.mirror_redirect_old'), (r'^docs/(current|\d\.\d)/(static|interactive)/(.*).html$', 'docs.views.docpage'), diff --git a/templates/downloads/inc_mirror.html b/templates/downloads/inc_mirror.html new file mode 100644 index 00000000..d89933b0 --- /dev/null +++ b/templates/downloads/inc_mirror.html @@ -0,0 +1,9 @@ +
+ diff --git a/templates/downloads/mirrorselect.html b/templates/downloads/mirrorselect.html new file mode 100644 index 00000000..c516a96b --- /dev/null +++ b/templates/downloads/mirrorselect.html @@ -0,0 +1,37 @@ +{%extends "base/page.html"%} +{%block title%}Choose a download mirror{%endblock%} +{%block extrahead%} + +{%endblock%} +{%block contents%} +Downloading: {{path}}
+ + +{%if near_mirrors%} +We think these mirrors are near you:
+Choose any other mirror in the world:
+Read this if you would like to host a mirror.
+{%endblock%} +