Enhance network connectivity tests with comprehensive checks for ping, DNS resolution, and HTTP connection; update validation button text in multiple languages to "OK".

This commit is contained in:
skymike03
2025-08-21 22:57:52 +02:00
parent 412a0da20e
commit 333967462d
6 changed files with 129 additions and 40 deletions

View File

@@ -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

View File

@@ -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)",

View File

@@ -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)",

View File

@@ -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)",

View File

@@ -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)",

View File

@@ -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():