61 lines
2.2 KiB
Python
61 lines
2.2 KiB
Python
import os
|
|
import requests
|
|
import tarfile
|
|
import shutil
|
|
from pathlib import Path
|
|
|
|
def download_maxmind(license_key: str, db_name: str, dest_path: str, url_template: str):
|
|
url = url_template.format(DBNAME=db_name, LICENSE_KEY=license_key)
|
|
tmp = Path("/tmp") / "maxmind_download.tar.gz"
|
|
r = requests.get(url, stream=True, timeout=60)
|
|
r.raise_for_status()
|
|
with open(tmp, "wb") as f:
|
|
for chunk in r.iter_content(chunk_size=8192):
|
|
if chunk:
|
|
f.write(chunk)
|
|
with tarfile.open(tmp, "r:gz") as tar:
|
|
for member in tar.getmembers():
|
|
if member.name.endswith(".mmdb"):
|
|
member_f = tar.extractfile(member)
|
|
if member_f is None:
|
|
continue
|
|
dest = Path(dest_path)
|
|
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
with open(dest, "wb") as out_f:
|
|
shutil.copyfileobj(member_f, out_f)
|
|
return str(dest)
|
|
raise RuntimeError("Nie znaleziono pliku .mmdb w archiwum")
|
|
|
|
def download_file(url: str, dest_path: str):
|
|
r = requests.get(url, stream=True, timeout=60)
|
|
r.raise_for_status()
|
|
Path(dest_path).parent.mkdir(parents=True, exist_ok=True)
|
|
with open(dest_path, "wb") as f:
|
|
for chunk in r.iter_content(chunk_size=8192):
|
|
if chunk:
|
|
f.write(chunk)
|
|
return dest_path
|
|
|
|
def github_latest_mmdb(repo: str, token: str | None = None) -> str | None:
|
|
"""
|
|
Zwraca URL do najnowszego assetu .mmdb z releases/latest dla repo (owner/name).
|
|
Preferencja: City -> Country -> ASN.
|
|
"""
|
|
api = f"https://api.github.com/repos/{repo}/releases/latest"
|
|
headers = {"Accept": "application/vnd.github+json"}
|
|
if token:
|
|
headers["Authorization"] = f"Bearer {token}"
|
|
r = requests.get(api, headers=headers, timeout=30)
|
|
r.raise_for_status()
|
|
data = r.json()
|
|
assets = data.get("assets", [])
|
|
urls = [a.get("browser_download_url") for a in assets if (a.get("browser_download_url") or "").lower().endswith(".mmdb")]
|
|
if not urls:
|
|
return None
|
|
lower = [u.lower() for u in urls]
|
|
for key in ("city", "country", "asn"):
|
|
for i, u in enumerate(lower):
|
|
if key in u:
|
|
return urls[i]
|
|
return urls[0]
|