Repository navigation
EasySave - Release Note v3.0
Date de livraison : 26/02/2026
Plateforme cible : Windows 10 / 11
Framework : .NET 10.0
Interface graphique : Avalonia 11.3
Présentation
EasySave v3.0 apporte des fonctionnalités avancées d'exécution parallèle, de contrôle des travaux en temps réel et de supervision centralisée des logs. Cette version introduit un serveur de logs intégré avec visualisation via Grafana, la gestion des fichiers volumineux pour éviter la saturation réseau, et la notion d'extensions prioritaires permettant de garantir l'ordre de copie entre travaux parallèles.
Guide de démarrage
Prérequis
- Windows 10 / 11
- .NET 10.0 Runtime (télécharger ici)
- Docker Desktop (optionnel, pour le serveur de logs centralisé Grafana/Loki)
Lancement de l'interface graphique
Double-cliquez sur EasySaveInterface.exe ou lancez depuis un terminal :
EasySaveInterface.exe
Configuration
Le fichier de paramètres est situé dans :
%AppData%\EasySave\settings.json
Paramètres ajoutés en v3.0 :
| Paramètre | Description |
|---|---|
MaxLargeFileTransferSizeKb |
Seuil en Ko au-delà duquel un fichier est considéré « volumineux » (0 = désactivé) |
PriorityExtensions |
Liste des extensions copiées en priorité (ex : [".pdf", ".docx"]) |
LogMode |
Mode d'envoi des logs : local ou server |
LogServerUrl |
URL du serveur de logs centralisé (ex : http://localhost:9080) |
MachineName |
Nom de la machine ajouté dans chaque entrée de log |
UserName |
Nom de l'utilisateur ajouté dans chaque entrée de log |
Mode console (héritage v1.0 / v2.0)
Le mode console reste disponible via EasySave.exe.
Nouveautés
Exécution parallèle des travaux
- Les travaux de sauvegarde s'exécutent désormais simultanément grâce à
Task.WhenAlletTask.Run - Chaque travail tourne dans son propre thread, sans bloquer les autres
- La progression globale est calculée en temps réel à partir de la progression individuelle de chaque travail
Contrôle des travaux en temps réel (Pause / Stop / Resume)
- Chaque travail dispose d'un
JobControllerpermettant de le mettre en pause, de le reprendre ou de l'arrêter à tout moment - Contrôles disponibles par travail individuel et en mode global (tous les travaux en une action)
- Les boutons Pause / Stop / Resume sont visibles directement dans l'interface graphique sur les pages d'exécution
- La mise en pause utilise un
ManualResetEventSlim: le thread bloque proprement entre deux fichiers
Gestion des fichiers volumineux
- Nouveau paramètre
MaxLargeFileTransferSizeKb: au-dessus de ce seuil, un seul fichier volumineux peut être transféré à la fois sur le réseau - Mécanisme basé sur un
SemaphoreSlim(1,1)partagé entre tous les travaux parallèles - Configurable dans l'interface graphique (page Paramètres) et dans
settings.json - Valeur 0 = désactivé (aucune restriction)
Extensions prioritaires
- Nouveau paramètre
PriorityExtensions: les fichiers dont l'extension est dans cette liste sont copiés avant tous les autres fichiers - Synchronisation entre les travaux parallèles : aucun travail ne commence à copier ses fichiers normaux tant que tous les travaux n'ont pas terminé leurs fichiers prioritaires
- Mécanisme basé sur un
PriorityFileManageravecTaskCompletionSourceet compteur atomique - Garantit que les fichiers critiques (ex :
.pdf,.key) arrivent en premier quelle que soit la charge
Serveur de logs centralisé (EasySaveLogServer)
- Nouveau projet
EasySaveLogServer: API ASP.NET Core minimale exposant deux endpoints :POST /api/logs: réception des entrées de log depuis les clients EasySaveGET /api/health: vérification de l'état du serveur
- Les logs peuvent être envoyés au serveur en configurant
LogMode = serveretLogServerUrl - Le client utilise
HttpClientavec sérialisation JSON pour l'envoi asynchrone
Intégration Grafana / Loki
- Mise en place d'une stack de monitoring avec Docker :
- Promtail (port 9080) : collecte les logs écrits par EasySaveLogServer
- Loki (port 3100) : stockage et indexation des logs
- Grafana (port 3001) : visualisation et interrogation des logs en temps réel
- Les logs EasySave sont consultables via l'interface Grafana avec filtres par travail, machine et utilisateur
Chiffrement asynchrone amélioré (CryptoSoftManager)
CryptoSoftManager.EncryptAsyncremplace l'appel synchrone àProcessde la v2.0- Capture complète de la sortie stdout/stderr de CryptoSoft
- Lève une
CryptoSoftExceptionsi CryptoSoft retourne une erreur, avec propagation vers l'interface graphique - Utilisation d'un
SemaphoreSlimpour limiter les chiffrements simultanés
Traçabilité enrichie des logs
- Ajout des champs
MachineNameetUserNamedans chaque entrée de log (v3.0) - Ces valeurs sont configurables dans
settings.jsonet visibles dans Grafana
Architecture technique
Nouveaux composants
| Composant | Type | Description |
|---|---|---|
EasySaveLogServer |
Projet ASP.NET Core | Serveur de réception des logs centralisés |
JobController |
Model | Gestion pause / stop / resume par travail via ManualResetEventSlim |
LargeFileTransferManager |
Model | Sémaphore pour limiter les transferts simultanés de fichiers volumineux |
PriorityFileManager |
Model | Barrière de synchronisation inter-travaux pour les extensions prioritaires |
CryptoSoftManager |
Model (static) | Wrapper async pour CryptoSoft avec gestion d'erreurs |
CryptoSoftException |
Exception | Exception levée lors d'une erreur de chiffrement |
docker-compose.yml |
Infrastructure | Stack Promtail + Loki + Grafana |
Modifications des composants existants
| Composant | Modification |
|---|---|
IBackupStrategy |
Ajout des paramètres optionnels JobController, LargeFileTransferManager, PriorityFileManager dans Execute() |
FullBackupStrategy |
Intégration parallélisme prioritaire, contrôle pause/stop, verrou fichiers volumineux, chiffrement async |
DifferentialBackupStrategy |
Idem FullBackupStrategy + correction état merge précédent |
BackupJob |
Intégration JobController (propre à chaque travail), implémentation INotifyPropertyChanged pour la progression |
BackupManager |
Création LargeFileTransferManager et PriorityFileManager partagés entre les travaux, ExecuteJob rendu async |
AppSettings |
Ajout MaxLargeFileTransferSizeKb, PriorityExtensions, LogMode, LogServerUrl, MachineName, UserName |
LogEntry |
Ajout MachineName, UserName |
Logger |
Envoi HTTP asynchrone vers LogServerUrl si LogMode = server, ajout _logType, _logDir |
MainWindowViewModel |
Ajout commandes pause/stop/resume globales et par travail, progression globale, config seuil fichiers volumineux, config serveur logs |
Corrections de bugs
| Bug | Description | Correction |
|---|---|---|
| Barre de progression bloquée à 0% | _isError non réinitialisé au début de FullBackupStrategy.Execute() |
Ajout de _isError = false en début d'exécution |
| Chiffrement non protégé | Condition manquante !string.IsNullOrEmpty(_settings.CryptoSoftPath) dans FullBackupStrategy |
Condition ajoutée, alignement avec DifferentialBackupStrategy |
| Barre de progression inversée | Inversion Full/Differential dans le calcul de progression | Correction du calcul dans les deux stratégies |
DifferentialBackupStrategy en état de merge cassé |
Deux signatures Execute() coexistantes, fragments hors méthodes |
Réécriture propre avec fusion complète des deux branches |
Stockage des données
| Fichier | Emplacement |
|---|---|
| Configuration des travaux | %AppData%\EasySave\jobs.json |
| État en temps réel | %AppData%\EasySave\state.json |
| Logs journaliers | %AppData%\EasySave\DailyLog\YYYY-MM-DD.json (ou .xml) |
| Paramètres | %AppData%\EasySave\settings.json |
| Logs centralisés | Grafana : http://localhost:3001 (si Docker actif) |
Ports utilisés (stack Docker)
| Service | Port | Rôle |
|---|---|---|
| EasySaveLogServer | 9080 | Réception des logs HTTP |
| Loki | 3100 | Stockage des logs |
| Grafana | 3001 | Visualisation des logs |