1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
|
{% extends "base.html" %}
{% load static from staticfiles %}
{% load mirror_status %}
{% load flags %}
{% block title %}{{ BRANDING_DISTRONAME }} - {{ mirror.name }} - Mirror Details{% endblock %}
{% block head %}<link rel="stylesheet" type="text/css" href="{% static "flags/fam.css" %}" media="screen, projection" />{% endblock %}
{% block content %}
<div class="box">
<h2>Mirror Details: {{ mirror.name }}</h2>
<table class="compact">
<tr>
<th>Name:</th>
<td>{{ mirror.name }}</td>
</tr>
<tr>
<th>Tier:</th>
<td>{{ mirror.get_tier_display }}</td>
</tr>
<tr>
<th>Has ISOs:</th>
<td>{{ mirror.isos|yesno|capfirst }}</td>
</tr>
{% if user.is_authenticated %}
<tr>
<th>Public:</th>
<td>{{ mirror.public|yesno|capfirst }}</td>
</tr>
<tr>
<th>Active:</th>
<td>{{ mirror.active|yesno|capfirst }}</td>
</tr>
<tr>
<th>Rsync IPs:</th>
<td class="wrap">{{mirror.rsync_ips.all|join:', '}}</td>
</tr>
<tr>
<th>Admin Email:</th>
<td>{% if mirror.admin_email %}<a href="mailto:{{ mirror.admin_email }}">{{ mirror.admin_email }}</a>{% else %}None{% endif %}</td>
</tr>
<tr>
<th>Notes:</th>
<td>{{ mirror.notes|linebreaks }}</td>
</tr>
<tr>
<th>Upstream:</th>
<td>{% if mirror.upstream %}
<a href="{{ mirror.upstream.get_absolute_url }}"
title="Mirror details for {{ mirror.upstream.name }}">{{ mirror.upstream.name }}</a>
{% else %}None{% endif %}</td>
</tr>
<tr>
<th>Downstream:</th>
{% with mirror.downstream as ds_mirrors %}
<td>{% if ds_mirrors %}
{% for ds in ds_mirrors %}
<a href="{{ ds.get_absolute_url }}"
title="Mirror details for {{ ds.name }}">{{ ds.name }}</a>
{% if not ds.active %}<span class="testing-dep">(inactive)</span>{% endif %}
{% if not ds.public %}<span class="testing-dep">(private)</span>{% endif %}
<br/>
{% endfor %}
{% else %}None{% endif %}</td>
{% endwith %}
</tr>
{% endif %}
</table>
<h3>Available URLs</h3>
<table id="available_urls" class="results">
<thead>
<tr>
<th>Mirror URL</th>
<th>Protocol</th>
<th>Country</th>
<th>IPv4</th>
<th>IPv6</th>
<th>Last Sync</th>
<th>Completion %</th>
<th>μ Delay (hh:mm)</th>
<th>μ Duration (secs)</th>
<th>σ Duration (secs)</th>
<th>Mirror Score</th>
</tr>
</thead>
<tbody>
{% for m_url in urls %}
<tr class="{% cycle 'odd' 'even' %}">
<td>{% if m_url.protocol.is_download %}<a href="{{ m_url.url }}">{{ m_url.url }}</a>{% else %}{{ m_url.url }}{% endif %}</td>
<td>{{ m_url.protocol }}</td>
<td class="country">{% country_flag m_url.country %}{{ m_url.country.name }}</td>
<td>{{ m_url.has_ipv4|yesno|capfirst }}</td>
<td>{{ m_url.has_ipv6|yesno|capfirst }}</td>
<td>{{ m_url.last_sync|date:'Y-m-d H:i'|default:'unknown' }}</td>
<td>{{ m_url.completion_pct|percentage:1 }}</td>
<td>{{ m_url.delay|duration|default:'unknown' }}</td>
<td>{{ m_url.duration_avg|floatformat:2 }}</td>
<td>{{ m_url.duration_stddev|floatformat:2 }}</td>
<td>{{ m_url.score|floatformat:1|default:'∞' }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="box">
<h2>Mirror Status Charts</h2>
<p>Periodic checks of the mirrors are done from various geographic
locations, IP addresses, and using IPv4 or IPv6. These results are
summarized in graphical form below.</p>
<div id="charts-container"></div>
</div>
{% endblock %}
{% block script_block %}
{% load cdn %}{% jquery %}{% jquery_tablesorter %}
<script type="text/javascript" src="{% static "d3-3.0.6.min.js" %}"></script>
<script type="text/javascript" src="{% static "archweb.js" %}"></script>
<script type="text/javascript" src="{% static "mirror_status.js" %}"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#available_urls:has(tbody tr)").tablesorter(
{widgets: ['zebra'], sortList: [[1,0], [2,0]],
headers: { 8: { sorter: 'mostlydigit' }, 9: { sorter: 'mostlydigit' }, 10: { sorter: 'mostlydigit' } } });
});
$(document).ready(function() {
draw_graphs("/mirrors/locations/json/", "./json/", "#charts-container");
});
</script>
{% endblock %}
|