Le hook PySide6 de PyInstaller importe QtCore pour localiser les plugins Qt. Depuis Qt 6.10, Qt6Core.dll est lie a l'ICU de Windows (icuuc.dll, System32), que Wine n'implemente pas : l'import echouait, le hook ne collectait aucun plugin, et le binaire produit refusait de demarrer sous Windows avec « could not initialize Qt platform plugin "windows" ». - La build Wine epingle PySide6<6.10 (PYSIDE6_CONSTRAINT pour surcharger). - Verification avant compilation que PySide6 s'importe reellement. - Verification apres compilation que qwindows.dll est embarque. - Reinstallation des dependances declenchee par empreinte de requirements.txt et de la contrainte, au lieu de la seule presence de PyInstaller. Binaire verifie sous Wine : GUI (fenetre a trois onglets) et CLI OK, 45 Mo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
122 lines
4.8 KiB
Markdown
122 lines
4.8 KiB
Markdown
# JoinDomainGUI
|
|
|
|
Outil de **diagnostic réseau Active Directory** et de **jointure de domaine**,
|
|
avec interface graphique (PySide6) et interface en ligne de commande.
|
|
Fonctionne sous **Linux** (`realmd`) et sous **Windows** (PowerShell `Add-Computer`),
|
|
le backend étant choisi automatiquement selon la plateforme.
|
|
|
|
## Fonctionnalités
|
|
|
|
- **Diagnostic réseau AD** : résolution DNS du domaine, enregistrements SRV
|
|
(LDAP / Kerberos), ping des contrôleurs de domaine, test des ports AD
|
|
(53, 88, 389, 445, 464, 636, 3268), synchronisation NTP et présence des
|
|
outils système requis.
|
|
- **Jointure de domaine** avec unité d'organisation et nom de machine
|
|
optionnels, et détection du besoin de redémarrage.
|
|
- **Installation des prérequis Linux** manquants en un clic ou une commande
|
|
(`realmd`, `sssd`, `adcli`, `samba-common-bin`, `packagekit` via `apt-get`).
|
|
- **Interface graphique** à trois onglets : Diagnostic réseau, Rejoindre le
|
|
domaine, À propos.
|
|
- **Interface en ligne de commande** utilisable sans environnement graphique
|
|
(SSH, déploiement scripté) : la CLI n'importe jamais PySide6.
|
|
- **Le mot de passe ne transite jamais par la ligne de commande** : il est
|
|
transmis au sous-processus via stdin ou son environnement, et n'apparaît
|
|
donc pas dans `ps` ni dans l'historique du shell.
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
make install # crée l'environnement virtuel et installe les dépendances
|
|
```
|
|
|
|
Dépendances : Python 3.11+, `PySide6`, `dnspython`, `ntplib`.
|
|
|
|
## Utilisation
|
|
|
|
### Interface graphique
|
|
|
|
```bash
|
|
make run # depuis les sources
|
|
sudo ./dist/JoinDomainGUI # binaire autonome Linux
|
|
```
|
|
|
|
La jointure de domaine nécessite les droits root / administrateur ; le
|
|
diagnostic, non.
|
|
|
|
### Ligne de commande
|
|
|
|
```bash
|
|
# Diagnostic réseau
|
|
python main.py diagnose --domain exemple.lan
|
|
make diagnose DOMAIN=exemple.lan
|
|
|
|
# Jointure de domaine (root / administrateur requis)
|
|
echo 'motdepasse' | sudo python main.py join \
|
|
--domain exemple.lan --username administrateur --password-stdin
|
|
|
|
# Installation des prérequis système (Linux / apt uniquement)
|
|
sudo python main.py install-prereqs
|
|
```
|
|
|
|
Sans mot de passe fourni, il est demandé de façon interactive et masquée.
|
|
`--password` existe mais est déconseillé (visible dans `ps` et l'historique).
|
|
|
|
Code de sortie : `0` si tout va bien, `1` si un test échoue ou si la jointure
|
|
échoue, `2` en cas de droits insuffisants ou de backend indisponible.
|
|
|
|
## Compilation des binaires
|
|
|
|
```bash
|
|
make build-linux # -> dist/JoinDomainGUI (ELF autonome)
|
|
make build-windows # -> dist/windows/JoinDomainGUI.exe (PE64 autonome)
|
|
make build # les deux
|
|
```
|
|
|
|
PyInstaller ne fait pas de cross-compilation. Le binaire Windows est donc
|
|
produit depuis Linux en exécutant un vrai PyInstaller Windows dans un
|
|
préfixe **Wine** dédié (`packaging/build_windows_wine.sh`) : le `.exe` obtenu
|
|
est un binaire Windows natif. Le premier appel télécharge un Python Windows
|
|
embarqué et les dépendances (plusieurs minutes) ; les suivants sont
|
|
incrémentaux.
|
|
|
|
Sur une machine Windows, `packaging/build_windows.bat` fait le même travail
|
|
nativement.
|
|
|
|
La build Wine épingle **Qt 6.9** (`PySide6<6.10`) : à partir de Qt 6.10,
|
|
`Qt6Core.dll` dépend de l'ICU fourni par Windows (`icuuc.dll` dans `System32`),
|
|
que Wine n'implémente pas. PySide6 y devient inimportable — et le hook PySide6
|
|
de PyInstaller, qui importe QtCore pour localiser les plugins Qt, échoue alors
|
|
*silencieusement* et produit un `.exe` sans plugin de plateforme, qui refuse de
|
|
démarrer sous Windows (« could not initialize Qt platform plugin windows »). Le
|
|
script vérifie donc, avant compilation, que PySide6 s'importe, et après
|
|
compilation, que `qwindows.dll` est bien embarqué.
|
|
|
|
## Publication
|
|
|
|
```bash
|
|
make publish # pousse la branche courante et les tags vers tous les dépôts
|
|
```
|
|
|
|
Le projet est publié sur deux instances Gitea :
|
|
[git.tuxtech.fr](https://git.tuxtech.fr/tuxgyver/JoinDomainGUI) (`origin`) et
|
|
[git.h3campus.fr](https://git.h3campus.fr/Johnny/JoinDomainGUI) (`h3campus`).
|
|
|
|
## Structure
|
|
|
|
```
|
|
main.py Point d'entrée : GUI sans argument, CLI sinon
|
|
domainjoin/
|
|
├── cli.py Interface en ligne de commande
|
|
├── gui.py Interface PySide6
|
|
├── diagnostics.py Moteur de diagnostic réseau
|
|
├── worker.py Exécution en arrière-plan pour la GUI
|
|
├── privileges.py Détection des droits root/administrateur
|
|
└── backend/
|
|
├── base.py Interface commune de jointure
|
|
├── linux_realmd.py Backend Linux (realmd / adcli)
|
|
└── windows_addcomputer.py Backend Windows (Add-Computer)
|
|
packaging/ Scripts de compilation PyInstaller
|
|
```
|
|
|
|
Voir [CHANGELOG.md](CHANGELOG.md) pour l'historique des versions.
|