"""Lecture de ~/.ssh/config : hosts detectes, champs minimum, conversion en Session.""" import sys, pathlib sys.path.insert(0, str(pathlib.Path(__file__).resolve().parent.parent)) import tempfile from pathlib import Path from app.openssh.config import load_openssh_hosts, session_from_openssh_host from app.session_manager import AUTH_AUTO, AUTH_KEY tmp = Path(tempfile.mkdtemp()) config_path = tmp / "config" config_path.write_text( """ Host * ServerAliveInterval 60 ServerAliveCountMax 3 Host bastion HostName bastion.example.com User jump-user Port 2222 IdentityFile ~/.ssh/bastion_key Host proxmox-prod HostName 10.20.20.15 User root IdentityFile ~/.ssh/homelab ProxyJump bastion ForwardAgent yes Host sans-cle HostName 10.0.0.9 User admin """, encoding="utf-8", ) print("=== 1. Fichier absent -> liste vide, pas d'exception ===") absent = load_openssh_hosts(tmp / "n-existe-pas") assert absent == [] print(" OK") print() print("=== 2. Hosts detectes, '*' exclu ===") hosts = load_openssh_hosts(config_path) aliases = [h.alias for h in hosts] print(" alias detectes:", aliases) assert aliases == sorted(aliases), "tries par alias" assert "*" not in aliases assert set(aliases) == {"bastion", "proxmox-prod", "sans-cle"} print(" OK") print() print("=== 3. Champs minimum correctement lus ===") by_alias = {h.alias: h for h in hosts} prod = by_alias["proxmox-prod"] print(" proxmox-prod:", prod) assert prod.hostname == "10.20.20.15" assert prod.user == "root" assert prod.port == 22 # non precise -> defaut assert prod.proxy_jump == "bastion" assert prod.forward_agent is True assert prod.identity_files and prod.identity_files[0].endswith("homelab") # heritees du bloc "Host *" assert prod.server_alive_interval == 60 assert prod.server_alive_count_max == 3 print(" OK") bastion = by_alias["bastion"] assert bastion.port == 2222 assert bastion.forward_agent is False # non precise pour cet hote print(" bastion : port et ForwardAgent par defaut corrects : OK") sans_cle = by_alias["sans-cle"] assert sans_cle.identity_files == [] print(" sans-cle : aucune IdentityFile -> liste vide : OK") print() print("=== 4. Conversion en Session PySSH ===") session_prod = session_from_openssh_host(prod) print(" session:", session_prod) assert session_prod.name == "proxmox-prod" assert session_prod.host == "10.20.20.15" assert session_prod.username == "root" assert session_prod.group == "OpenSSH" assert session_prod.auth_type == AUTH_KEY assert session_prod.key_path.endswith("homelab") assert "ProxyJump" in session_prod.notes and "bastion" in session_prod.notes print(" OK") session_sans_cle = session_from_openssh_host(sans_cle) assert session_sans_cle.auth_type == AUTH_AUTO assert "ProxyJump" not in session_sans_cle.notes print(" sans-cle -> AUTH_AUTO, pas de mention ProxyJump : OK") print() print("=== 5. Host sans HostName : l'alias fait office d'hote (comme OpenSSH) ===") config2 = tmp / "config2" config2.write_text("Host monserveur\n User root\n", encoding="utf-8") hosts2 = load_openssh_hosts(config2) assert hosts2[0].hostname == "monserveur" print(" OK") print() print("OPENSSH CONFIG : TOUS LES TESTS OK")