summaryrefslogtreecommitdiff
path: root/templates/mirrors/status.html
blob: 1111d047e72e6216ded1d81033af7b26a3e813d3 (plain)
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
{% extends "base.html" %}
{% load mirror_status %}

{% block title %}Arch Linux - Mirror Status{% endblock %}

{% block content %}
<div id="mirrorstatus" class="box">
    <h2>Mirror Status</h2>
    <p>This page reports the status of all known, public, and active Arch Linux
    mirrors. All data on this page reflects the status of the mirrors within
    the <em>last {{ cutoff|hours }}</em>. All listed times are UTC. The check script runs
    on a regular basis and polls for the <tt>lastsync</tt> file in the root of
    our repository layout. This file is regularly updated on the central
    repository, so checking the value within allows one to see if the mirror
    has synced recently. This page contains several pieces of information about
    each mirror.</p>
    <ul>
        <li><em>Mirror URL:</em> Mirrors are checked on a per-URL basis. If
        both FTP and HTTP access are provided, both will be listed here.</li>
        <li><em>Last Sync:</em> The timestamp retrieved from the
        <tt>lastsync</tt> file on the mirror. If this file could not be
        retrieved or contained data we didn't recognize, this column will show
        'unknown'.</li>
        <li><em>Completion %:</em> The number of mirror checks that have
        successfully connected and disconnected from the given URL. If this is
        below 100%, the mirror may be unreliable.</li>
        <li><em>μ Delay:</em> The calculated average mirroring delay; e.g. the
        mean value of <tt>last check − last sync</tt> for each check of
        this mirror URL. Due to the timing of mirror checks, any value under
        one hour should be viewed as ideal.</li>
        <li><em>μ Duration:</em> The average (mean) time it took to connect and
        retrieve the <tt>lastsync</tt> file from the given URL. Note that this
        connection time is from the location of the Arch server; your geography
        may product different results.</li>
        <li><em>σ Duration:</em> The standard deviation of the connect and
        retrieval time. A high standard deviation can indicate an unstable or
        overloaded mirror.</li>
        <li><em>Mirror Score:</em> A very rough calculation for ranking
        mirrors. It is currently calculated as <tt>hours delay + average
            duration + standard deviation</tt>. Lower is better.</li>
    </ul>
    <p>The final table on this page is an error log, which shows any errors
    that occurred while contacting mirrors. This only shows errors that
    occurred within the last {{ cutoff|hours }}.</p>
    <ul>
        <li><a href="#outofsync">Out of Sync Mirrors</a></li>
        <li><a href="#successful">Successfully Syncing Mirrors</a></li>
        <li><a href="#errorlog">Mirror Syncing Error Log</a></li>
    </ul>

    <p>The last mirror check ran at {{ last_check|date:'Y-m-d H:i' }} UTC.
    Checks have ran {{ num_checks }} times in the last {{ cutoff|hours }} at an average
    interval of {{ check_frequency|duration }} (hh:mm).</p>

    <a name="outofsync" id="outofsync"></a>
    <h3>Out of Sync Mirrors</h3>
    {% with bad_urls as urls %}
    {% with 'outofsync_mirrors' as table_id %}
    {% include "mirrors/status_table.html" %}
    {% endwith %}
    {% endwith %}

    <a name="successful" id="successful"></a>
    <h3>Successfully Syncing Mirrors</h3>
    {% with good_urls as urls %}
    {% with 'successful_mirrors' as table_id %}
    {% include "mirrors/status_table.html" %}
    {% endwith %}
    {% endwith %}

    <a name="errorlog" id="errorlog"></a>
    <h3>Mirror Syncing Error Log</h3>
    <table id="errorlog_mirrors" class="results">
        <thead>
            <tr>
                <th>Mirror URL</th>
                <th>Protocol</th>
                <th>Country</th>
                <th>Error Message</th>
                <th>Last Occurred</th>
                <th>Occurrences (last {{ cutoff|hours }})</th>
            </tr>
        </thead>
        <tbody>
            {% for log in error_logs %}
            <tr class="{% cycle 'odd' 'even' %}">
                <td>{{ log.url__url }}</td>
                <td>{{ log.url__protocol__protocol }}</td>
                <td>{{ log.url__mirror__country }}</td>
                <td>{{ log.error }}</td>
                <td>{{ log.last_occurred|date:'Y-m-d H:i' }}</td>
                <td>{{ log.error_count }}</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>

</div>
{% load cdn %}{% jquery %}
<script type="text/javascript" src="/media/jquery.tablesorter.min.js"></script>
<script type="text/javascript">
$.tablesorter.addParser({
    /* sorts numeric, but put '', 'unknown', and '∞' last. */
    id: 'mostlydigit',
    is: function(s,table) {
        var special = ['', 'unknown', '∞'];
        var c = table.config;
        return ($.inArray(s, special) > -1) || $.tablesorter.isDigit(s,c);
    },
    format: function(s) {
        var special = ['', 'unknown', '∞'];
        if($.inArray(s, special) > -1) return Number.MAX_VALUE;
        return $.tablesorter.formatFloat(s);
    },
    type: 'numeric'
});
$.tablesorter.addParser({
    /* sorts duration; put '', 'unknown', and '∞' last. */
    id: 'duration',
    is: function(s,table) {
        var special = ['', 'unknown', '∞'];
        return ($.inArray(s, special) > -1) || /^[0-9]+:[0-5][0-9]$/.test(s);
    },
    format: function(s) {
        console.log('duration: ' + s);
        var special = ['', 'unknown', '∞'];
        if($.inArray(s, special) > -1) return Number.MAX_VALUE;
        matches = /^([0-9]+):([0-5][0-9])$/.exec(s);
        console.log(s, matches[1] * 60 + matches[2]);
        return matches[1] * 60 + matches[2];
    },
    type: 'numeric'
});
$(document).ready(function() {
    $("#outofsync_mirrors:has(tbody tr)").tablesorter(
        {widgets: ['zebra'], sortList: [[3,1]],
        headers: { 6: { sorter: 'mostlydigit' }, 7: { sorter: 'mostlydigit' }, 8: { sorter: 'mostlydigit' } } });
    $("#successful_mirrors:has(tbody tr)").tablesorter(
        {widgets: ['zebra'], sortList: [[8,0]],
        headers: { 6: { sorter: 'mostlydigit' }, 7: { sorter: 'mostlydigit' }, 8: { sorter: 'mostlydigit' } } });
    $("#errorlog_mirrors:has(tbody tr)").tablesorter(
        {widgets: ['zebra'], sortList: [[4,1], [5,1]]});
});
</script>
{% endblock %}