Skip to content

Consignes détaillées (READ ME Prof)

Julie BENED edited this page Nov 11, 2024 · 1 revision

Contexte

Le projet consiste à construire une solution de sauvegarde incrémentale d'un répertoire source (le répertoire à sauvegarder) vers un répertoire cible (le répertoire de sauvegarde). Il s'agit de développer un programme en langage C pour créer un outil de sauvegarde inspiré de Borg Backup, avec un accent sur la déduplication des données et la possibilité de réaliser des sauvegardes sur un serveur distant via des sockets.

Architecture

Le projet comprend quatres modules :

  • file_handler : Gère les opérations de fichier telles que la lecture, l'écriture et la liste des fichiers dans un répertoire de même que les répertoires
  • deduplication : Lors de la sauvegarde,implémente la lecture des fichiers en chunks, calcule leur MD5, et compare ces sommes pour identifier les bloc de données doublons
  • backup_manager : Implémente la logique de gestion de sauvegarde incrémentale
  • network : Implémente les fonctionnalités de communication réseau en permettant l'envoi de données à un serveur distant et la réception de données à partir d'un port spécifié. Les sockets TCP sont implémentés pour établir des connexions entre le client et le serveur
projet_lp25/
│
├── src/
│   ├── main.c
│   ├── file_handler.c
│   ├── file_handler.h
│   ├── deduplication.c
│   ├── deduplication.h
│   ├── backup_manager.c
│   ├── backup_manager.h
│   ├── network.c
│   └── network.h
├── Makefile
└── README.md

Options du programme

Le programme dispose de plusieurs options :

  • --backup : crée une nouvelle sauvegarde du répertoire source, localement ou sur le serveur distant. Ne s'utilise pas avec les options --restore et --list-backups
  • --restore : restaure une sauvegarde à partir du chemin, localement ou depuis le serveur. Ne s'utilise pas avec les options --backup et --list-backups
  • --list-backups : liste toutes les sauvegardes existantes, localement ou sur le serveur. Ne s'utilise pas avec les options --restore et --backup
  • --dry-run : test une sauvegarde ou une restauration sans effectuer de réelles copies
  • --d-server : spécifie l'adresse IP du serveur à utiliser comme destination
  • --d-port : spécifie le port du serveur de destination
  • --s-server : spécifie l'adresse IP du serveur à utiliser comme source
  • --s-port : spécifie le port du serveur source
  • --dest : spécifie le chemin de destination de la sauvegarde ou de la restauration
  • --source : spécifie le chemin source de la sauvegarde ou de la restauration
  • --verbose ou v : affiche plus d'informations sur l'exécution du programme

L'option --backup

backup commence par effectuer une copie complète de la dernière sauvegarde, par liens durs, avec la date et l'heure actuelles comme nom, sous le format "YYYY-MM-DD-hh:mm:ss.sss" où :

  • YYYY est l'année sur 4 chiffres
  • MM est le mois, entre 01 et 12
  • DD est le jour, entre 01 et 31
  • hh est l'heure, entre 00 et 23
  • mm sont les minutes, entre 00 et 59
  • ss.sss sont les secondes et les millisecondes, entre 00.000 et 59.999

S'il n'existe pas de sauvegarde précédente (i.e. c'est la première sauvegarde), le programme crée simplement un répertoire avec ce nom.

Cette première étape a donc pour effet que la sauvegarde de la source /path/to/source dans /path/to/destination sera en réalité située dans le répertoire /path/to/destination/YYYY-MM-DD-hh:mm:ss.sss où les champs du dernier répertoire sont remplacés par la date et l'heure réelles.

Le programme fait ensuite la sauvegarde en suivant les règles ci-dessous :

  • un dossier dans la source est créé quand il n'existe pas dans la destination
  • un dossier dans la destination est supprimé quand il n'existe pas dans la source
  • un fichier dans la source, mais pas dans la destination, est copié dans la destination
  • un fichier dans la source et dans la destination est copié si :
    • la date de modification est postérieure dans la source et le contenu est différent
    • la taille est différente et le contenu est différent
  • un fichier de la destination est supprimé s'il n'existe plus dans la source

L'option --restore

L'option --restore permet de restaurer une sauvegarde à partir d'un chemin spécifié, que ce soit localement ou depuis un serveur distant. La restauration peut être effectuée en utilisant les informations sur la sauvegarde disponible dans le répertoire de destination ou à travers une connexion réseau.

  1. Le programme vérifie si le chemin de la sauvegarde spécifié existe et est accessible. Si le chemin est sur un serveur, il établit une connexion via les sockets.
  2. Les fichiers de la sauvegarde sont extraits et copiés dans le répertoire de destination spécifié, ou dans le répertoire par défaut si aucune destination n'est fournie.
  3. Si un fichier restauré existe déjà dans la destination, le programme effectue les vérifications suivantes avant de remplacer le fichier :
    • Si la date de modification du fichier source est postérieure à celle du fichier de destination, il est remplacé.
    • Si la taille des fichiers diffère, le fichier de destination est également remplacé.
  4. Le programme notifie l'utilisateur du succès ou des échecs de chaque opération de restauration. Si l'option --verbose est activée, il affiche des messages détaillés.

L'option --list-backups

L'option --list-backups permet d'afficher toutes les sauvegardes existantes, que ce soit localement ou sur un serveur distant. Cette fonctionnalité est utile pour que l'utilisateur puisse voir toutes les sauvegardes disponibles et décider laquelle restaurer.

  1. Le programme vérifie si l'option --s-server serveur a été fournie. Si oui, il établit une connexion avec le serveur spécifié pour récupérer la liste des sauvegardes.
  2. Si aucune adresse de serveur n'est fournie, le programme listera toutes les sauvegardes disponibles dans le répertoire par défaut (ou spécifié par l'utilisateur).
  3. Chaque sauvegarde est affichée avec des détails, tels que le nom de la sauvegarde, la date de création, et la taille.
  4. Si l'option --verbose est activée, des informations supplémentaires peuvent être affichées, comme le chemin complet des fichiers de sauvegarde ou des informations sur la connexion réseau.

Points notables

  • copie avec sendfile
  • suppression avec unlink
  • copie par lien dur avec link
  • date : combinaison de gettimeofday avec localtime et strftime