ASN lookup : ajout fallback Team Cymru whois (port 43)

3e service de résolution après ip-api.com et ipinfo.io.
Cymru whois utilise TCP port 43 (pas HTTPS), ce qui fonctionne même
quand les sorties HTTPS sont bloquées côté serveur.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Alpinux 2026-05-06 15:38:54 +02:00
parent d272b3e8b7
commit 94f75dc59c

View file

@ -722,7 +722,7 @@ def _lookup_ip_asn(ip: str) -> dict:
except Exception:
pass
# Fallback : ipinfo.io si toujours pas d'AS
# Fallback 1 : ipinfo.io
if not result.get("asn"):
try:
req = urllib.request.Request(
@ -736,6 +736,29 @@ def _lookup_ip_asn(ip: str) -> dict:
except Exception:
pass
# Fallback 2 : Team Cymru whois (port 43, TCP — fonctionne même si HTTPS bloqué)
if not result.get("asn"):
try:
import socket as _socket
s = _socket.create_connection(("whois.cymru.com", 43), timeout=8)
s.sendall(f"verbose\n{ip}\n".encode())
data = b""
while True:
chunk = s.recv(4096)
if not chunk:
break
data += chunk
s.close()
for line in data.decode(errors="replace").splitlines():
if "|" not in line or line.startswith("AS"):
continue
parts = [p.strip() for p in line.split("|")]
if len(parts) >= 7 and parts[0] not in ("", "NA"):
result = {"asn": parts[0], "name": parts[6], "country": parts[3]}
break
except Exception:
pass
# Mise en cache seulement si on a trouvé un AS
if result.get("asn"):
with _pg() as conn: