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
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
|
{% extends "base.html" %}
{% load cycle from future %}
{% load static from staticfiles %}
{% load mirror_status %}
{% load flags %}
{% load admin_urls %}
{% load bugs %}
{% 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>
{% if perms.mirrors.change_mirror %}
<ul class="admin-actions">
<li><a href="{% url 'admin:mirrors_mirror_change' mirror.pk %}" title="Edit mirror">Edit Mirror</a></li>
</ul>
{% endif %}
<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>Created:</th>
<td>{{ mirror.created }}</td>
</tr>
<tr>
<th>Last Modified:</th>
<td>{{ mirror.last_modified }}</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>Alternate Email:</th>
<td>{% if mirror.alternate_email %}<a href="mailto:{{ mirror.alternate_email }}">{{ mirror.alternate_email }}</a>{% else %}None{% endif %}</td>
</tr>
<tr>
<th>Flyspray Issue:</th>
<td>{% if mirror.bug %}{% bug_link mirror.bug %}{% endif %}</td>
</tr>
<tr>
<th>Notes:</th>
<td class="wrap">{{ 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 class="wrap">{% if ds_mirrors %}
{% for ds in ds_mirrors %}
<a href="{{ ds.get_absolute_url }}"
title="Mirror details for {{ ds.name }}">{{ ds.name }}</a>{% comment %}
{% endcomment %}{% if not ds.active %} <span class="testing-dep">(inactive)</span>{% endif %}{% comment %}
{% endcomment %}{% if not ds.public %} <span class="testing-dep">(private)</span>{% endif %}{% comment %}
{% endcomment %}{% if not forloop.last %}, {% endif %}{% 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 (s)</th>
<th>σ Duration (s)</th>
<th>Score</th>
<th>Details</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|floatvalue:2 }}</td>
<td>{{ m_url.duration_stddev|floatvalue:2 }}</td>
<td>{{ m_url.score|floatvalue:1|default:'∞' }}</td>
<td><a href="{{ m_url.id }}/">Details</a></td>
</tr>
{% endfor %}
</tbody>
</table>
<h3>Error Log</h3>
{% include "mirrors/error_table.html" %}
</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 %}
|