Le gestionnaire de connexions multi-protocoles le plus complet pour GNOME / GTK3.
Fork de kuthulux/gnome-connection-manager maintenu par MathildeDec.
GCM regroupe dans une seule fenêtre à onglets tous vos accès distants :
terminal SSH, bureau RDP embarqué, console série RS-232/485, VNC, SPICE,
telnet, session locale, console BMC IPMI SOL et visualiseur web BMC. Plus
besoin de jongler entre dix outils différents. Chaque protocole est un
plugin (plugins/plugin_*.py), chargé automatiquement au démarrage —
ajouter un protocole n'implique pas de modifier le cœur de l'application.
| Protocole | Implémentation | Description |
|---|---|---|
| SSH | VTE intégré | Terminal complet avec agent, tunnels, cluster mode |
| RDP | XEmbed + xfreerdp | Bureau Windows directement dans l'onglet GCM (XEmbed X11) ou fenêtre externe (Wayland) |
| VNC | vncviewer / vinagre / remmina (ou widget natif GtkVnc.Display si dispo) |
Connexion VNC avec authentification |
| SPICE | remote-viewer / virt-viewer (ou widget natif SpiceClientGtk.Display si dispo) |
Console VM SPICE haute performance (mode URI, tunnel libvirt, ticket Proxmox) |
| Série | picocom / minicom / screen | Port série RS-232/RS-485 avec 11 templates constructeurs |
| Telnet | telnet / expect | Sessions Telnet classiques |
| Local | shell | Terminal local |
| IPMI SOL | ipmitool | Console BMC Serial-over-LAN (iLO/iDRAC/IMM…) |
| Web | vue HTML5 intégrée | Visualiseur console BMC (iLO/iDRAC/IMM) ou n'importe quelle URL |
- Ouvrez un onglet SSH, un onglet RDP et une console série côte à côte
- Chaque connexion conserve ses propres paramètres (police, couleurs, tunnel…)
- Sauvegarde chiffrée des mots de passe (AES)
- La session Windows s'affiche dans l'onglet GCM (pas une fenêtre séparée)
- Bascule automatique sur fenêtre externe si Wayland pur est détecté
- Support
xfreerdp2etxfreerdp3,/cert:ignore,/dynamic-resolution - Domaine
CORP\usergéré automatiquement (/d:+/u:)
-
Terminal VTE embarqué (pas de fenêtre externe)
-
Contrôles dédiés : débit, bits de données, parité, bits de stop, contrôle de flux
-
11 templates constructeurs pré-configurés :
Template Débit Format Cisco IOS / IOS-XE / NX-OS 9600 8N1 HP Comware (H3C) 9600 8N1 Aruba AOS-S / AOS-CX 9600 8N1 Juniper JunOS 9600 8N1 Fortinet FortiOS 9600 8N1 Palo Alto PAN-OS 9600 8N1 F5 TMOS 19200 8N1 Linux / Raspberry Pi 115200 8N1 Arduino / ESP32 115200 8N1 RS-485 Modbus RTU 9600 8N1 Libre (manuel) configurable configurable
- Phase 1 — Scan : saisie des URIs libvirt, user SSH, cases à cocher SSH/SPICE/RDP/VNC, log en temps réel, barre de progression
- Phase 2 — Prévisualisation : tableau des connexions découvertes (scroll, > 250 lignes) avant import — colonnes : Proto | Nom VM | Groupe | IP/Hôte | État | Importé — lignes déjà importées grisées / cases décochées, nouvelles cochées par défaut — case «Écraser existants», boutons Tout cocher / Tout décocher
- SSH : jamais direct — ProxyJump (
-J user@hv:port) si IP connue, sinon shell HV +-t ssh user@vm - SPICE :
virt-viewer --connect qemu+ssh://user@hv/system vm(tunnel SSH natif, pas d'URIspice://) - RDP : uniquement si port 3389 confirmé ouvert (sondé depuis l'HV via
nc/nmap) - VNC : uniquement si port 5900 confirmé ouvert
- Menu Fichier → Importer depuis Proxmox… — idem libvirt mais inventaire via
qm list/qm config - SPICE : détecte
vga: qxl→ génère un ticket SPICE Proxmox à la connexion viapvesh+ SSH → fichier.vvtemporaire →remote-viewer - Résolution IP améliorée : pipeline 4 niveaux — QGA →
ipconfig0→ ARP filtré par MAC → nmap ping scan - VNC : sonde le port 5900 depuis l'hyperviseur
- VirtualBox : Menu Fichier → Importer depuis VirtualBox… — saisie manuelle d'une URI
vbox+ssh://user@host[:port]/ - oVirt : Menu Fichier → Importer depuis oVirt… — pilotage de l'Engine oVirt (URL + API REST + utilisateur SSH)
- CSV / JSON : import et export d'hôtes (l'export ne contient jamais les mots de passe)
- Netmiko (
plugin_netmiko_push.py) : envoi de commandes CLI en masse sur un inventaire d'équipements réseau (SSH), profils réutilisables, gabarits#colonne#alimentés depuis l'inventaire CSV - SNMP (
plugin_snmp_push.py) : dépôt de configuration TFTP/FTP puis déclenchement parSNMP SET, exécution parallèle (ThreadPoolExecutor) ; constructeurs supportés : Cisco, H3C et Huawei VRP (HUAWEI-CONFIG-MAN-MIB)
| Script | Description |
|---|---|
| tools/libvirt_inventory.py | Inventaire complet des VMs KVM/QEMU : IP, OS, vCPUs, RAM, ports SPICE/VNC/RDP |
| tools/ssh_deploy.py | Déploiement de clés SSH (RSA-4096 + Ed25519) sur toutes les VMs depuis l’HV |
libvirt_inventory.py — exports multiples :
python3 tools/libvirt_inventory.py \
--detect-ports \
--output-json inventory.json \
--output-csv inventory.csv \
--ansible-ini inventory.ini \
--ansible-yaml inventory.ymlOptions principales : --uris, --no-os, --no-nmap, --ssh-password, --ssh-timeout
ssh_deploy.py :
# Génère clés RSA/Ed25519 sur l’HV + déploiement via ssh-copy-id vers toutes les VMs
python3 tools/ssh_deploy.py --inventory inventory.json --vm-user ubuntuar · bn · cs · da · de · el · en · fa · fi · fr · he · hi · hu · id · it · ja · ko · nb · nl · pl · pt · ro · ru · sv · th · tr · uk · vi · zh
- GCM lit automatiquement le thème GTK du bureau au démarrage (
gsettings org.gnome.desktop.interface gtk-theme) - Fallback :
~/.config/gtk-3.0/settings.ini - Mode sombre activé si
color-scheme = prefer-dark
- ruff (linter + formateur, style Google docstring) + flake8
- pre-commit : hooks automatisés à chaque commit (
pre-commit install) - 780 tests unitaires pytest — 506 dans
tests/test_gcm.py(nécessitent GTK3/VTE réels), 274 répartis sur 19 autres fichiers sans dépendance GTK (chiffrement, Host, HostUtils, Serial, RDP, VNC, SPICE, libvirt, Proxmox, proto-icons, validation port, gestes/menus contextuels GTK4, éditeur inline, auditplugins/ssh/gtk4.py— voirdocs/architecture.md§2.8 ; chiffres réels vérifiés session-45,docs/sessions/session-45.md)
git clone https://github.com/MathildeDec/gnome-connection-manager
cd gnome-connection-manager
./gnome_connection_manager.pyPar défaut, GCM stocke sa configuration dans ~/.gcm/. Pour utiliser un autre
emplacement (poste partagé, tests, profils multiples) :
./gnome_connection_manager.py --config /chemin/vers/dossier
./gnome_connection_manager.py -c /chemin/vers/dossier# Obligatoires
sudo apt install python3 python3-gi gir1.2-vte-2.91 gir1.2-gtk-3.0 expect python3-pycryptodome
# RDP
sudo apt install meson valac ninja-build pkg-config gobject-introspection libgirepository1.0-dev libgtk-3-dev freerdp3-dev libfuse3-dev
libfuse3-dev
git clone https://gitlab.gnome.org/GNOME/gtk-frdp.git
cd gtk-frdp # ou freerdp3-x11
meson setup build --prefix=/usr
ninja -C build
sudo ninja -C build install
# VNC
sudo apt install tigervnc-viewer # ou vinagre, remmina
# SPICE
sudo apt install gir1.2-spiceclientgtk-3.0 # fournit remote-viewer
# Console série
sudo apt install picocom # ou minicom
# Import libvirt (recommandé : paquet système)
sudo apt install python3-paramiko python3-libvirt
# Alternative pip (si python3-paramiko absent de votre distro) :
# pip3 install --user paramikosudo dnf install python3 python3-gobject vte291 expect freerdp \
tigervnc virt-viewer picocom python3-paramiko python3-pycryptodomepip install ruff pre-commit black
pre-commit install # installe les hooks git
pre-commit run --all-files # vérification manuelle- Clic droit sur un groupe → Nouveau hôte
- Remplir : nom, adresse, utilisateur, port (22)
- Protocole :
ssh(défaut) - Double-clic sur le host pour ouvrir l’onglet terminal
- Nouveau hôte → protocole
rdp, port3389 - Renseigner
Utilisateuret optionnellementMot de passe - Le bureau Windows s'ouvre directement dans l'onglet
- Nouveau hôte → protocole
serial - Host = chemin du port (
/dev/ttyUSB0), Port = débit initial (9600) - À l'ouverture : sélectionnez un template pour pré-remplir tous les paramètres
- Menu Fichier → Importer depuis libvirt…
- Les URIs virt-manager sont pré-remplies depuis dconf
- Cocher les protocoles à importer : SSH / SPICE / RDP / VNC
- Cliquer 🔍 Scanner les hyperviseurs — le log s'affiche en temps réel
- Phase 2 : vérifier le tableau, cocher/décocher les VMs, cliquer ⬇ Importer les sélectionnés
- Menu Fichier → Importer depuis Proxmox…
- Saisir l'URI de l'hyperviseur :
qemu+ssh://root@192.168.105.41/system - Cocher les protocoles : SSH / SPICE / RDP / VNC
- Pour SPICE : la VM doit avoir
vga: qxl(GCM le détecte automatiquement) - À la connexion SPICE, GCM génère un ticket via
pvesh— aucune configuration manuelle nécessaire
GCM détecte automatiquement la langue du système. Pour forcer :
LANG=en_US.UTF-8 ./gnome_connection_manager.py
LANG=de_DE.UTF-8 ./gnome_connection_manager.py# Debian/Ubuntu
sudo apt install git ruby ruby-dev build-essential gettext python3-paramiko
sudo gem install fpm
# Fedora/RHEL
sudo dnf install git ruby ruby-devel make gettext python3-paramiko
sudo gem install fpm| Commande | Description |
|---|---|
make |
Génère .deb + .rpm Fedora |
make deb |
.deb Debian / Ubuntu |
make rpm |
.rpm Fedora / RHEL / CentOS |
make opensuse |
.rpm openSUSE / SLES (dépendances zypper : typelib-1_0-Vte-2.91) |
make translate |
Compile les .po de lang/LINGUAS → .mo |
make i18n-update |
Extrait les chaînes (lang/messages.pot) et met à jour les .po |
make i18n-check |
Échoue si le .pot ou un .po est périmé (CI) |
make validate |
Valide .po (msgfmt) + .glade / .xml / .json |
make test |
Lance la suite pytest (777 tests) |
make lint |
ruff + flake8 |
make check |
validate + lint + test + vérification git propre |
make clean |
Supprime paquets et __pycache__ |
make help |
Affiche l'aide |
git clone https://github.com/MathildeDec/gnome-connection-manager
cd gnome-connection-manager
make # deb + rpm Fedora
make deb # deb seulement
make opensuse # rpm openSUSE
make validate # valider .po + .glade avant commitDépendances Python gérées par uv (pyproject.toml
uv.lock, projet non empaqueté —[tool.uv] package = false). Installation automatisée, paquets système GTK/VTE inclus :
./bootstrap-dev.sh # installe tout, support RDP+SNMP inclus
uv run python3 gnome_connection_manager.pyVoir bootstrap-dev.sh --help pour les options (--without-rdp,
--without-snmp, --no-apt).
pip install ruff pre-commit
pre-commit install # installe les hooks git
pre-commit run --all-files # vérification manuelleHooks pre-commit actifs :
| Hook | Fichiers ciblés | Action |
|---|---|---|
trailing-whitespace |
tous | supprime espaces en fin de ligne |
end-of-file-fixer |
tous | assure un \n final |
check-yaml / check-toml / check-json |
.yaml / .toml / .json |
syntaxe |
ruff |
.py |
lint + autofix |
ruff-format |
.py |
formatage |
flake8 |
.py |
lint complémentaire |
validate-po |
.po |
msgfmt --check — bloque si traduction invalide |
validate-xml-glade-json |
.glade / .xml / .json |
parser XML/JSON Python — bloque si syntaxe cassée |
- Résolution IP Proxmox améliorée : pipeline 4 niveaux QGA →
ipconfig0→ ARP filtré par MAC → nmap ping scan (identique libvirt) - Thème GTK bureau : lecture
gsettings gtk-theme+color-scheme(mode sombre) au démarrage - 491 tests unitaires : +44 tests (SPICE Proxmox mock, icônes protocole, résolution IP, détection QXL, sous-groupes import, validation port, VNC)
- Fix
UnboundLocalError: variable_stdinpour unpackingexec_command(conflit avecgettext._) - Fix ARP Proxmox : filtrage par MAC VM (évitait de retourner l'IP d'une autre VM)
- Import libvirt refondu : dialogue 2 phases (scan → tableau de prévisualisation)
- SSH via ProxyJump (
-J), SPICE via tunnel libvirt natif, RDP conditionnel (port 3389) - Tableau scrollable (>250 VMs), cases à cocher, case «Écraser existants»
- Déplacé dans le menu Fichier (plus dans Serveurs)
- SSH via ProxyJump (
SpiceTab: détection--connectpour tunnel libvirt natif (bypass URIspice://)- Outils CLI
tools/:libvirt_inventory.pyv4 +ssh_deploy.py- Exports JSON / CSV / Ansible INI / Ansible YAML
- Détection OS (XML, guest-agent, SSH), vCPUs, RAM, ports SPICE/VNC/RDP
--ssh-password,--ssh-timeout,--detect-ports,--no-nmap
- Qualité :
pyproject.toml+.pre-commit-config.yaml(ruff Google style + flake8) - Corrections GTK3 : audit complet dépréciations v1.3.2 (
override_font→CssProvider,GtkPaned,get_color→get_rgba, etc.)
- SerialTab : console série RS-232/RS-485 embarquée dans VTE — picocom / minicom / screen
- 11 templates constructeurs (Cisco, HP, Aruba, Juniper, Fortinet, Palo Alto, F5, Linux, Arduino, Modbus, Libre)
- Combos dédiés : débit, bits de données, parité, bits de stop, contrôle de flux
- VncTab : connexion VNC native (vncviewer / vinagre / remmina)
- SpiceTab : connexion SPICE (remote-viewer / virt-viewer)
- 16 langues : ajout uk / ja / ar / tr / nl / cs / sv / nb
- 379 tests unitaires (pytest)
- Fix
save_host_to_iniTypeError Python 3 (champs non-str) - Fix
encrypt_old/decrypt_oldPython 3 bytes/str
- RDP XEmbed : bureau Windows directement dans l’onglet (GtkSocket +
xfreerdp /parent-window) - Import libvirt : inventaire VMs KVM/QEMU avec détection Windows
- GCMBase : remplacement de
SimpleGladeAppparGtk.Buildernatif - 8 bugs upstream corrigés (#64 #66 #67 #81 #82 #87 #88 #89)
- 188 docstrings Google (#110)
- Compatibilité Python 3.13 / GTK 3.24+
./gnome_connection_manager.py --debug # ou GCM_DEBUG=1
GCM_LOG_LEVEL=TRACE ./gnome_connection_manager.pyLe journal permanent est ~/.gcm/log/gcm-app.log. Niveaux, variables
d'environnement, données sensibles à relire avant de joindre un journal à
un bug, règles pour les contributeurs : voir
docs/journalisation.md.
Les pull requests sont les bienvenues. Consultez CLAUDE.md pour l'état courant et la prochaine étape, et docs/features-backlog.md pour l'état d'avancement détaillé et les fonctionnalités planifiées. Pour les changements importants, ouvrez d’abord une issue.
Gcm4 s'appuie sur deux bibliothèques asynchrones dédiées, développées en parallèle :
- Dépôt : MathildeDec/AsyncVnc4
- Rôle : Client RFB/VNC pur Python (23 patches, 50 tests), consommé par le plugin
pluginvnc2 - Annonce : Gcm4 #102
- Liaison plugin : Gcm4 #104
- Dépôt : MathildeDec/AsyncRdp4
- Rôle : Binding asyncio sur libfreerdp3 via cffi (122 tests), destiné à remplacer GtkFrdp
- Annonce : Gcm4 #103
- Liaison plugin : Gcm4 #105
La roadmap coordonnée des trois dépôts est dans Gcm4 #106, avec un tableau de bord dans Gcm4 #107.
| Phase | Objectif | Issues clés |
|---|---|---|
| 1 | Stabilisation bibliothèques | AsyncVnc4 #22, #34 · AsyncRdp4 #36 |
| 2 | Intégration plugins Gcm4 | Gcm4 #104, #105, #71 |
| 3 | Tests serveurs réels | AsyncVnc4 #27-#32 · AsyncRdp4 #34, #37 |
| 4 | Migration GTK4 + nettoyage | Gcm4 #97, #96, #98, #99 |
Priorités unifiées (P1-P4) et tracks de travail parallèle (VNC / RDP / Gcm4) communs aux trois dépôts.