]> git.ipfire.org Git - pbs.git/commitdiff
mirrors: Show preference on listing
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 13 Feb 2025 20:13:55 +0000 (20:13 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 13 Feb 2025 20:13:55 +0000 (20:13 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/mirrors.py
src/templates/mirrors/macros.html
src/web/base.py

index 1dcd081585dcbf798700b5f2c03dd5d7244567d6..692d9b4641eaac0e04dfc4c19a95c6e3cee73064 100644 (file)
@@ -308,6 +308,12 @@ class Mirror(database.Base, database.BackendMixin, database.SoftDeleteMixin):
                        # Once is enough
                        break
 
+       def is_preferred_for_address(self, address):
+               # Lookup the client
+               network = self.backend.mirrors.location.lookup("%s" % address)
+
+               return self.is_preferred_for_network(network)
+
        def is_preferred_for_network(self, network):
                """
                        Returns True if this mirror is preferred for clients on the given network.
index 919f01bdecbaf36cebeb6c6c341adcf328df7068..f161f5461e5120dd2164640ddee1c90b9a9a622a 100644 (file)
@@ -20,6 +20,9 @@
 
 {% macro MirrorList(mirrors) %}
        {% for mirror in mirrors %}
+               {# Fetch the score of the mirror #}
+               {% set score = mirror.is_preferred_for_address(current_address) %}
+
                <div class="box">
                        <div class="level">
                                <div class="level-left">
                                </div>
 
                                <div class="level-right">
+                                       {# Show stars for preference #}
+                                       {% if score %}
+                                               <div class="level-item">
+                                                       <small>
+                                                               {% for i in score | range %}
+                                                                       <span class="icon" title="{{ _("Preferred Mirror") }}">
+                                                                               <i class="fa-solid fa-star"></i>
+                                                                       </span>
+                                                               {% endfor %}
+                                                       </small>
+                                               </div>
+                                       {% endif %}
+
                                        <div class="level-item">
                                                <div class="tags">
                                                        {# IPv6 #}
index 4a96160c6b914b7a6b78f9ddc4b0c08cd5e8ead1..9540e1358f69c0905882e6fefeeeef3fc759393d 100644 (file)
@@ -6,6 +6,7 @@ import binascii
 import datetime
 import functools
 import http.client
+import ipaddress
 import jinja2
 import jinja2.ext
 import json
@@ -221,7 +222,7 @@ class BaseHandler(tornado.web.RequestHandler):
                """
                        Returns the IP address the request came from.
                """
-               return self.request.headers.get("X-Real-IP") or self.request.remote_ip
+               return ipaddress.ip_address(self.request.remote_ip)
 
        @property
        def user_agent(self):
@@ -321,6 +322,7 @@ class BaseHandler(tornado.web.RequestHandler):
                        # Add some Python built-ins
                        "dir"           : dir,
                        "enumerate"     : enumerate,
+                       "range"         : range,
                }
 
                return JinjaTemplateLoader(env)
@@ -332,6 +334,7 @@ class BaseHandler(tornado.web.RequestHandler):
                ns = {
                        "handler"         : self,
                        "request"         : self.request,
+                       "current_address" : self.current_address,
                        "current_user"    : self.current_user,
                        "hostname"        : self.request.host,
                        "now"             : datetime.datetime.now(),