feat: sortie de domaine, et corrections issues d'un echec reel de jointure
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>
This commit is contained in:
@@ -166,6 +166,41 @@ def _cmd_join(args: argparse.Namespace) -> int:
|
||||
return 0 if result.success else 1
|
||||
|
||||
|
||||
def _cmd_leave(args: argparse.Namespace) -> int:
|
||||
if (code := _require_elevation()) is not None:
|
||||
return code
|
||||
|
||||
backend = get_backend()
|
||||
available, reason = backend.is_available()
|
||||
if not available:
|
||||
_print_error(reason)
|
||||
return 2
|
||||
if not backend.can_leave():
|
||||
_print_error("Ce backend ne prend pas en charge la sortie de domaine.")
|
||||
return 2
|
||||
|
||||
password = _resolve_password(args) if args.username else ""
|
||||
|
||||
warning = f"Faire quitter le domaine « {args.domain} » à ce poste ?"
|
||||
if args.remove_packages:
|
||||
warning += " Les paquets système liés au domaine seront également désinstallés."
|
||||
if not _confirm(warning, args.yes):
|
||||
print(_colorize("Annulé.", _Color.YELLOW, sys.stdout))
|
||||
return 1
|
||||
|
||||
result = backend.leave(
|
||||
args.domain,
|
||||
args.username or "",
|
||||
password,
|
||||
remove_packages=args.remove_packages,
|
||||
on_output=print,
|
||||
)
|
||||
_print_result(result)
|
||||
if result.success and result.needs_reboot:
|
||||
print(_colorize("Un redémarrage est nécessaire pour finaliser la sortie.", _Color.YELLOW, sys.stdout))
|
||||
return 0 if result.success else 1
|
||||
|
||||
|
||||
def _cmd_install_prereqs(args: argparse.Namespace) -> int:
|
||||
if (code := _require_elevation()) is not None:
|
||||
return code
|
||||
@@ -207,6 +242,24 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
p_join.add_argument("-y", "--yes", action="store_true", help="Ne pas demander de confirmation.")
|
||||
p_join.set_defaults(func=_cmd_join)
|
||||
|
||||
p_leave = sub.add_parser("leave", help="Quitte le domaine (nécessite les droits root/administrateur).")
|
||||
p_leave.add_argument("--domain", default=DEFAULT_DOMAIN, help=f"Domaine à quitter (défaut : {DEFAULT_DOMAIN}).")
|
||||
p_leave.add_argument(
|
||||
"--username",
|
||||
default=None,
|
||||
help="Compte autorisé à retirer la machine de l'annuaire. Optionnel sous Linux "
|
||||
"(realm leave sait utiliser le compte machine local), requis sous Windows.",
|
||||
)
|
||||
p_leave.add_argument("--password", help="Mot de passe (déconseillé). Préférez --password-stdin.")
|
||||
p_leave.add_argument("--password-stdin", action="store_true", help="Lit le mot de passe depuis l'entrée standard.")
|
||||
p_leave.add_argument(
|
||||
"--remove-packages",
|
||||
action="store_true",
|
||||
help="Désinstalle aussi les paquets système devenus inutiles (Linux/apt uniquement).",
|
||||
)
|
||||
p_leave.add_argument("-y", "--yes", action="store_true", help="Ne pas demander de confirmation.")
|
||||
p_leave.set_defaults(func=_cmd_leave)
|
||||
|
||||
p_install = sub.add_parser(
|
||||
"install-prereqs", help="Installe les outils système requis pour la jointure (Linux/apt uniquement)."
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user