38 lines
915 B
Python
38 lines
915 B
Python
from __future__ import annotations
|
|
|
|
import ipaddress
|
|
from dataclasses import dataclass, field
|
|
from typing import Dict, Optional
|
|
|
|
from app.core.logger import make_log
|
|
|
|
|
|
@dataclass
|
|
class ASNResolver:
|
|
cache: Dict[str, int] = field(default_factory=dict)
|
|
|
|
def normalise(self, ip: str | None) -> Optional[str]:
|
|
if not ip:
|
|
return None
|
|
try:
|
|
return str(ipaddress.ip_address(ip))
|
|
except Exception:
|
|
return None
|
|
|
|
def resolve(self, ip: str | None) -> Optional[int]:
|
|
norm = self.normalise(ip)
|
|
if not norm:
|
|
return None
|
|
return self.cache.get(norm)
|
|
|
|
def learn(self, ip: str, asn: int) -> None:
|
|
norm = self.normalise(ip)
|
|
if not norm:
|
|
make_log("ASNResolver", f"Invalid IP provided for learn: {ip}", level="warning")
|
|
return
|
|
self.cache[norm] = asn
|
|
|
|
|
|
resolver = ASNResolver()
|
|
|