64a92174c0
FTP is a terrible protocol these days compared to HTTP. IPv6 support is spotty at best, it is much slower for the connect/begin transfer cycle, and overall just doesn't provide anything HTTP does better. Start killing bits that we've added to treat FTP as a first-class protocol and regulate it to the back seat. The expectation here is once this commit goes live to the production site, the FTP mirror URLs themselves will get removed completely from the database, and the FTP protocol object itself will get deleted. Signed-off-by: Dan McGee <dan@archlinux.org>
85 lines
2.4 KiB
Python
85 lines
2.4 KiB
Python
from urlparse import urlparse, urlunsplit
|
|
|
|
from django import forms
|
|
from django.contrib import admin
|
|
|
|
from .models import (Mirror, MirrorProtocol, MirrorUrl, MirrorRsync,
|
|
CheckLocation)
|
|
|
|
|
|
class MirrorUrlForm(forms.ModelForm):
|
|
class Meta:
|
|
model = MirrorUrl
|
|
|
|
def clean_url(self):
|
|
# is this a valid-looking URL?
|
|
url_parts = urlparse(self.cleaned_data["url"])
|
|
if not url_parts.scheme:
|
|
raise forms.ValidationError("No URL scheme (protocol) provided.")
|
|
if not url_parts.netloc:
|
|
raise forms.ValidationError("No URL host provided.")
|
|
if url_parts.params or url_parts.query or url_parts.fragment:
|
|
raise forms.ValidationError(
|
|
"URL parameters, query, and fragment elements are not supported.")
|
|
# ensure we always save the URL with a trailing slash
|
|
path = url_parts.path
|
|
if not path.endswith('/'):
|
|
path += '/'
|
|
url = urlunsplit((url_parts.scheme, url_parts.netloc, path, '', ''))
|
|
return url
|
|
|
|
|
|
class MirrorUrlInlineAdmin(admin.TabularInline):
|
|
model = MirrorUrl
|
|
form = MirrorUrlForm
|
|
readonly_fields = ('protocol', 'has_ipv4', 'has_ipv6')
|
|
extra = 3
|
|
|
|
|
|
class MirrorRsyncForm(forms.ModelForm):
|
|
class Meta:
|
|
model = MirrorRsync
|
|
|
|
|
|
class MirrorRsyncInlineAdmin(admin.TabularInline):
|
|
model = MirrorRsync
|
|
form = MirrorRsyncForm
|
|
extra = 2
|
|
|
|
|
|
class MirrorAdminForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Mirror
|
|
upstream = forms.ModelChoiceField(
|
|
queryset=Mirror.objects.filter(tier__gte=0, tier__lte=1),
|
|
required=False)
|
|
|
|
|
|
class MirrorAdmin(admin.ModelAdmin):
|
|
form = MirrorAdminForm
|
|
list_display = ('name', 'tier', 'active', 'public',
|
|
'isos', 'admin_email', 'alternate_email')
|
|
list_filter = ('tier', 'active', 'public')
|
|
search_fields = ('name', 'admin_email', 'alternate_email')
|
|
inlines = [
|
|
MirrorUrlInlineAdmin,
|
|
MirrorRsyncInlineAdmin,
|
|
]
|
|
|
|
|
|
class MirrorProtocolAdmin(admin.ModelAdmin):
|
|
list_display = ('protocol', 'is_download', 'default')
|
|
list_filter = ('is_download', 'default')
|
|
|
|
|
|
class CheckLocationAdmin(admin.ModelAdmin):
|
|
list_display = ('hostname', 'source_ip', 'country', 'created')
|
|
search_fields = ('hostname', 'source_ip')
|
|
|
|
|
|
admin.site.register(Mirror, MirrorAdmin)
|
|
admin.site.register(MirrorProtocol, MirrorProtocolAdmin)
|
|
admin.site.register(CheckLocation, CheckLocationAdmin)
|
|
|
|
# vim: set ts=4 sw=4 et:
|