# 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. > Le `.exe` s'appuie sur l'ICU fourni par le système (`icuuc.dll` dans > `System32`), présent depuis Windows 10 1703 et Windows Server 2019. Il ne > peut pas être testé sous Wine, qui ne fournit pas cette bibliothèque. ## 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.