Files
tuxgyverandClaude Opus 5 eba4d0b843 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>
2026-09-09 07:11:20 +02:00

104 lines
2.8 KiB
Python

"""Workers Qt exécutant diagnostics et jointure de domaine en arrière-plan,
pour ne jamais bloquer l'interface graphique."""
from __future__ import annotations
from typing import Optional
from PySide6.QtCore import QThread, Signal
from . import diagnostics
from .backend.base import DomainJoinBackend, JoinResult
class DiagnosticsWorker(QThread):
check_ready = Signal(object) # diagnostics.CheckResult
finished_all = Signal()
def __init__(self, domain: str, parent=None):
super().__init__(parent)
self.domain = domain
def run(self) -> None:
for result in diagnostics.run_diagnostics(self.domain):
self.check_ready.emit(result)
self.finished_all.emit()
class JoinWorker(QThread):
output_line = Signal(str)
finished_join = Signal(object) # backend.base.JoinResult
def __init__(
self,
backend: DomainJoinBackend,
domain: str,
username: str,
password: str,
ou: Optional[str],
computer_name: Optional[str],
parent=None,
):
super().__init__(parent)
self.backend = backend
self.domain = domain
self.username = username
self.password = password
self.ou = ou
self.computer_name = computer_name
def run(self) -> None:
result: JoinResult = self.backend.join(
self.domain,
self.username,
self.password,
ou=self.ou,
computer_name=self.computer_name,
on_output=self.output_line.emit,
)
self.finished_join.emit(result)
class InstallPrerequisitesWorker(QThread):
output_line = Signal(str)
finished_install = Signal(object) # backend.base.JoinResult
def __init__(self, backend: DomainJoinBackend, parent=None):
super().__init__(parent)
self.backend = backend
def run(self) -> None:
result: JoinResult = self.backend.install_prerequisites(on_output=self.output_line.emit)
self.finished_install.emit(result)
class LeaveWorker(QThread):
output_line = Signal(str)
finished_leave = Signal(object) # backend.base.JoinResult
def __init__(
self,
backend: DomainJoinBackend,
domain: str,
username: str,
password: str,
remove_packages: bool,
parent=None,
):
super().__init__(parent)
self.backend = backend
self.domain = domain
self.username = username
self.password = password
self.remove_packages = remove_packages
def run(self) -> None:
result: JoinResult = self.backend.leave(
self.domain,
self.username,
self.password,
remove_packages=self.remove_packages,
on_output=self.output_line.emit,
)
self.finished_leave.emit(result)