summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2010-09-22 01:58:34 +0200
committerDan McGee <dan@archlinux.org>2010-09-22 01:58:34 +0200
commit550ef2eeeb58a3899b612bf5f895b2ae962086a9 (patch)
tree0227750631a5eb062a24050d391a9438a9c586cf
parent5b87b21ccdd5938acf81afed00ccf0d957f5047c (diff)
downloadarchweb-550ef2eeeb58a3899b612bf5f895b2ae962086a9.tar.gz
archweb-550ef2eeeb58a3899b612bf5f895b2ae962086a9.tar.xz
Allow generated mirrorlist to take status info into account
By using the mirror score we calculate, we can sort the mirrors in the generated mirrorlist for people. Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--mirrors/views.py26
-rw-r--r--templates/mirrors/index.html4
-rw-r--r--templates/mirrors/mirrorlist.txt10
-rw-r--r--templates/mirrors/mirrorlist_status.txt13
4 files changed, 42 insertions, 11 deletions
diff --git a/mirrors/views.py b/mirrors/views.py
index 17f65cc..71c896d 100644
--- a/mirrors/views.py
+++ b/mirrors/views.py
@@ -9,10 +9,12 @@ from .models import Mirror, MirrorUrl, MirrorProtocol
from .utils import get_mirror_statuses, get_mirror_errors
import datetime
+from operator import attrgetter
class MirrorlistForm(forms.Form):
country = forms.MultipleChoiceField(required=False)
protocol = forms.MultipleChoiceField(required=False)
+ use_mirror_status = forms.BooleanField(required=False)
def __init__(self, *args, **kwargs):
super(MirrorlistForm, self).__init__(*args, **kwargs)
@@ -32,13 +34,14 @@ def generate_mirrorlist(request):
if form.is_valid():
countries = form.cleaned_data['country']
protocols = form.cleaned_data['protocol']
- return find_mirrors(request, countries, protocols)
+ use_status = form.cleaned_data['use_mirror_status']
+ return find_mirrors(request, countries, protocols, use_status)
else:
form = MirrorlistForm()
return direct_to_template(request, 'mirrors/index.html', {'mirrorlist_form': form})
-def find_mirrors(request, countries=None, protocols=None):
+def find_mirrors(request, countries=None, protocols=None, use_status=False):
if not protocols:
protocols = MirrorProtocol.objects.exclude(
protocol__iexact='rsync').values_list('protocol', flat=True)
@@ -48,12 +51,25 @@ def find_mirrors(request, countries=None, protocols=None):
)
if countries and 'all' not in countries:
qset = qset.filter(mirror__country__in=countries)
- qset = qset.order_by('mirror__country', 'mirror__name', 'url')
- return direct_to_template(request, 'mirrors/mirrorlist.txt', {
- 'mirror_urls': qset,
+ if not use_status:
+ urls = qset.order_by('mirror__country', 'mirror__name', 'url')
+ template = 'mirrors/mirrorlist.txt'
+ else:
+ scores = dict([(u.id, u.score) for u in get_mirror_statuses()])
+ urls = []
+ for u in qset:
+ u.score = scores[u.id]
+ if u.score and u.score < 100.0:
+ urls.append(u)
+ urls = sorted(urls, key=attrgetter('score'))
+ template = 'mirrors/mirrorlist_status.txt'
+
+ return direct_to_template(request, template, {
+ 'mirror_urls': urls,
},
mimetype='text/plain')
+
def status(request):
bad_timedelta = datetime.timedelta(days=3)
urls = get_mirror_statuses()
diff --git a/templates/mirrors/index.html b/templates/mirrors/index.html
index 8c193ba..1d620b1 100644
--- a/templates/mirrors/index.html
+++ b/templates/mirrors/index.html
@@ -31,7 +31,9 @@
<a href="http://wiki.archlinux.org/index.php/Pacman"
title="ArchWiki: Pacman">pacman</a> mirrorlist based on geography and
desired protocol(s). Simply replace the contents of
- <code>/etc/pacman.d/mirrorlist</code> with your generated list.</p>
+ <code>/etc/pacman.d/mirrorlist</code> with your generated list.
+ Additionally, the mirror status data can be incorporated into the generated
+ mirror list and used to pre-order the mirrors.</p>
<form id="list-generator" method="get">
{{ mirrorlist_form.as_p }}
diff --git a/templates/mirrors/mirrorlist.txt b/templates/mirrors/mirrorlist.txt
index 9d5b691..2eedbd7 100644
--- a/templates/mirrors/mirrorlist.txt
+++ b/templates/mirrors/mirrorlist.txt
@@ -3,11 +3,11 @@ Yes, ugly templates are ugly, but in order to keep line breaks where we want
them, sacrifices have to be made. If editing this template, it is easiest to
forget about where line breaks are happening until you are done getting the
content right, and then go back later to fix it all up.
-{% endcomment %}{% autoescape off %}#
-# Arch Linux repository mirrorlist
-# Generated on {% now "Y-m-d" %}
-#{% for mirror_url in mirror_urls %}{% ifchanged %}
+{% endcomment %}{% autoescape off %}##
+## Arch Linux repository mirrorlist
+## Generated on {% now "Y-m-d" %}
+##{% for mirror_url in mirror_urls %}{% ifchanged %}
-# {{ mirror_url.mirror.country }}{% endifchanged %}
+## {{ mirror_url.mirror.country }}{% endifchanged %}
#Server = {{ mirror_url.url}}$repo/os/$arch{% endfor %}
{% endautoescape %}
diff --git a/templates/mirrors/mirrorlist_status.txt b/templates/mirrors/mirrorlist_status.txt
new file mode 100644
index 0000000..e2fbc1e
--- /dev/null
+++ b/templates/mirrors/mirrorlist_status.txt
@@ -0,0 +1,13 @@
+{% comment %}
+Yes, ugly templates are ugly, but in order to keep line breaks where we want
+them, sacrifices have to be made. If editing this template, it is easiest to
+forget about where line breaks are happening until you are done getting the
+content right, and then go back later to fix it all up.
+{% endcomment %}{% autoescape off %}##
+## Arch Linux repository mirrorlist
+## Sorted by mirror score from mirror status page
+## Generated on {% now "Y-m-d" %}
+{% for mirror_url in mirror_urls %}
+## Score: {{ mirror_url.score|floatformat:1|default:'unknown' }}, {{ mirror_url.mirror.country }}
+#Server = {{ mirror_url.url}}$repo/os/$arch{% endfor %}
+{% endautoescape %}