Code source de services.api_ihm.tests.test_port

"""
Script pour tester la disponibilité des ports et proposer des alternatives.

Version: 1.0.1 (2024-03-19 18:10)
"""

import socket
import logging
from typing import Dict, List, Tuple

# Configuration du logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

# Configuration des ports par service
SERVICE_PORTS = {
    'Flask': {'default': 5000, 'alternatives': [5001, 5002, 5003]},
    'API Modélisation': {'default': 8092, 'alternatives': [8093, 8094, 8095]},
    'PostgreSQL': {'default': 5432, 'alternatives': [5433, 5434, 5435]},
    'Redis': {'default': 6379, 'alternatives': [6380, 6381, 6382]}
}

[docs] def check_port(port: int, host: str = 'localhost') -> bool: """ Vérifie si un port est disponible sur l'hôte spécifié. """ try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.settimeout(1) result = s.connect_ex((host, port)) return result != 0 except Exception as e: logger.error(f"Erreur lors de la vérification du port {port}: {str(e)}") return False
[docs] def find_available_port(service: str, ports: Dict) -> Tuple[int, bool]: """ Trouve un port disponible pour un service donné. Returns: Tuple[int, bool]: (port choisi, True si c'est le port par défaut) """ default_port = ports['default'] if check_port(default_port): return default_port, True # Essayer les ports alternatifs for alt_port in ports['alternatives']: if check_port(alt_port): return alt_port, False return default_port, False
[docs] def generate_env_file(port_config: Dict[str, Tuple[int, bool]]) -> None: """ Génère un fichier .env avec les ports configurés. """ with open('.env', 'w') as f: for service, (port, is_default) in port_config.items(): service_key = service.upper().replace(' ', '_') f.write(f"{service_key}_PORT={port}\n")
[docs] def main(): """ Fonction principale qui teste les ports et propose des configurations. """ logger.info("Analyse des ports disponibles...") port_config = {} configuration_needed = False for service, ports in SERVICE_PORTS.items(): port, is_default = find_available_port(service, ports) port_config[service] = (port, is_default) if not is_default: configuration_needed = True if check_port(port): logger.warning(f"⚠️ {service}: Port par défaut {ports['default']} occupé, utilisation du port {port}") else: logger.error(f"❌ {service}: Aucun port disponible trouvé!") else: logger.info(f"✅ {service}: Utilisation du port par défaut {port}") if configuration_needed: logger.info("\nConfiguration recommandée pour le fichier .env:") for service, (port, _) in port_config.items(): logger.info(f"{service.upper().replace(' ', '_')}_PORT={port}") response = input("\nVoulez-vous générer automatiquement le fichier .env? (o/n): ") if response.lower() == 'o': generate_env_file(port_config) logger.info("Fichier .env généré avec succès!") else: logger.info("✅ Tous les ports par défaut sont disponibles!")
if __name__ == "__main__": main()