#!/usr/bin/env perl # inspiré de use strict; use warnings; use POSIX qw(strftime); use Shell qw(mkdir rm cp rsync chmod); # répertoire à sauver, avec exactement un / final my $src_dir = $ARGV[0]; $src_dir =~ s@^(.*?)/*$@$1/@; # Construction du chemin du dossier de backup : deuxième argument, nom # d'hôte, nom du dossier sauvé avec tr@/@_@, date. my $bck_dir = $ARGV[1]; my $host = `hostname -s`; chomp $host; my $root_bck_dir = $src_dir; $root_bck_dir =~ tr@/@_@; $root_bck_dir =~ s@^_?(.*?)_?$@$1@; $root_bck_dir = join '/', $bck_dir, $host, $root_bck_dir; my $dst_dir = $root_bck_dir .'/'. strftime "%Y-%m-%dT%H:%M", localtime; # Les deux arguments sont bien là, et sont bien des dossiers ? (-d $src_dir) or die "$src_dir n'est pas un dossier, abandon"; (-d $bck_dir) or die "$bck_dir n'est pas un dossier, abandon"; mkdir "-p", "$root_bck_dir"; if ($? != 0) { die "$root_bck_dir ne semble pas accessible en écriture, abandon"; } # Le premier argument doit être un chemin absolu $src_dir =~ m@^/@ or die "$src_dir n'est pas un chemin absolu, abandon"; print "$src_dir vers $dst_dir\n"; # la dernière sauvegarde en date ; on suppose que les noms des backups # n'ont pas de retours à la lignes. /!\ doit être fait avant la # création de la trace my $lst_backup = `ls -1 "$root_bck_dir" | tail -1 `; chomp $lst_backup; # trace des backups en cours my $trace = $root_bck_dir."/trace"; (! -e $trace) or die "$trace existe, abandon"; open TRACE, ">", $trace or die "$!: $trace n'est pas accessible en écriture, abandon"; print TRACE strftime("%c", localtime); # La copie effective : une copie simple la première fois, pour les # fois suivantes un copie de la dernière sauvegarde (avec des liens # durs) puis un coup de rsync. print "debut:", strftime("%c", localtime), "\n"; if ($lst_backup eq "") { print "Premier lancement, copie simple de $src_dir vers $dst_dir\n"; mkdir "-p", $dst_dir; cp "-a", "$src_dir/.", "$dst_dir"; } else { print "Sauvegarde incrémentale de $src_dir vers\n$dst_dir\n"; print "à partir de la sauvegarde de $lst_backup\n"; mkdir "-p", $dst_dir; cp "-al", "$root_bck_dir/$lst_backup/.", $dst_dir; chmod "u+w", $dst_dir; rsync "--archive", "--one-file-system", "--exclude", "/donnees/publique/*", "--delete", $src_dir, $dst_dir; } chmod "a-w", $dst_dir; rm $trace; print "fin:", strftime("%c", localtime), "\n";