Scopo: Questa libreria fornisce un set di classi per configurare e utilizzare MySQL in .NET (Framework o .NET Core) con supporto nativo al tunneling SSH.
Target: Sviluppatori .NET che necessitano di connettersi a database MySQL remoti, spesso su hosting condivisi o VPS, dove un tunnel SSH è consigliato (o obbligatorio).
- Caratteristiche Principali
- Use Case & Benefici
- Installazione
- Esempio di Utilizzo
- Struttura dei File Principali
- Demo Rapida
- Contributi e Community
- Licenza
- Configurazione centralizzata: Carica e salva le credenziali (sia DB che SSH) da file XML tramite
GenericMySQLConfigurationNew. - SSH Tunneling on-demand: Attivazione automatica di un port forwarding locale, con gestione dei conflitti di porta.
- DAL MySQL semplice:
MySqlDaleMySqlDalAsyncforniscono metodi pronti all’uso per query, bulk copy, scalar e reader asincrono/sincrono. - Utility di sistema: Scoperta IP pubblico, IP locale in uscita, e analisi porte in uso su Windows (via
netstat). - Parser e helper: Conversione robusta e tipizzata di date e boolean, estrazione pattern, e log con
NLog. - Flessibile & modulare: Le classi sono pensate per essere estese o sovrascritte, facilitando l’adattamento a progetti specifici.
- Hosting condiviso: quando è possibile accedere a MySQL solo tramite SSH, la libreria crea il tunnel e reindirizza le connessioni MySQL in modo trasparente.
- Integrazione con applicazioni desktop: se la porta predefinita è occupata, è possibile segnalare all’utente e offrire azioni (es. kill processi).
- Monitoraggio e manutenzione database: script di manutenzione che necessitano di connettersi a più siti, caricando da un unico file
.configun elenco di siti/credenziali. - Multi-ambiente: passare velocemente da un database di test in locale a uno di produzione remoto (basta cambiare la
SelectedWebsite).
Pain point risolti:
- Configurazione SSH e gestione delle credenziali su più ambienti.
- Errore di porta già in uso (3306) e conseguente noiosa ricerca del processo che blocca la porta.
- Logica ripetitiva di connessione MySQL (aprire, chiudere, catturare errori, gestire time-out).
- Necessità di un approccio batch veloce (BulkCopy) in contesti ETL.
Vantaggi principali:
- Riduce la complessità nel gestire SSH da codice .NET.
- Semplifica la gestione delle connessioni e risparmia tempo in debug.
- Elevata trasparenza: la configurazione è in XML, facilmente versionabile e modificabile.
- Estendibilità: puoi personalizzare classi e metodi per scenari specifici.
La MySQLConfigurationAndSsh è una libreria .NET che semplifica la configurazione e la gestione di connessioni MySQL, con la possibilità di creare tunnel SSH in modo sicuro e trasparente. Il cuore del progetto è la gestione centralizzata delle impostazioni (host, porta, credenziali DB/SSH) e l’abilitazione automatica di un port forwarding SSH qualora necessario.
Ecco gli aspetti principali:
- Connessione MySQL semplificata: tramite classi come
MySqlConnectionAppConfigeWebsiteAppConfigBase, si definiscono in modo dichiarativo host, utente, password e database. - SSH Tunneling integrato: la classe
ConnectionHelperabilita il tunnel SSH quando serve, controlla se la porta MySQL (tipicamente 3306) è già in uso e, se necessario, gestisce anche la terminazione dei processi in conflitto. - Caricamento/Saving configurazioni: con
GenericMySQLConfigurationNewsi salvano e caricano le impostazioni da file XML (Sites.config), impostando un SelectedWebsite che determina le credenziali da usare. - Utility di rete e diagnostica: la libreria fornisce strumenti per individuare l’IP pubblico, l’IP locale usato in uscita e per analizzare porte in uso mediante
netstat(classiProcessPorteProcessPorts). - Data Access Layer (DAL):
MySqlDaleMySqlDalAsyncagevolano query, stored procedure, bulk copy e gestione asincrona di letture/scritture. - Parser generici: con
DateParserHelpereParsedUnparsed<T>è possibile estrarre e convertire in modo sicuro dati grezzi (es. stringhe da file/Excel) in tipi forti (DateTime, bool, ecc.), gestendo eventuali errori di parsing. - Integrazione UI:
UIHelpereTupleEventArgsoffrono eventi e metodi pensati per mostrare finestre di dialogo (WPF/WinForms) e chiedere all’utente l’eventuale kill di processi in conflitto.
Il codice è pensato per scenari reali in cui occorre connettersi a un database MySQL remoto (ad esempio hosting di siti WordPress) via SSH, garantendo sicurezza e semplicità.
-
Pacchetto NuGet (consigliato):
dotnet add package MySQLConfigurationAndSsh
(In futuro potrai sostituire con il link/nome reale del pacchetto NuGet.)
-
Clonare il repository e includere i file
.csnel tuo progetto.git clone https://github.com/tuoUtente/MySQLConfigurationAndSsh.git
-
Dependencies:
- .NET 6.0+ (o .NET Framework 4.6.1+)
- MySqlConnector (già referenziato nel progetto)
- Renci.SshNet per il tunnel SSH
- NLog per il logging (opzionale ma consigliato)
- Carica la configurazione da
Sites.config:// Istanzia la tua classe derivata, che implementa la logica personalizzata var myConfig = new MyDerivedMySQLConfiguration(); GenericMySQLConfigurationNew.Instance = myConfig; myConfig.LoadConfig(); // Imposta il sito desiderato myConfig.SelectedWebsiteName = "MioSitoWordPress";
- Avvia la connessione SSH (opzionale):
using MySQLConfigurationAndSsh; // Se la porta 3306 è già in uso, la libreria lo rileva // e può chiedere all'utente di killare il processo in conflitto ConnectionHelper.EnableSshIfPossible(3306);
- Esegui query MySQL:
var result = MySqlDal.ExecuteQuery( MySqlDal.ConnSitoWp, "SELECT * FROM wp_posts WHERE post_status='publish';" ); // Oppure asincrono // var reader = await MySqlDal.ExecuteReaderAsync(cmd);
- Chiudi la connessione:
// Di norma MySqlDal chiude la connessione internamente // dopo l’esecuzione di query. Tuttavia, // se usi un DataReader, ricordati di Dispose/Close manualmente.
MySqlConnectionAppConfig.cs: Configurazione di base per host, porta, user, password.GenericMySQLConfigurationNew.cs: Caricamento/salvataggio XML e gestione del sito selezionato.ConnectionHelper.cs: Creazione tunnel SSH, check porta 3306, IP utility.MySqlDal.cs/MySqlDalAsync.cs: Metodi di utilità per query, non-query, bulk copy, asincrone e sincrone.ProcessPorts.cseProcessPort.cs: Analisi porte occupate (via netstat) e identificazione processi.ParsedUnparsed.cseDateParserHelper.cs: Parser generici, estrazione date e conversione robusta di stringhe.UIHelper.cs: Interfacce di supporto con finestre di dialogo (MessageBox in WPF/WinForms).TupleEventArgs.cs: Helper per creareEventArgscontenenti tuple di parametri.
In questa gif dimostrativa (o screenshot) puoi vedere come l’app WPF rilevi la porta occupata, chieda all’utente di chiudere il processo e poi stabilisca la connessione SSH.
(Inserisci eventuale immagine o GIF se disponibile.)
Contribuire è benvenuto! Apri pure una issue per discutere miglioramenti, problemi o nuove idee. Per proporre modifiche, fai una pull request sulla branch dev con una breve descrizione del contributo.
- Linee guida:
- Preferibile formattare il codice con gli standard
.editorconfigdel progetto. - Scrivere test o esempi se aggiungi funzionalità importanti.
- Tenere la documentazione in Wiki aggiornata.
- Preferibile formattare il codice con gli standard
Se hai dubbi, apri una discussione nella sezione Discussions o contattaci su Slack/Discord (link da aggiungere).
Progetto rilasciato con Licenza MIT.
Puoi usarlo liberamente in progetti commerciali e non, con l’obbligo di mantenere i riferimenti alla licenza originale.
Ecco una panoramica molto sintetica dei cambiamenti nel tempo, con relative milestone:
- Novembre 2022
- Aggiunti i file iniziali di configurazione (
MySqlConnectionAppConfig,SshCredentials,WebsiteAppConfigBase) e la struttura base inGenericMySQLConfigurationNew.
- Aggiunti i file iniziali di configurazione (
- Dicembre 2022
- Implementata la logica di tunneling in
ConnectionHelper(forward su porta 3306, kill processi in conflitto), con eventoShowMessageBoxEvent.
- Implementata la logica di tunneling in
- Gennaio 2023
- Creato il DAL
MySqlDaleMySqlDalAsyncper semplificare query, BulkCopy, e operazioni sincrone/asincrone su MySQL.
- Creato il DAL
- Febbraio 2023
- Inseriti tool di parsing (
DateParserHelper,ParsedUnparsed<T>) per conversioni robuste e logging errori.
- Inseriti tool di parsing (
- Marzo 2023
- Sviluppate le classi
ProcessPorteProcessPortsche sfruttanonetstatper identificare PID e porte aperte.
- Sviluppate le classi
- Aprile 2023
- Aggiunti
TupleEventArgseUIHelperper la gestione di messaggi UI (MessageBox) e la reazione immediata agli eventi di conflitto di porta.
- Aggiunti
(Le date sono indicative e rappresentano una sintesi )