Sauvegarde logs
Un article de Linuxette.
Script pour sauver les fichiers logs de mes sites internet. La loi m'oblige à conserver ceux-ci pendant une durée de 1 an. N'ayant pas de disque dur prévu pour la sauvegarde, j'utilise Perl (voir aussi mongueurs ) pour faire une sauvegarde sur un espace ftp d'une de mes adresses 'officiels'
La base du script repose sur un appel du script par cron. Pour sauver une semaine de log, il faut garder 7 fichiers *.gz, celui de dimanche étant généré le lundi matin à 6h30, mon script peut être exécuté tous les lundi vers 7h. Voici ma ligne crontab:
Comme vous pourrez le voir, j'utilise un fichier de configuration dans /etc/sauvegarde-log/sauvegarde.conf
Celui ci a cette forme (exemple):
$ cat /etc/sauvegarde-log/sauvegarde.conf # Fichier de configuration pour le script # de sauvegarde des log. # la liste des répertoires ou sont les log est dans # sauvegarde.log # adresse du fichiers contenat la liste des repertoires à sauver [fichier] logs = /etc/sauvegarde-log/sauvegarde.logs # adresse pour le courrier de fin de sauvegarde [mail] adresse = <nom>@<tld> # Données pour la connexion ftp # adresse ftp [ftp] host = <adresse du serveur ftp> # nom d'utilisateur user = <nom duser sur le ftp> # mot de passe pass = <mot de passe du compte ftp> # repertoire de base pour la sauvegarde repertoire = <un nom pour un repertoire de base>
Le fichier contenant les répertoires à sauver:
$ cat /etc/sauvegarde-log/sauvegarde.logs /var/log/gdm/ /var/log/apt/ /var/log/exim4/ /var/log/
Et pour finir, le script:
#!/usr/bin/perl -w
# --------------------------------------------------------------
# sauvegarde des fichiers log du serveur à date régulière
# On utilise un fichier de conf pour la liste des fichiers à sauvegarder,
#
# et à la fin, on fait un mail de confirmation à l'admin
# --------------------------------------------------------------
# Paquets debian necessaires:
# - libmime-lite-perl
# - libnet-perl
# - libdate-calc-perl
# - libconfig-tiny-perl
# --------------------------------------------------------------
# Auteur: R. Suinot <remi@suinot.org>
# Date : 16 nov. 2008
# Rev. : 21 nov. 2008
# --------------------------------------------------------------
use strict;
use MIME::Lite;
use Net::FTP;
use Date::Calc qw(:all);
# fichier de configuration
my $CONF="/etc/sauvegarde-log/sauvegarde.conf";
# chargement du fichier de configuration
my $config = Config::Tiny->new();
$config = Config::Tiny->read($CONF);
# liste des fichiers à sauver:
my $LOGS = $config->{fichier}->{logs};
# adresse pour le courrier de fin de sauvegarde
my $ADRESSE = $config->{mail}->{adresse};
# Données pour la connexion ftp
my $HOST = $config->{ftp}->{host};
my $USER = $config->{ftp}->{user};
my $PASS = $config->{ftp}->{pass};
my $REPERTOIRE = $config->{ftp}->{repertoire};
my @liste; # liste de tous les repertoires
my $Semaine; # numéro de la semaine dans l'année
my @liste_gz; # contiendra la liste de tous les fichiers à sauvegarder
# --------------------------------------------------------------
# Chargement de la liste des fichiers
&CHARGE_LISTE();
# --------------------------------------------------------------
# quelle est le numero de la semaine?
$Semaine="Semaine_".&SEMAINE();
# --------------------------------------------------------------
# on envoi sur le serveur de free.fr
&FTPPUT();
# --------------------------------------------------------------
# Quand on a fini les transfert, on détruit les fichiers locaux
&DESTRUCTION();
# --------------------------------------------------------------
# Tout est fait? alors on envoi un email
&FIN();
exit 0;
# --------------------------------------------------------------
# Fonctions
sub CHARGE_LISTE() {
my $rep;
my @fichier;
# Appel du fichier conf donnant la liste des fichiers et rep a sauvegarder
open (FILE,$logs) || die " ouverture de $logs impossible \n $!";
@liste = <FILE> ;
close (FILE);
# ici, @liste contient le nom des repertoires, reste à trouver tous les fichiers!
foreach (@liste) {
$rep=$_;
chomp $rep;
# accès aux fichiers *gz* du répertoire
@fichier = <$rep*.gz>;
# affichages du nom des fichiers sélectionnés
foreach (@fichier) {
push @liste_gz, $_;
}
}
}
sub FTPPUT() {
my $ftp=Net::FTP->new($HOST, Timeout=>240, Debug => 0, Passive =>1 ) or die "Connexion impossible à $HOST! \n";
$ftp->login($USER,$PASS) or die "erreur de login? ", $ftp->message;
$ftp->type("I"); # passe en mode binaire
$ftp->cwd($REPERTOIRE) or die "probleme de repertoire? ", $ftp->message;
$ftp->mkdir($Semaine) or die "impossible de creer le repertoire ",$ftp->message;
$ftp->cwd($Semaine) or die "probleme de repertoire? ", $ftp->message;
foreach (@liste_gz){
print "$_\n";
$ftp->put($_) or die "probleme d'envoi de fichier", $ftp->message;
}
$ftp->quit;
}
sub SEMAINE() {
my $week;
my $time = time();
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time);
($week, $year) = Week_of_Year($year, $mon, $mday);
# le numero de la semaine est dans $week
if ( $week == 1 ){
# nous commençons une nouvelle année, nous reprenons le
# numéro de la semaine précédante
$time=time()-604800; # aujourd'hui - 7 jours
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($time);
($week, $year) = Week_of_Year($year, $mon, $mday);
} else {
$week--;
}
return ($week);
}
sub DESTRUCTION() {
# destruction des fichier de log en local
foreach (@liste_gz) {
unlink ($_);
}
}
sub FIN() {
# envoi un email de confirmation
my $msg = new MIME::Lite
From =>'root@suinot.org',
To =>$Adresse,
Subject =>'Sauvegarde des fichiers',
Type =>'TEXT',
Data =>"Efficace non ?\n @liste \n";
$msg -> send;
}

