# # 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. # 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))