From: Michael Tremer Date: Thu, 13 Feb 2025 19:49:56 +0000 (+0000) Subject: mirrors: Store all resolved IP addresses X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f966186ca7e0d58dde79f5078ce9a63cfbac4adb;p=pbs.git mirrors: Store all resolved IP addresses Signed-off-by: Michael Tremer --- diff --git a/src/buildservice/mirrors.py b/src/buildservice/mirrors.py index e3b7df06..1dcd0815 100644 --- a/src/buildservice/mirrors.py +++ b/src/buildservice/mirrors.py @@ -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 diff --git a/src/database.sql b/src/database.sql index 41ee97af..df20b5bc 100644 --- a/src/database.sql +++ b/src/database.sql @@ -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 );