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>
104 lines
2.8 KiB
Python
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)
|