Sortie de domaine (demandee) : - Bouton « Quitter le domaine » et commande CLI `leave`, via Remove-Computer sous Windows et realm leave sous Linux. - Nettoyage optionnel des paquets sous Linux. packagekit est exclu de la liste : il sert aussi au gestionnaire de logiciels du bureau. - Le champ « Nom de la machine » passe en lecture seule : il ne peut pas etre modifie depuis cette fenetre. Corrections tirees de la sortie PowerShell rapportee : - Les barres de progression etaient serialisees en CLIXML et polluaient le journal ; les accents arrivaient illisibles (console OEM lue en cp1252). Progression desactivee, console en UTF-8, CLIXML residuel filtre. - Le marqueur interne JOIN_FAILURE: n'apparait plus dans le message affiche. Diagnostic : - Ajout du SRV `_ldap._tcp.dc._msdcs`, celui que DsGetDcName utilise pour localiser un DC. Son absence donne exactement l'erreur rencontree, et le diagnostic ne le verifiait pas. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
68 lines
2.3 KiB
Python
68 lines
2.3 KiB
Python
"""Interface commune aux backends de jointure de domaine (Linux/Windows)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from abc import ABC, abstractmethod
|
|
from dataclasses import dataclass
|
|
from typing import Callable, Optional
|
|
|
|
|
|
@dataclass
|
|
class JoinResult:
|
|
success: bool
|
|
message: str
|
|
needs_reboot: bool = False
|
|
|
|
|
|
OutputCallback = Callable[[str], None]
|
|
|
|
|
|
class DomainJoinBackend(ABC):
|
|
"""Backend de jointure à un domaine Active Directory."""
|
|
|
|
@abstractmethod
|
|
def is_available(self) -> tuple[bool, str]:
|
|
"""Indique si les outils nécessaires sont présents. Retourne (disponible, message)."""
|
|
|
|
@abstractmethod
|
|
def join(
|
|
self,
|
|
domain: str,
|
|
username: str,
|
|
password: str,
|
|
ou: Optional[str] = None,
|
|
computer_name: Optional[str] = None,
|
|
on_output: Optional[OutputCallback] = None,
|
|
) -> JoinResult:
|
|
"""Rejoint le domaine. Le mot de passe n'est jamais passé en argument
|
|
de ligne de commande : il est transmis via l'entrée standard du
|
|
sous-processus pour ne pas apparaître dans la liste des processus."""
|
|
|
|
def can_leave(self) -> bool:
|
|
"""True si ce backend sait faire quitter le domaine au poste."""
|
|
return False
|
|
|
|
def leave(
|
|
self,
|
|
domain: str,
|
|
username: str,
|
|
password: str,
|
|
remove_packages: bool = False,
|
|
on_output: Optional[OutputCallback] = None,
|
|
) -> JoinResult:
|
|
"""Fait quitter le domaine au poste. Comme pour join(), le mot de passe
|
|
ne passe jamais par la ligne de commande.
|
|
|
|
`remove_packages` demande en plus de désinstaller les paquets système
|
|
devenus inutiles — sans effet sur les backends qui n'en installent pas.
|
|
"""
|
|
return JoinResult(success=False, message="Sortie de domaine non prise en charge pour ce backend.")
|
|
|
|
def can_install_prerequisites(self) -> bool:
|
|
"""True si ce backend sait installer automatiquement les outils manquants."""
|
|
return False
|
|
|
|
def install_prerequisites(self, on_output: Optional[OutputCallback] = None) -> JoinResult:
|
|
"""Installe les outils manquants. À surcharger si can_install_prerequisites() est vrai."""
|
|
return JoinResult(success=False, message="Installation automatique non prise en charge pour ce backend.")
|