
Unified network toolkit for Linux — Python 3 + PySide6
Un toolkit di rete unificato per Linux e macOS: ispeziona, connettiti, diagnostica.
NMLinux è un'unica GUI unificata che riunisce 29 moduli di rete in una finestra: monitoraggio interfacce, Wi-Fi, DNS, terminale SSH, visualizzatore firewall, mappa topologica, traceroute e altro. Sviluppato da zero in Python e PySide6 (Qt 6), con 8 lingue dell'interfaccia e nessuna dipendenza esterna oltre agli strumenti di sistema standard.
[!NOTE] NMLinux non è correlato al daemon di sistema Linux
/usr/bin/NetworkManager(NetworkManager di Red Hat/GNOME). NMLinux è un progetto autonomo sviluppato da zero in Python e PySide6.
Sviluppato con Claude Code (Anthropic) e il contributo del suo autore.
NMLinux è sviluppato con l'assistenza dell'IA — nello specifico Claude Code — e questo non è nascosto da nessuna parte in questo repository. Quasi ogni progetto software serio oggi usa l'IA da qualche parte nel proprio processo, che lo dichiari o meno. Quindi "se l'IA fosse coinvolta" non è la domanda interessante. La domanda interessante è: c'è qualcosa che intercetta gli errori dell'IA?
Ecco cosa lo fa, se preferisci verificare piuttosto che prendere la mia parola:
pytest tests/ -v. Pura logica più una manciata di veri test dei widget Qt (menu, tabelle), senza simulare le parti interessanti.docs/Decisions-Techniques.md — ogni scelta tecnica non ovvia, le alternative scartate e i bug (inclusi quelli introdotti dall'IA) trovati e corretti, con il ragionamento documentato.docs/Architecture.md e docs/Carte-des-Modules.md — la struttura reale del codice, mantenuta sincronizzata con ciò che viene distribuito.Nessuna di queste cose esiste perché l'IA non è affidabile. Esistono perché nulla dovrebbe essere distribuito senza un processo che lo verifichi — codice scritto a mano incluso. Giudica il risultato e come viene verificato, non lo strumento che ha aiutato a scriverlo.
Hai trovato comunque un bug? È utile, non imbarazzante — apri una segnalazione.
Le discussioni su GitHub sono aperte — condividi feedback, segnala idee, fai domande o semplicemente saluta. L'autore ha oltre 30 anni di esperienza in infrastrutture e operazioni e ha creato questo strumento perché anche per Linux dovrebbe esistere software buono, gratuito e semplice.
Screenshot Linux dalla v1.2.7 — screenshot macOS dalla v1.3.5. L'app ora ha 29 moduli e 8 lingue dell'interfaccia (FR/EN/ES/DE/IT/PT/JA/ZH).
Linux (KDE)
| Dashboard | Topology |
|---|---|
![]() | ![]() |
| Traceroute | Wi-Fi |
|---|---|
![]() | ![]() |
macOS
| Dashboard | Traceroute |
|---|---|
![]() | ![]() |
traceroute veniva sempre risolto su PATH tramite lo shim dell'host anche quando sull'host non era installato un vero binario traceroute, quindi il worker non ripiegava mai su tracepath e la traccia terminava all'istante senza hop e senza errori mostrati. Ora ripiega su tracepath ogni volta che traceroute non produce alcun output analizzabile, indipendentemente dal motivo del fallimento.DISPLAY/WAYLAND_DISPLAY sono impostati (qualsiasi sessione GUI) e ssh non ha una tty pulita, può provare a usare $SSH_ASKPASS per la richiesta della password invece del terminale integrato — facendo fallire silenziosamente l'autenticazione se non è installato un helper askpass. SSH_ASKPASS_REQUIRE=never ora impone che le richieste di password passino sempre dal terminale stesso.packaging/flatpak/ è destinato a KDE Linux e ad altre distribuzioni solo-Flatpak. Gli strumenti CLI dell'host a cui nmlinux delega l'esecuzione (nmcli, pkexec, mount.cifs, ssh, nmap, …) vengono collegati tramite shim flatpak-spawn --host su PATH invece di mettere in sandbox ciascuno singolarmente; PySide6 proviene dal io.qt.PySide.BaseApp di Flathub piuttosto che dalla wheel PyPI. Non pubblicato su Flathub — un singolo bundle .flatpak viene creato con packaging/flatpak/build-bundle.sh e allegato a ogni release, esattamente come già avviene per l'AppImage. Interrotto nella v1.7.12 — vedi sopra.Ctrl+Shift+C o con il menu del tasto destro; incolla con Ctrl+Shift+V (già esistente). Prima la copia era impossibile — non esisteva alcuna selezione del testoiperf3 solo-client verso una lista pubblica di server inclusa (26 paesi) o un server personalizzato salvato (es. un server interno dell'organizzazione). Supporta TCP/UDP, IPv4/IPv6/auto e direzione inversa (download), con jitter/perdita mostrati per i test UDP. Suggerito da issue #6iperf3 — installalo per abilitare la scheda LAN; la scheda mostra un banner e rimane disabilitata altrimenti~/mnt/<host>_<share>), utilizzabile dal terminale e da qualsiasi altra app — non una vista di navigazione temporanea. Solo per la sessione (nessuna persistenza fstab/systemd), credenziali riutilizzate dai campi utente/password esistenti. Su Linux usa pkexec mount -t cifs con un file di credenziali a permessi ristretti (mai esposto via ps); su macOS usa mount_smbfs direttamente. Riprova automaticamente con un dialetto SMB più vecchio (vers=2.0) quando un server rifiuta la negoziazione predefinita (comune con i NAS più datati) — entrambi i tentativi avvengono sotto un'unica richiesta di autenticazione tramite un processo helper dedicatocifs-utils (Linux) per il montaggio SMB; integrata in macOSbootstrap_macos.sh non forza più NONINTERACTIVE=1 sull'installer di Homebrew, che si interrompeva immediatamente su qualsiasi account amministratore nuovo invece di chiedere la password sudo; il comando one-liner documentato ora scarica prima lo script invece di passarlo direttamente a bash, poiché i passaggi interattivi annidati (installer Xcode CLT, il prompt sudo di Homebrew stesso) potevano interferire con il flusso di input dello script esterno quando veniva passato tramite pipeSmbNfsPage era l'unica pagina di destinazione mancante dal sistema inter-modulo del tasto destro introdotto nella v1.7.0; facendo clic con il tasto destro su un host e scegliendo SMB ora il campo host viene precompilato e la scansione parte immediatamente, in grassetto nel menu quando la porta 445 viene rilevata apertasystem_profiler (che restituisce <redacted> senza i Servizi di localizzazione) a CoreWLAN come fonte dati primaria; l'app ora richiede il permesso dei Servizi di localizzazione al primo avvio; la pagina Wi-Fi mostra tutte le reti con i nomi reali una volta concessosystem_profiler per la modalità di sicurezzaset_target + query automatica), DNS (set_target solo precompilazione), Ping (set_target + avvio automatico), Traceroute (set_target + avvio automatico), MTR (set_target + avvio automatico), Port Scanner (set_target + focus), SSH / RDP / VNC (set_target apre il modulo di nuova connessione precompilato), Topology (load_hosts inietta i nodi dalla scansione IP Scanner/Nmap senza riscansionare — gateway rilevato automaticamente, archi disegnati, nodo di origine evidenziato in rosso), Asset Inventory (prefill_hosts avvia la scansione delle credenziali direttamente sugli host rilevati, salta la fase di scoperta ICMP)exec() in Python, NSBundle.mainBundle() risolve nel bundle Python.framework (CFBundleName = "Python") che Qt legge durante la costruzione di QApplication; corretto applicando una patch a infoDictionary() del bundle e rinominando le voci di menu native tramite AppKit prima che venga creato il menu dell'applicazioneNSProcessInfo.setProcessName_ tramite pyobjc-framework-Cocoa (sostituito dalla v1.6.4)install_macos_app.sh in modo che macOS associ correttamente il bundle .app al processo in esecuzione; aggiunti l'override di setprogname e sys.argv[0] come fallback|; catena di fallback completa senza diritti di amministratore: OS tramite ver, CPU tramite registro, RAM tramite systeminfo, disco tramite wmic → fsutil (consapevole delle impostazioni locali: virgola EN / spazio FR) → dir /-C/System/Volumes/Data), fallback CPU Apple Silicon (hw.model), Synology (/volume1), Unraid (/mnt/user)sshpass, nmap e snmpget installati tramite Homebrew ora vengono trovati e chiamati usando il loro percorso assoluto; i bundle .app su macOS non ereditano il PATH di Homebrew (/opt/homebrew/bin, /usr/local/bin), quindi gli strumenti precedentemente installati venivano ignorati in silenziogit pull && bash packaging/install_macos_app.sh dalla radice del repository è ora il metodo di aggiornamento documentato; lo script gestisce il proprio venv (~/.local/share/nmlinux/venv) e non richiede pip o pipx a livello di sistemafree -h sostituito con free compatibile BusyBox; il percorso codice macOS ora usa sw_vers per il nome dell'OS, fallback hw.model per la CPU Apple Silicon, /System/Volumes/Data per il volume dati utente APFS; i volumi Synology/Unraid (/volume1, /mnt/user) rilevati prima della root; il pattern di falso successo df | tail -1 || … corretto con guardie test -d; output di lsb_release ripulito dalle virgolette circostanti; supportati più set di credenziali SSH/WinRM (li prova tutti in ordine per host)tftpyssl.SSLError; le voci ora mostrano "… (verifica in corso)" mentre il controllo in background è in esecuzione e "— (non raggiungibile)" quando l'host non può essere raggiunto+ Watch (usa host/porta correnti) o manualmente nel pannello; il controllo in background viene eseguito automaticamente 2 secondi dopo l'avvio; la voce laterale "TLS Inspector" mostra un punto colorato: rosso se un certificato è scaduto, arancione se un certificato scade entro 30 giorni; pulsante di ricontrollo nel pannello; l'elenco mostra lo stato per voce (✓ / ⚠ / SCADUTO) con codifica a colori_arp_entry() ora chiama arp -n <ip> su macOS e analizza il suo formato di output (? (IP) at AA:BB:CC on en0) invece di leggere /proc/net/arp (solo Linux); tutte e quattro le colonne dello scanner ora si popolano correttamente su macOSgetent (solo Linux) con socket.gethostbyaddr() di Python per una risoluzione DNS inversa multipiattaforma; la risoluzione dei nomi host ora funziona nativamente su macOS senza strumenti aggiuntivismbclient (richiede Homebrew samba) a smbutil view (strumento integrato in macOS); l'elenco delle condivisioni SMB ora funziona su macOS senza installazionishowmount è integrato in macOS ma non supporta --no-headers; il flag è stato rimosso su macOS e la riga di intestazione viene saltata nel parser; l'elenco delle esportazioni NFS ora funziona nativamentexfreerdp non viene trovato, ripiega sullo schema URL open rdp://; apre Microsoft Remote Desktop (App Store) se installato, con host, porta, nome utente e dominio precompilativncviewer non viene trovato, ripiega sullo schema URL open vnc://; apre la Condivisione schermo di macOS (integrata, nessuna installazione richiesta)-A al comando ssh; consente di saltare tra server senza copiare la propria chiave privata (PC → A → B); richiede un agente SSH attivo (SSH_AUTH_SOCK); guida contestuale aggiornata in tutte le 8 linguepip install reportlab)printer, server, smartphone, cpu, laptop)avahi-browse (opzionale, eseguito in parallelo alla scansione nmap); identifica stampanti (_ipp._tcp, PDL Printer), smartphone e TV Android (_googlecast._tcp, _androidtvremote2._tcp), Mac Apple (am=Mac16,x model nel TXT AirPlay), dispositivi NAS (Synology riporta model=Xserve), desktop KDE Connect; in assenza di avahi ripiega su OUI del vendor MAC ed euristiche sul nome host_IS_MACOS) e si dirama verso i comandi macOS nativi: route -n get default, ifconfig, scutil --dns, networksetup, system_profiler SPAirPortDataType, pfctl, netstat -ib; l'elevazione dei privilegi usa osascript + with administrator privileges invece di pkexec; il font monospace usa Menlo invece di Monospace? (descrizione, esempi d'uso e comandi CLI equivalenti) ora copre tutte le 8 lingue per ogni modulo; in precedenza JA e ZH ripiegavano sull'inglesenav_hint_smb_nfs e nav_hint_hosts a tutti i 7 blocchi linguistici non francesi~/.ssh/ (file, tipo, bit, commento, impronta SHA256); genera chiavi Ed25519 o RSA 4096 con passphrase opzionale (rilevamento di mancata corrispondenza, nome file automatico in base al tipo); copia la chiave pubblica negli appunti; distribuisce su un server remoto tramite ssh-copy-id in un terminale integrato con supporto stdin per i prompt di password; elimina le coppie di chiavi con conferma; crea automaticamente ~/.ssh/ se mancante; i18n: fr / en / es / deopenssl s_client); funziona per certificati validi, scaduti e autofirmati; messaggi di errore chiari per host non raggiungibilismbclient -L con credenziali opzionali, mostra nome condivisione / tipo / commento; scheda NFS: showmount -e, mostra percorso di esportazione ed elenco accessi; rileva gli strumenti mancanti con istruzioni di installazione specifiche per distribuzione/etc/hosts; tabella con interruttore attiva/disattiva, aggiungi/modifica/elimina voci tramite finestra di dialogo; filtro per IP o nome host; salvataggio tramite pkexec cp (finestra di autenticazione polkit)~/.local/share/nmlinux/venv, installa le dipendenze di sistema tramite apt, crea il launcher e la voce .desktop (risolve l'errore PEP 668 externally-managed-environment)vncviewer (TigerVNC); compatibile con macOS ARD (l'autenticazione DH30 è gestita nativamente da vncviewer); la password non viene mai salvata; rileva vncviewer mancante con istruzioni di installazione specifiche per distribuzionexfreerdp come processo esterno; la password viene richiesta al momento della connessione e non viene mai salvata; campi: host, porta, nome utente, dominio, risoluzione, schermo intero; rileva xfreerdp mancante con istruzioni di installazione specifiche per distribuzione (Arch / Debian / Fedora)assets/icons/; renderizzate a runtime tramite QSvgRenderer; colorate #60a5fa; l'app non richiede più alcun tema di icone di sistema (Breeze, Adwaita, Papirus…)main.py ora rileva automaticamente il tema icone GTK tramite gsettings e lo applica a Qt; estese le catene di fallback per Wi-Fi, Traceroute, Speed Test, Interfacce, Port Scanner, Firewall, MTR; themed_icon() ora verifica che esista una pixmap reale prima di accettare un'icona del temaqt6.qtsvg a QT_PLUGIN_PATH così Qt può renderizzare le icone SVG; themed_icon() prova le dimensioni 22/24/16/32/48 (Breeze usa 22 px, non 24); il tema viene forzato a breeze quando viene rilevato il set di icone incluso nel bundle Nix; controlla anche /etc/xdg/kdeglobals per la configurazione KDE a livello di sistemamtr --report, analizza l'output testuale, mostra una tabella live con Perdita %, RTT Ultimo/Media/Migliore/Peggiore/Jitter per ogni salto, colorata in base alla gravità della perdita; modalità continua; esportazione CSV + TXTcurl + Cloudflare (speed.cloudflare.com): download (25 MB), upload (10 MB), ping verso 1.1.1.1; fino a 5 esecuzioni salvate in JSON; grafico a linee storico (Download/Upload)/etc/nftables.conf e /etc/iptables/*.rules senza root; ruleset live tramite pkexec nft list ruleset; colonne: Tabella / Catena / Regola / Porta / Azione / Commento; azioni codificate a colori; filtro live? discreto; al passaggio del mouse viene visualizzato un tooltip che descrive cosa fa il modulo; aggiunto un separatore verticale tra barra laterale e area contenutocore/theme.py con is_dark(), color_ok(), color_err(); i widget painter personalizzati (_Graph, _MapWidget) leggono la palette al momento del painting; tutti i colori hardcoded Catppuccin Mocha sostituiti con ruoli semantici della palette Qt255.255.255.0) derivata dal prefisso CIDRtraceroute / fallback tracepath)getent/avahi/nmblookup; indirizzo MAC, vendor (IEEE OUI 39K voci), colonna interfaccia; esportazione CSV/TXT aggiornataRilascio iniziale pubblico — 13 moduli: Dashboard, Interfacce, Wi-Fi, Calcolatore di sottorete, DNS Lookup, Ping Monitor, IP Scanner, Port Scanner, Nmap, Whois, SNMP, SNTP/NTP, SSH.
Linux — la maggior parte sono già presenti in un'installazione standard:```bash
sudo pacman -S iproute2 networkmanager bind-tools nmap whois net-snmp iputils mtr curl
sudo apt install iproute2 network-manager dnsutils nmap whois snmp mtr-tiny curl
sudo dnf install iproute NetworkManager bind-utils nmap whois net-snmp-utils mtr curl
**macOS** — installa tramite [Homebrew](https://brew.sh):```bash
# Required
brew install nmap mtr curl
# Optional — enable additional modules
brew install whois # WHOIS page
brew install net-snmp # SNMP page (snmpwalk / snmpget)
brew install samba # SMB scan with credentials (smbclient)
macOS include nativamente
ping,dig,traceroute,netstat,ifconfig,smbutileroute.networksetupescutilsono strumenti integrati di macOS, non serve installarli. La ricerca del vendor OUI in IP Scanner non richiede installazione — il databasemanufdi Wireshark viene scaricato automaticamente in background al primo utilizzo e memorizzato in cache localmente.
pip install pyte o sudo pacman -S python-pyte)pip install tftpy o sudo pacman -S python-tftpy) — modulo File Transferyay -S nmlinux
Tutte le dipendenze (PySide6, ptyprocess, pyte, nmcli, …) vengono gestite automaticamente.
### Opzione 2 — NixOS / Nix
Esegui direttamente con il `flake.nix` incluso — non è necessaria alcuna installazione a livello di sistema:```bash
git clone https://github.com/thongor77/nmlinux.git
cd nmlinux
nix run .
Oppure entra in una shell di sviluppo:```bash nix develop python3 -m nmlinux.main
Tutte le dipendenze Python (PySide6, ptyprocess, pyte, tftpy) e gli strumenti di sistema (nmcli, nmap, freerdp, vncviewer, mtr, avahi-browse…) sono forniti automaticamente tramite il wrapper Nix.
### Opzione 4 — AppImage (qualsiasi distribuzione Linux, nessuna installazione)
Scarica `NMLinux-x.y.z-x86_64.AppImage` dall'[ultima release](https://github.com/thongor77/nmlinux/releases/latest):```bash
chmod +x NMLinux-*.AppImage
./NMLinux-*.AppImage
Nessuna installazione richiesta — Python, Qt e tutti i moduli NMLinux sono inclusi in un singolo file.
Funziona su qualsiasi Linux x86_64 con glibc 2.17+ (Ubuntu 16.04+, Fedora 26+, Arch, Mint, ecc.).
Gli strumenti di rete di sistema (
nmap,whois,mtr…) non sono inclusi — installali tramite il tuo gestore di pacchetti affinché i moduli corrispondenti funzionino. Vedi Requisiti di seguito.
Il modo più rapido — bootstrap in una sola riga. Funziona su un Mac completamente vergine: installa Xcode Command Line Tools, Homebrew, tutti gli strumenti di sistema e poi NMLinux stesso. Sicuro da rieseguire (aggiorna invece di reinstallare):```bash curl -fsSL https://raw.githubusercontent.com/thongor77/nmlinux/main/packaging/bootstrap_macos.sh -o /tmp/bootstrap_macos.sh && bash /tmp/bootstrap_macos.sh
Installa a livello di sistema (`/Applications`) invece di `~/Applications`:```bash
curl -fsSL https://raw.githubusercontent.com/thongor77/nmlinux/main/packaging/bootstrap_macos.sh -o /tmp/bootstrap_macos.sh && bash /tmp/bootstrap_macos.sh --system
Nessun account Apple Developer o notarizzazione a pagamento coinvolti — alla base c'è sempre lo stesso script open-source
install_macos_app.sh, semplicemente scaricato ed eseguito per te. Lo script è bash semplice e leggibile; sentiti libero di aprire/tmp/bootstrap_macos.she leggerlo prima di eseguirlo, oppure consultalo direttamente qui:packaging/bootstrap_macos.sh.Il modello scarica-e-poi-esegui (piuttosto che usare un pipe diretto in
bash) è intenzionale: su un Mac nuovo, lo script attiva passaggi interattivi annidati (installer di Xcode Command Line Tools, installer di Homebrew che chiede la passwordsudo) che leggono dal terminale — fare un pipe diretto dello script inbashpuò far sì che questi prompt annidati interferiscano con il flusso di input dello script stesso e lo blocchino a metà. Eseguire da un file scaricato evita completamente il problema.
Installazione manuale — se preferisci eseguire ogni passaggio da solo, o hai già Homebrew:```bash
brew install nmap mtr curl
git clone https://github.com/thongor77/nmlinux.git cd nmlinux bash packaging/install_macos_app.sh
Per aggiornare: `git pull && bash packaging/install_macos_app.sh`
Per disinstallare: `bash packaging/uninstall_macos.sh`
Per installare a livello di sistema (`/Applications`): `bash packaging/install_macos_app.sh --system`
Lo script installa automaticamente i seguenti pacchetti Python nel venv:
- `PySide6`, `ptyprocess`, `pyte`, `tftpy`
- `pyobjc-framework-Cocoa` — barra dei menu macOS, dialoghi nativi
- `pyobjc-framework-CoreWLAN` — scansione SSID Wi-Fi
- `pyobjc-framework-CoreLocation` — permesso dei Servizi di localizzazione per i nomi Wi-Fi
**Wi-Fi su macOS 26 (Tahoe):** al primo avvio, macOS chiederà il permesso per i Servizi di localizzazione — concedilo per visualizzare i nomi delle reti Wi-Fi. Il permesso si trova in *Impostazioni di Sistema › Privacy e sicurezza › Servizi di localizzazione*.
> La maggior parte dei moduli funziona su macOS senza modifiche. RDP ricade su `open rdp://` (Microsoft Remote Desktop), VNC ricade su `open vnc://` (Condivisione schermo integrata). Connection Manager ha funzionalità ridotte su macOS (`nmcli` non disponibile).
### Opzione 6 — Debian / Ubuntu / Linux Mint (script di installazione)
> **Nota per gli utenti di Linux Mint / Ubuntu:** `pip install` è bloccato a livello di sistema su Python 3.12+ (PEP 668 — `externally-managed-environment`). Usa lo script di installazione fornito — crea automaticamente un ambiente virtuale e installa una voce `.desktop`.```bash
git clone https://github.com/thongor77/nmlinux.git
cd nmlinux
bash install.sh
Lo script:
apt (libgl1, python3-venv, freerdp, tigervnc…)~/.local/share/nmlinux/venv~/.local/bin/nmlinux.desktop in modo che NMLinux appaia nel menu delle applicazioniDopo l'installazione, esegui nmlinux da un terminale o avvialo dal menu delle applicazioni.
Scarica il .whl dall'ultima release e installalo:```bash
pip install nmlinux-1.5.3-py3-none-any.whl
sudo apt install libgl1 libglib2.0-0 libdbus-1-3 freerdp2-x11 tigervnc-viewer
sudo apt install libgl1 libglib2.0-0 libdbus-1-3 freerdp3-x11 tigervnc-viewer
pipx install nmlinux-1.5.3-py3-none-any.whl
> **Nota per Ubuntu 26.04+:** `pipx` richiede l'installazione preliminare delle librerie di sistema (libGL, ecc.) — i comandi sopra le coprono. Se `pipx install` fallisce a causa di un errore di build di PySide6, usa l'**Opzione 4** (script di installazione), che gestisce tutto automaticamente.
### Opzione 8 — Da sorgente (Arch / Fedora / macOS)```bash
git clone https://github.com/thongor77/nmlinux.git
cd nmlinux
pip install PySide6 ptyprocess pyte tftpy
python3 -m nmlinux.main
Copia il file .desktop per far apparire NMLinux nel launcher delle applicazioni:```bash
cp data/nmlinux.desktop ~/.local/share/applications/
update-desktop-database ~/.local/share/applications/
Quindi modifica il percorso `Exec=` nel file se necessario.
---
## Esecuzione```bash
./nmlinux.sh
# or, after pip install:
nmlinux
# or directly:
python3 -m nmlinux.main
nmlinux/ core/ i18n.py — Translation system (8 languages: fr/en/es/de/it/pt/ja/zh), tr(key) function icons.py — themed_icon(): 21 bundled Lucide SVG icons via QSvgRenderer theme.py — is_dark(), color_ok(), color_err(): runtime light/dark helpers settings.py — AppSettings dataclass, JSON persistence ssh.py — SshConnection dataclass, SshStore rdp.py — RdpConnection dataclass, RdpStore, find_xfreerdp() vnc.py — VncConnection dataclass, VncStore, find_vncviewer() terminal.py — SshWorker (QThread) + PTY via ptyprocess, emits raw bytes tls_watchlist.py — TlsWatchlist: background cert expiry checker, JSON persistence http_server.py — ThreadedHTTPServer: directory listing, GET/PUT/POST, port binding tftp_helper.py — TftpServerThread: tftpy wrapper, configurable port and root help_content.py — Module contextual help strings (all 8 languages) cli_bar.py — CliBar singleton: pedagogical CLI equivalent bar export_dialog.py — open_export_dialog(): QFileDialog with live extension update command_palette.py — CommandPalette (Ctrl+P): fuzzy search across 29 modules export_manager.py — collect_snapshot(), to_json/text/markdown/pdf, save_export() pages/ about.py — About page (credits, tools & services) bandwidth.py — Bandwidth Monitor: per-interface 60s graph, live stats connection_manager.py — Connection Manager: nmcli profiles, connect/disconnect/edit dashboard.py — Dashboard dns.py — DNS Lookup file_transfer.py — File Transfer: TFTP + HTTP server, live log, pkexec for port 69 firewall.py — Firewall Viewer: nftables + iptables parser, live via pkexec help_page.py — Contextual help overlay hosts.py — Hosts File: view/edit /etc/hosts, toggle entries, save via pkexec interfaces.py — Network Interfaces ip_scanner.py — IP Scanner mtr.py — MTR: mtr --report parser, live hop stats table, export nmap_scan.py — Nmap ping.py — Ping Monitor port_scanner.py — Port Scanner rdp.py — Remote Desktop: RDP profiles, launches xfreerdp settings.py — Settings page smb_nfs.py — SMB/NFS Browser: smbclient + showmount snmp.py — SNMP sntp.py — SNTP / NTP speedtest.py — Speed Test: curl + Cloudflare, history graph ssh.py — SSH page (connection manager + terminal) ssh_keys.py — SSH Key Manager: list/generate/deploy/delete key pairs subnet.py — Subnet Calculator terminal_view.py — TerminalView: pyte VT100 emulator + QPainter renderer tls.py — TLS Inspector + TLS Watchlist: cert details, background expiry monitor topology.py — Topology Map: nmap -sn, interactive graph, zoom/pan traceroute.py — Visual Traceroute: world map, geolocation, zoom/pan vnc.py — VNC: connection profiles, launches vncviewer whois.py — Whois wifi.py — Wi-Fi wol.py — Wake on LAN: magic packet, persistent host book assets/ icons/ — 21 bundled Lucide SVG icons (#60a5fa) world.geojson — Natural Earth 110m countries (map background) window.py — MainWindow (sidebar + QStackedWidget) main.py — Entry point
---
## Compatibilità con gli ambienti desktop
Dalla v1.2.7, NMLinux utilizza 21 icone SVG [Lucide](https://lucide.dev) incluse nel pacchetto e renderizzate a runtime tramite `QSvgRenderer`. L'app non dipende più da alcun tema di icone di sistema (Breeze, Adwaita, Papirus…) e viene visualizzata correttamente su KDE, GNOME, XFCE e altri. Lo stile Qt si adatta automaticamente all'ambiente desktop in esecuzione.
---
## Limitazioni
### Linux
Supporto completo — tutti i 29 moduli disponibili.
### macOS
La maggior parte dei moduli funziona senza configurazione aggiuntiva poiché si basa su strumenti disponibili su entrambe le piattaforme (`ssh`, `dig`, `ping`, `curl`, `nmap`, `openssl`…).
**9 moduli richiedono un adattamento esplicito per macOS** (doppio percorso di codice che rileva la piattaforma all'avvio): Dashboard, Interfaces, Wi-Fi, Topology, Bandwidth, Firewall, Connection Manager, Hosts File, MTR — questi usano comandi macOS nativi (`ifconfig`, `networksetup`, `scutil`, `pfctl`, `system_profiler`…) invece dei loro equivalenti Linux.
**Moduli con supporto macOS limitato o assente:**
| Module | Status | Notes |
|--------|--------|-------|
| **RDP** | ✓ macOS | Ripiega su `open rdp://` → Microsoft Remote Desktop (App Store) |
| **VNC** | ✓ macOS | Ripiega su `open vnc://` → Condivisione schermo (integrata, nessuna installazione) |
| **IP Scanner** | ✓ macOS | Usa `socket.gethostbyaddr()` — Python nativo, nessuno strumento aggiuntivo |
| **SMB** | ✓ macOS | Usa `smbutil view` (integrato) invece di `smbclient` |
| **NFS** | ✓ macOS | `showmount` integrato; parsing dell'header adattato |
| **Connection Manager** | ⚠ Ridotto | Modifica/eliminazione richiedono `nmcli` (solo Linux); la visualizzazione elenco funziona |
### Generale
- Nessuna integrazione root/polkit — gli strumenti che richiedono privilegi elevati (alcune modalità Nmap, socket raw) devono essere eseguiti con `sudo`; su macOS, l'elevazione dei privilegi usa `osascript` + `administrator privileges`
- Il forwarding dell'agente SSH richiede un agente SSH attivo (`SSH_AUTH_SOCK`); su macOS viene gestito automaticamente dal sistema, nessuna configurazione manuale necessaria
---
## Crediti e ringraziamenti
- **[Anthropic](https://www.anthropic.com)** — Claude Code, l'assistente AI usato per realizzare questo progetto
- L'autore, per la visione, i test e la direzione
---
## Supporta il progetto
Se NMLinux ti è utile, valuta di supportarne lo sviluppo:
- **PayPal** — [Dona tramite PayPal](https://www.paypal.com/donate/?business=JFQGY7NU3ANCN&no_recurring=0&item_name=Every+donation%2C+no+matter+how+small%2C+helps+me+keep+this+project+alive.+Thank+you%21%0A¤cy_code=EUR)
- **Bitcoin** — `bc1qspe0tky7552qas72wgn8w9dswr0dxlv24w39t6ztjqk3nz6kc5tqv753a4`
---
## Licenza
GPL-2.0 — vedi [LICENSE](https://github.com/thongor77/nmlinux/blob/HEAD/LICENSE).
Questo progetto è una reimplementazione indipendente. Nessun codice da NETworkManager è stato usato o tradotto.
flatpak-spawn --hostTIOCSCTTYEPERMscript| Module | Descrizione |
|---|
| Dashboard | Informazioni sulla macchina locale, gateway, IP pubblico, geolocalizzazione, resolver DNS |
| Connection Manager | Profili NetworkManager tramite nmcli: elenco, filtro, connetti/disconnetti/modifica/elimina |
| Interfacce | Tabella delle interfacce di rete con dettaglio per interfaccia (ip + nmcli) |
| Wi-Fi | Reti disponibili, barre del segnale, sicurezza, rete connessa evidenziata |
| Calcolatore di sottorete | Intervallo di rete/broadcast/host da CIDR, tabella host fino a 4096 voci |
| DNS Lookup | Ricerca basata su dig per A, AAAA, MX, TXT, NS, CNAME, PTR, SOA, ANY |
| Ping Monitor | Ping continuo verso più host, statistiche RTT, percentuale di perdita pacchetti |
| IP Scanner | Scansione ping CIDR/intervallo, 50 thread, nome host (DNS/mDNS/NetBIOS), indirizzo MAC, vendor (OUI), interfaccia, esportazione CSV + TXT |
| Port Scanner | Scansione TCP connect, 200 thread, preset di servizi, esportazione CSV + TXT |
| Nmap | 7 modalità di scansione, parsing dell'output XML, tabella Host/Porta/Protocollo/Stato/Servizio, esportazione CSV + TXT |
| Whois | Output whois grezzo in monospace |
| SNMP | snmpwalk/snmpget, v1/v2c, 10 preset OID, tabella dei risultati |
| SNTP / NTP | Client UDP RFC 4330 in puro Python, offset/delay/stratum/reference |
| SSH | Terminale PTY integrato (pyte/VT100), connessioni salvate (JSON), autenticazione con chiave, scrollback |
| Desktop remoto | Profili connessione RDP (gruppi/sottogruppi); avvia xfreerdp; password mai salvata |
| VNC | Profili connessione VNC (gruppi/sottogruppi); avvia vncviewer (TigerVNC); compatibile macOS ARD; password mai salvata |
| SSH Key Manager | Elenca le coppie di chiavi in ~/.ssh/ (tipo, bit, impronta); genera Ed25519/RSA 4096; copia la chiave pubblica; distribuisce al server tramite ssh-copy-id; elimina le coppie con conferma |
| TLS Inspector | Dettagli del certificato: CN, SAN, emittente, validità + conto alla rovescia scadenza, seriale, protocollo, cipher, catena; Watchlist con monitoraggio scadenza in background e pallino colorato nella barra laterale |
| SMB / NFS | Elenca condivisioni SMB (smbclient) ed esportazioni NFS (showmount) da qualsiasi server o NAS; credenziali opzionali per SMB |
| File Hosts | Visualizza/modifica /etc/hosts: aggiungi, elimina, attiva/disattiva voci; filtro; salvataggio tramite pkexec |
| Visual Traceroute | Percorso salto per salto su una mappa del mondo, geolocalizzazione live (ip-api.com), zoom e pan, esportazione CSV + TXT |
| MTR | My Traceroute integrato: perdita %, RTT Ultimo/Media/Migliore/Peggiore/Jitter per ogni salto, colorato, esportazione CSV + TXT |
| Firewall Viewer | Ruleset nftables + iptables/ip6tables in sola lettura (senza root); live tramite pkexec; filtro per tabella/catena/azione |
| Speed Test | Download/upload/ping tramite Cloudflare; nessuno strumento esterno oltre a curl; grafico storico (ultime 5 esecuzioni) |
| Larghezza di banda | Throughput in tempo reale per interfaccia: grafico scorrevole di 60 secondi, velocità live, totali di sessione, picco |
| Wake on LAN | Magic packet in puro Python (broadcast UDP), rubrica host persistente, nessuno strumento esterno richiesto |
| Topology Map | Rileva automaticamente i dispositivi LAN tramite nmap -sn; grafico interattivo con nodi trascinabili, zoom/pan, pannello dei dettagli |
| Impostazioni | Selezione lingua (FR / EN / ES / DE / IT / PT / JA / ZH), persistente; riavvio richiesto dopo la modifica |
| Riquadro comandi | Sovrapposizione Ctrl+P: ricerca fuzzy su tutti i 29 moduli per nome o parola chiave |
| Trasferimento file | Server TFTP o HTTP on-demand; porta e directory root configurabili; IP locali come pulsanti di copia; tabella log live (nome file, IP client, direzione ↑/↓, dimensione); elenco directory HTTP + GET/POST/PUT; TFTP GET + PUT; la porta 69 richiede pkexec |
| Esportazione | File → Export Network Report (JSON/Markdown/Text/PDF); esportazione per modulo su Interfacce, DNS, Firewall, SSH, Connessioni |
| Strumento | Funzionalità | Linux | macOS |
|---|
xfreerdp / xfreerdp3 | Desktop remoto (RDP) | Arch: freerdp · Ubuntu ≤24.04: freerdp2-x11 · Ubuntu 26.04+: freerdp3-x11 | facoltativo — ripiega su Microsoft Remote Desktop (open rdp://) |
vncviewer | VNC | Arch: tigervnc · Debian: tigervnc-viewer | facoltativo — ripiega su Condivisione schermo di macOS (open vnc://, integrato) |
nm-connection-editor | Modifica le connessioni da Connection Manager | Arch: nm-connection-editor | — (si apre invece Preferenze di Sistema) |
traceroute | Alternativa a traceroute (per impostazione predefinita viene usato tracepath) | Arch: traceroute | integrato |
mount.cifs (cifs-utils) | Monta le condivisioni SMB dal menu contestuale | Arch/Debian: cifs-utils | integrato (mount_smbfs) |
iperf3 | Speed Test — scheda LAN | Arch: iperf3 · Debian/Ubuntu: iperf3 | brew install iperf3 |