Sauvegarde logs

Un article de Linuxette.

Jump to: navigation, search


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;
   }