Skip to content

V3.0

Latest

Choose a tag to compare

@Binzfr Binzfr released this 26 Feb 20:45
· 2 commits to main since this release
8673d0f

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.WhenAll et Task.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 JobController permettant 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 PriorityFileManager avec TaskCompletionSource et 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 EasySave
    • GET /api/health : vérification de l'état du serveur
  • Les logs peuvent être envoyés au serveur en configurant LogMode = server et LogServerUrl
  • Le client utilise HttpClient avec 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.EncryptAsync remplace l'appel synchrone à Process de la v2.0
  • Capture complète de la sortie stdout/stderr de CryptoSoft
  • Lève une CryptoSoftException si CryptoSoft retourne une erreur, avec propagation vers l'interface graphique
  • Utilisation d'un SemaphoreSlim pour limiter les chiffrements simultanés

Traçabilité enrichie des logs

  • Ajout des champs MachineName et UserName dans chaque entrée de log (v3.0)
  • Ces valeurs sont configurables dans settings.json et 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