]> git.ipfire.org Git - pbs.git/commitdiff
mirrors: Store all resolved IP addresses
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 13 Feb 2025 19:49:56 +0000 (19:49 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 13 Feb 2025 19:49:56 +0000 (19:49 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/mirrors.py
src/database.sql

index e3b7df06e99d848d0a564c0990ea3bb51a52c957..1dcd081585dcbf798700b5f2c03dd5d7244567d6 100644 (file)
@@ -13,7 +13,8 @@ import urllib.parse
 import location
 
 import sqlalchemy
-from sqlalchemy import Boolean, Column, DateTime, Double, ForeignKey, Integer, Text
+from sqlalchemy import ARRAY, Boolean, Column, DateTime, Double, ForeignKey, Integer, Text
+from sqlalchemy.dialects.postgresql import INET
 
 from . import base
 from . import database
@@ -236,6 +237,32 @@ class Mirror(database.Base, database.BackendMixin, database.SoftDeleteMixin):
 
        asn = Column(Integer)
 
+       # Addresses IPv6
+
+       addresses_ipv6 = Column(ARRAY(INET), nullable=False, default=[])
+
+       def supports_ipv6(self):
+               """
+                       Returns True if this mirror supports IPv6
+               """
+               if self.addresses_ipv6:
+                       return True
+
+               return False
+
+       # Addresses IPv4
+
+       addresses_ipv4 = Column(ARRAY(INET), nullable=False, default=[])
+
+       def supports_ipv4(self):
+               """
+                       Returns True if this mirror supports IPv4
+               """
+               if self.addresses_ipv4:
+                       return True
+
+               return False
+
        async def _update_country_code_and_asn(self):
                """
                        Updates the country code of this mirror
@@ -254,12 +281,21 @@ class Mirror(database.Base, database.BackendMixin, database.SoftDeleteMixin):
                        # Raise anything else
                        raise e
 
-               for family, address in addresses:
-                       # Extract the address
-                       address = address[0]
+               print(addresses)
 
-                       # Lookup the address
+               # Store all IP addresses
+               self.addresses_ipv6 = [
+                       address[0] for family, address in addresses if family == socket.AF_INET6
+               ]
+               self.addresses_ipv4 = [
+                       address[0] for family, address in addresses if family == socket.AF_INET
+               ]
+
+               # Lookup the country code and ASN
+               for address in self.addresses_ipv6 + self.addresses_ipv4:
                        network = self.backend.mirrors.location.lookup(address)
+
+                       # Try the next IP address if we didn't find any data
                        if not network or not network.country_code:
                                continue
 
index 41ee97afcbbbafe22e499bd19e3a3c2e043d9d28..df20b5bcf48ff77ef739a0e245efbbe935025d6b 100644 (file)
@@ -592,7 +592,9 @@ CREATE TABLE public.mirrors (
     country_code text,
     error text,
     asn integer,
-    notes text DEFAULT ''::text NOT NULL
+    notes text DEFAULT ''::text NOT NULL,
+    addresses_ipv6 inet[] DEFAULT '{}'::inet[] NOT NULL,
+    addresses_ipv4 inet[] DEFAULT '{}'::inet[] NOT NULL
 );