"""Stockage des sessions SSH (serveurs enregistres) dans un fichier JSON local.""" from __future__ import annotations import json import uuid from dataclasses import dataclass, field, asdict from pathlib import Path from app.paths import DATA_DIR # noqa: E402 (chemins valables aussi en .exe) SESSIONS_FILE = DATA_DIR / "sessions.json" AUTH_AUTO = "auto" # comme la commande ssh : agent + cles ~/.ssh, mot de passe en secours AUTH_KEY = "key" # cle privee explicitement choisie AUTH_PASSWORD = "password" AUTH_AGENT = "agent" @dataclass class Session: id: str = field(default_factory=lambda: str(uuid.uuid4())) name: str = "" group: str = "" # ex: "Prod/Web" -- sert a construire l'arborescence de dossiers host: str = "" port: int = 22 username: str = "" auth_type: str = AUTH_AUTO # auto | key | password | agent key_path: str = "" notes: str = "" def to_dict(self) -> dict: return asdict(self) @staticmethod def from_dict(data: dict) -> "Session": known = {f: data.get(f) for f in Session.__dataclass_fields__ if f in data} s = Session() for k, v in known.items(): setattr(s, k, v) return s class SessionStore: """Charge/sauvegarde la liste des sessions depuis data/sessions.json.""" def __init__(self, path: Path = SESSIONS_FILE): self.path = path self.sessions: list[Session] = [] self.load() def load(self) -> None: DATA_DIR.mkdir(parents=True, exist_ok=True) if not self.path.exists(): self.sessions = [] self.save() return try: raw = json.loads(self.path.read_text(encoding="utf-8")) except (json.JSONDecodeError, OSError): raw = {"sessions": []} self.sessions = [Session.from_dict(s) for s in raw.get("sessions", [])] def save(self) -> None: DATA_DIR.mkdir(parents=True, exist_ok=True) payload = {"sessions": [s.to_dict() for s in self.sessions]} self.path.write_text(json.dumps(payload, indent=2, ensure_ascii=False), encoding="utf-8") def add(self, session: Session) -> None: self.sessions.append(session) self.save() def update(self, session: Session) -> None: for i, s in enumerate(self.sessions): if s.id == session.id: self.sessions[i] = session break self.save() def delete(self, session_id: str) -> None: self.sessions = [s for s in self.sessions if s.id != session_id] self.save() def groups(self) -> list[str]: return sorted({s.group for s in self.sessions if s.group})