2025-04-29 17:35:21 +02:00
|
|
|
|
#
|
|
|
|
|
|
# Erminig - Recupération de la dernière version d'un soft sur page html
|
|
|
|
|
|
# Copyright (C) 2025 L0m1g
|
|
|
|
|
|
# Sous licence DOUARN - Voir le fichier LICENCE pour les détails
|
|
|
|
|
|
#
|
|
|
|
|
|
# Ce fichier fait partie du projet Erminig.
|
|
|
|
|
|
# Libre comme l’air, stable comme un menhir, et salé comme le beurre.
|
|
|
|
|
|
#
|
|
|
|
|
|
|
2025-04-29 17:15:19 +02:00
|
|
|
|
import re
|
|
|
|
|
|
import requests
|
|
|
|
|
|
from erminig.controllers.evezh.abstract import UpstreamSource
|
|
|
|
|
|
from erminig.system.retry import retry_on_failure
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class HttpSource(UpstreamSource):
|
|
|
|
|
|
|
|
|
|
|
|
@retry_on_failure()
|
|
|
|
|
|
def get_latest(self):
|
|
|
|
|
|
base_url = self.config["url"]
|
|
|
|
|
|
pattern = self.config["pattern"]
|
|
|
|
|
|
file_pattern = self.config.get("file")
|
|
|
|
|
|
|
|
|
|
|
|
response = requests.get(
|
|
|
|
|
|
base_url, timeout=10
|
|
|
|
|
|
) # timeout pour éviter de bloquer éternellement
|
|
|
|
|
|
response.raise_for_status()
|
|
|
|
|
|
html = response.text
|
|
|
|
|
|
|
|
|
|
|
|
matches = re.findall(pattern, html)
|
|
|
|
|
|
if not matches:
|
|
|
|
|
|
print(f"[{self.name}] Aucun match avec pattern : {pattern}")
|
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
latest_dir = sorted(set(matches), key=self.version_key)[-1]
|
|
|
|
|
|
version = self.extract_version(latest_dir)
|
|
|
|
|
|
|
|
|
|
|
|
if file_pattern:
|
|
|
|
|
|
filename = file_pattern.replace("${version}", version)
|
|
|
|
|
|
url = f"{base_url}{latest_dir}{filename}"
|
|
|
|
|
|
else:
|
|
|
|
|
|
url = f"{base_url}{latest_dir}"
|
|
|
|
|
|
|
|
|
|
|
|
print(url)
|
|
|
|
|
|
|
|
|
|
|
|
return {"name": self.name, "version": version, "url": url}
|
|
|
|
|
|
|
|
|
|
|
|
def extract_version(self, path):
|
|
|
|
|
|
match = re.search(r"([0-9]+\.[0-9]+(?:\.[0-9]+)?)", path)
|
|
|
|
|
|
return match.group(1) if match else path
|
|
|
|
|
|
|
|
|
|
|
|
def version_key(self, ver):
|
|
|
|
|
|
nums = re.findall(r"\d+", ver)
|
|
|
|
|
|
return list(map(int, nums))
|