From 333967462dae90896a5d6cc1f4f261b0a3f82266 Mon Sep 17 00:00:00 2001 From: skymike03 Date: Thu, 21 Aug 2025 22:57:52 +0200 Subject: [PATCH] Enhance network connectivity tests with comprehensive checks for ping, DNS resolution, and HTTP connection; update validation button text in multiple languages to "OK". --- ports/RGSX/config.py | 54 +++++++++++------- ports/RGSX/languages/de.json | 2 +- ports/RGSX/languages/en.json | 2 +- ports/RGSX/languages/es.json | 2 +- ports/RGSX/languages/fr.json | 2 +- ports/RGSX/network.py | 107 +++++++++++++++++++++++++++++------ 6 files changed, 129 insertions(+), 40 deletions(-) diff --git a/ports/RGSX/config.py b/ports/RGSX/config.py index 2f41001..b01d262 100644 --- a/ports/RGSX/config.py +++ b/ports/RGSX/config.py @@ -1,11 +1,19 @@ import pygame # type: ignore import os -import sys import logging +import platform +from rgsx_settings import load_rgsx_settings, save_rgsx_settings, migrate_old_settings # Version actuelle de l'application app_version = "1.9.9.0" +def get_operating_system(): + """Renvoie le nom du système d'exploitation.""" + return platform.system() +#log dans la console le système d'exploitation +print(f"Système d'exploitation : {get_operating_system()}") + + def get_application_root(): """Détermine le dossier de l'application de manière portable.""" try: @@ -13,38 +21,47 @@ def get_application_root(): current_file = os.path.abspath(__file__) # Remonter au dossier parent de config.py (par exemple, dossier de l'application) app_root = os.path.dirname(os.path.dirname(current_file)) + print(f"Dossier de l'application : {app_root}") return app_root - except NameError: # Si __file__ n'est pas défini (par exemple, exécution dans un REPL) return os.path.abspath(os.getcwd()) def get_system_root(): + OPERATING_SYSTEM = get_operating_system() """Détermine le dossier racine du système de fichiers (par exemple, /userdata ou C:\\).""" try: - if sys.platform.startswith("win"): + if OPERATING_SYSTEM == "Windows": # Sur Windows, extraire la lettre de disque current_path = os.path.abspath(__file__) drive, _ = os.path.splitdrive(current_path) system_root = drive + os.sep + print(f"Dossier racine du système : {system_root}") return system_root - else: - # Sur Linux/Batocera, remonter jusqu'à atteindre /userdata ou / - current_path = os.path.abspath(__file__) - current_dir = current_path - while current_dir != os.path.dirname(current_dir): # Tant qu'on peut remonter - parent_dir = os.path.dirname(current_dir) - if os.path.basename(parent_dir) == "userdata": # Vérifier si le parent est userdata - system_root = parent_dir - return system_root - current_dir = parent_dir - # Si userdata n'est pas trouvé, retourner / - return "/" + elif OPERATING_SYSTEM == "Linux": + # tester si c'est batocera : + if os.path.exists("/usr/share/batocera"): + OPERATING_SYSTEM = "Batocera" + #remonter jusqu'à atteindre /userdata + current_path = os.path.abspath(__file__) + current_dir = current_path + while current_dir != os.path.dirname(current_dir): # Tant qu'on peut remonter + parent_dir = os.path.dirname(current_dir) + if os.path.basename(parent_dir) == "userdata": # Vérifier si le parent est userdata + system_root = parent_dir + print(f"Dossier racine du système : {system_root}") + return system_root + current_dir = parent_dir + # Si userdata n'est pas trouvé, retourner / + return "/" + else: + return "/" except NameError: - # Si __file__ n'est pas défini, utiliser le répertoire de travail actuel - return "/" if not sys.platform.startswith("win") else os.path.splitdrive(os.getcwd())[0] + os.sep + + return "/" if not OPERATING_SYSTEM == "Windows" else os.path.splitdrive(os.getcwd())[0] + os.sep # Chemins de base + SYSTEM_FOLDER = get_system_root() APP_FOLDER = os.path.join(get_application_root(), "RGSX") ROMS_FOLDER = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(APP_FOLDER))), "roms") @@ -86,8 +103,7 @@ XDVDFS_LINUX = os.path.join(APP_FOLDER,"assets", "xdvdfs") unrar_download_exe = os.path.join(OTA_SERVER_URL, "unrar.exe") xdvdfs_download_exe = os.path.join(OTA_SERVER_URL, "xdvdfs.exe") -# Import des fonctions de gestion des paramètres RGSX -from rgsx_settings import load_rgsx_settings, save_rgsx_settings, migrate_old_settings + xdvdfs_download_linux = os.path.join(OTA_SERVER_URL, "xdvdfs") # Constantes pour la répétition automatique dans pause_menu diff --git a/ports/RGSX/languages/de.json b/ports/RGSX/languages/de.json index 5a59d44..d1035bf 100644 --- a/ports/RGSX/languages/de.json +++ b/ports/RGSX/languages/de.json @@ -88,7 +88,7 @@ "button_yes": "Ja", "button_no": "Nein", - "button_validate": "Bestätigen", + "button_validate": "OK", "controls_hold_message": "3 Sekunden halten für: '{0}'", "controls_skip_message": "Drücke Esc, um zu überspringen (nur PC)", diff --git a/ports/RGSX/languages/en.json b/ports/RGSX/languages/en.json index ec7b960..0632de6 100644 --- a/ports/RGSX/languages/en.json +++ b/ports/RGSX/languages/en.json @@ -88,7 +88,7 @@ "button_yes": "Yes", "button_no": "No", - "button_validate": "Validate", + "button_validate": "OK", "controls_hold_message": "Hold for 3s for: '{0}'", "controls_skip_message": "Press Esc to skip (PC only)", diff --git a/ports/RGSX/languages/es.json b/ports/RGSX/languages/es.json index 656a627..b75ff6c 100644 --- a/ports/RGSX/languages/es.json +++ b/ports/RGSX/languages/es.json @@ -89,7 +89,7 @@ "button_yes": "Sí", "button_no": "No", - "button_validate": "Validar", + "button_validate": "OK", "controls_hold_message": "Mantén presionado durante 3s para: '{0}'", "controls_skip_message": "Presiona Esc para omitir (solo PC)", diff --git a/ports/RGSX/languages/fr.json b/ports/RGSX/languages/fr.json index 9c7d8bb..4c66e13 100644 --- a/ports/RGSX/languages/fr.json +++ b/ports/RGSX/languages/fr.json @@ -85,7 +85,7 @@ "button_yes": "Oui", "button_no": "Non", - "button_validate": "Valider", + "button_validate": "OK", "controls_hold_message": "Maintenez pendant 3s pour : '{0}'", "controls_skip_message": "Appuyez sur Échap pour passer(Pc only)", diff --git a/ports/RGSX/network.py b/ports/RGSX/network.py index 564eb81..3568cf7 100644 --- a/ports/RGSX/network.py +++ b/ports/RGSX/network.py @@ -25,29 +25,102 @@ cache = {} CACHE_TTL = 3600 # 1 heure def test_internet(): - """Teste la connexion Internet de manière portable pour Windows et Linux/Batocera.""" - logger.debug("Test de connexion Internet") + """Teste la connexion Internet de manière complète et portable pour Windows et Linux/Batocera.""" + logger.debug("=== Début test de connexion Internet complet ===") - # Choisir l'option ping en fonction de la plateforme + # Test 1: Ping vers serveurs DNS publics ping_option = '-n' if sys.platform.startswith("win") else '-c' - logger.debug(f"Utilisation de ping avec option {ping_option}") + dns_servers = ['8.8.8.8', '1.1.1.1', '208.67.222.222'] # Google, Cloudflare, OpenDNS + ping_success = False + for dns_server in dns_servers: + logger.debug(f"Test ping vers {dns_server} avec option {ping_option}") + try: + result = subprocess.run( + ['ping', ping_option, '2', dns_server], + capture_output=True, + text=True, + timeout=8 + ) + if result.returncode == 0: + logger.debug(f"[OK] Ping vers {dns_server} réussi") + ping_success = True + break + else: + logger.debug(f"[FAIL] Ping vers {dns_server} échoué (code: {result.returncode})") + if result.stderr: + logger.debug(f"Erreur ping: {result.stderr.strip()}") + except subprocess.TimeoutExpired: + logger.debug(f"[FAIL] Timeout ping vers {dns_server}") + except Exception as e: + logger.debug(f"[FAIL] Exception ping vers {dns_server}: {str(e)}") + + # Test 2: Tentative de résolution DNS + dns_success = False try: - result = subprocess.run( - ['ping', ping_option, '4', '8.8.8.8'], - capture_output=True, - text=True, - timeout=5 - ) - if result.returncode == 0: - logger.debug("Connexion Internet OK (ping)") - return True - else: - logger.debug(f"Échec ping 8.8.8.8, code retour: {result.returncode}") - return False + import socket + logger.debug("Test de résolution DNS pour google.com") + socket.gethostbyname('google.com') + logger.debug("[OK] Résolution DNS réussie") + dns_success = True + except socket.gaierror as e: + logger.debug(f"[FAIL] Erreur résolution DNS: {str(e)}") except Exception as e: - logger.debug(f"Erreur test Internet (ping): {str(e)}") + logger.debug(f"[FAIL] Exception résolution DNS: {str(e)}") + + # Test 3: Tentative de connexion HTTP + http_success = False + test_urls = [ + 'http://www.google.com', + 'http://www.cloudflare.com', + 'https://httpbin.org/get' + ] + + for test_url in test_urls: + logger.debug(f"Test connexion HTTP vers {test_url}") + try: + response = requests.get(test_url, timeout=5, allow_redirects=True) + if response.status_code == 200: + logger.debug(f"[OK] Connexion HTTP vers {test_url} réussie (code: {response.status_code})") + http_success = True + break + else: + logger.debug(f"[FAIL] Connexion HTTP vers {test_url} échouée (code: {response.status_code})") + except requests.exceptions.Timeout: + logger.debug(f"[FAIL] Timeout connexion HTTP vers {test_url}") + except requests.exceptions.ConnectionError as e: + logger.debug(f"[FAIL] Erreur connexion HTTP vers {test_url}: {str(e)}") + except Exception as e: + logger.debug(f"[FAIL] Exception connexion HTTP vers {test_url}: {str(e)}") + + # Analyse des résultats + total_tests = 3 + passed_tests = sum([ping_success, dns_success, http_success]) + + logger.debug(f"=== Résultats test Internet: {passed_tests}/{total_tests} tests réussis ===") + logger.debug(f"Ping: {'[OK]' if ping_success else '[FAIL]'}") + logger.debug(f"DNS: {'[OK]' if dns_success else '[FAIL]'}") + logger.debug(f"HTTP: {'[OK]' if http_success else '[FAIL]'}") + + # Diagnostic et conseils + if passed_tests == 0: + logger.error("Aucune connexion Internet détectée. Vérifiez:") + logger.error("- Câble réseau ou WiFi connecté") + logger.error("- Configuration proxy/firewall") + logger.error("- Paramètres réseau système") return False + elif passed_tests < total_tests: + logger.warning(f"Connexion Internet partielle ({passed_tests}/{total_tests})") + if not ping_success: + logger.warning("- Ping échoué: possible blocage ICMP par firewall") + if not dns_success: + logger.warning("- DNS échoué: problème serveurs DNS") + if not http_success: + logger.warning("- HTTP échoué: possible blocage proxy/firewall") + return True # Connexion partielle acceptable + else: + logger.debug("[OK] Connexion Internet complète et fonctionnelle") + return True async def check_for_updates():