"""
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()