Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[SAUVEGARDE] Un script pour l'automatiser en PERL !
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
charlax
n00b
n00b


Joined: 14 Apr 2003
Posts: 64
Location: Nantes

PostPosted: Fri May 07, 2004 10:52 pm    Post subject: [SAUVEGARDE] Un script pour l'automatiser en PERL ! Reply with quote

N'ayant pas trouvé de script assez simple pour faire une sauvegarde, j'en ai fait un moi même.

Code:

#!/usr/bin/perl

# Script de sauvegarde assez simple pour système GNU/Linux
# Copyright (C) 2004 Charles-Axel DEIN <ca.dein@wanadoo.fr>

#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
#as published by the Free Software Foundation; either version 2
#of the License, or (at your option) any later version.

#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#GNU General Public License for more details.

#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

use Date::Manip;

# Ce script sauvegardera :
#    - votre base de données MySQL,
#    - les dossiers que vous renseignerez,
#    - les logiciels installés si vous avez une Gentoo.

# N'oubliez pas de renseigner les variables, sinon il risquerait de faire des bêtises ;-)
# N'hésitez pas à m'écrire pour me proposer des modifications.
# C'est mon premier "vrai" projet, et c'est mon premier "vrai" script en Perl.
# Aux autres, je vous conseille de vous lancer dans Perl. C'est un vrai plaisir. Ce langage va droit à l'essentiel.

# Version du 08/05/2004

init();
   #####################
   #      Configuration      #
   #####################

# Si vous ne renseignez pas ces variables, le programme pourrait supprimer des fichiers auxquels vous tenez !

# 1. Aide
 
# a. Variables prédéfinies :
# Pour être plus efficace, ce programme reconnaît certains paramètres.
 
# _Exemple_
# Au lieu de mettre :
# $repertoire = "/home/ca/bateau";
# Mettez :
# $repertoire = "$home/bateau";

# C'est beaucoup plus rapide, plus lisible, et cela vous permet de faire
# plusieurs sauvegardes sous plusieurs comptes.

# - $user correspond à votre nom d'utilisateur.
# - $home correspond à votre repertoire utilisateur.
# - $iso correspond à l'emplacement de l'image iso

# b. Variables booléennes (marquées par B)
# Ces valeurs prennent pour valeurs VRAI ou FAUX.

# c. Montage de l'image
# Si vous souhaitez seulement monter l'image iso, entrez ceci dans un Terminal:
# mount -r $iso /mnt/iso -t iso9660 -o loop=/dev/loop0

# d. Dépendances
# Date::Manip est utilisé. Normalement il devrait être sur votre distrib. Si vous avez une Gentoo, faîtes :
# emerge DateManip
# Le programme a besoin de mkisofs. Pour cela installez cdrtools :
# emerge cdrtools

# 2. Options importantes

# C'est dans ce dossier que seront copiés tous les fichiers. ATTENTION : son contenu sera entièrement supprimé.
$racine = "$home/sauvegarde";

# Entrez ici les répertoires à sauvegarder séparés par une virgule.
# @repertoire = ("/sauv");
@repertoire = ("/etc", "/usr/local/bin/");

# Entrez ensuite - ou non - les noms des fichiers de sauvegarde de ces répertoires, dans le même ordre.
# Le script ajoutera au nom .tar.bz2
# S'il n'y a rien, les repertoires seront sauvegardés comme dans l'exemple :
# repertoire = "/home/ca"; nom du fichier = _home_ca.tar.bz2
# @repertoire_nom = ("");
@repertoire_nom = ("config", "mes_scripts");

# Le script formatera le cd dans le lecteur, puis le gravera. Très utile pour un serveur.
# $cd_auto = "VRAI";
$cd_auto = ""; # (B)

# 3. Options facultatives

# a. Fichier de log
# C'est dans ce fichier que seront écrites toutes les opérations du programme.
# Très utile en cas de problème.
$log = "$racine/sauvegarde.log";

# b. Graveur
# Valeur de l'option --dev= pour cdrecord. Inutile si vous n'utilisez pas cd_auto.
# Si vous ne connaissez pas cette valeur, veuillez faire pour la connaître :
# cdrecord -scanbus
$dev="0,0,0";
# Vitesse de gravure.
$speed="4";

# c. Autres méthodes
# Ajoutez ici la commande qui sera effectuée pour sauvegarder l'image Iso
$commande = "scp $iso ca\@192.168.0.2:/home/ca/serveur";

# d. Sauvegardes supplémentaires
# Voulez-vous sauvegarder votre base de données mysql ?
# $mysql = ""; # (B)
$mysql = "VRAI";
# Mettez - ou non - votre mot de passe mysql
$mysql_password="";

# Voulez-vous sauvegarder la liste des logiciels installés ?
# GENTOO SEULEMENT
$liste_logiciels="VRAI"; # (B)

# 4. En cas de problème SEULEMENT

sub prob
{
# Décommentez l'option et renseignez-la.
# Ne le faîtes pas sans en être sur !

# Si votre nom d'utilisateur est mal détecté :
# $user = "ca";

# Si votre repertoire utilisateur est mal détecté
# $home = "/home/$user";
}

   #####################
   # Fin de la configuration #
   #####################

# Classes
{ package Dir;
  sub new
  {
     # Création de l'objet répertoire
     my $type = shift;
   my %params = @_;
   my $self = {};
   $self->{'empl'} = $params{'empl'};
   $self->{'nom'} = $params{'nom'}.".tar.bz2";
   $self->{'log'} = $params{'log'};
   $self->{'racine'} = $params{'racine'};
   bless $self, $type;
  }
  sub test
  {
     # Test du repertoire : Existe-il ? Peut-on y accéder ?
   my $self = shift;
   chdir("$self->{'empl'}") or ($self->{'code'} = $!);
   if ($self->{'code'} ne "")
   {
      $self->erreur();
   }
  }
  sub erreur
  {
     # En cas d'erreur ...
   my $self = shift;
   $log = $self->{'log'};
   open(LOG, ">> $log") or die "Impossible d'ouvrir le fichier de log $log : $!\n";
   # ... On le met dans le fichier de log
   print LOG "\n\nImpossible de sauvegarder le dossier ".$self->{'empl'}." sous le nom ".$self->{'nom'}." : ".$self->{'code'}."\n";
   close(LOG);
  }
  sub sauvegarde
  {
   my $self = shift;
   $empl = $self->{'empl'};
   $nom = $self->{'nom'};
   $racine = $self->{'racine'};
   $log = $self->{'log'};
   open(LOG, ">> $log") or die "Impossible d'ouvrir le fichier de log $log : $!\n";
   print LOG "\nSauvegarde du dossier ".$self->{'empl'}." sous le nom ".$self->{'nom'}."\n";
   close(LOG);
   # On sauvegarde en compressant le dossier
   system("tar cfj $racine/$nom $empl 2>> $log");
  }
}
1;

# Fonctions

sub init
{
   # Je veux le nom d'utilisateur !
   $user = getlogin || getpwuid($<);
   if ($user ne "root")
   {
      $home = "/home/".$user;
   }
   else
   {
      $home = "/root";
   }
   $iso="$home/sauv.iso";
   prob();
}

sub debut
{
   print "Script de sauvegarde\n";
   print "Le fichier de log est  : $log";
   
   # Si il n'a rien mis, il vaut mieux assurer
   die("ATTENTION : Vous n'avez rien mis pour repertoire racine ! Veuillez configurer le script !\n") if ($racine eq "");
   
   # On créé le dossier racine qui servira à copier les fichiers
   system("mkdir $racine 2> /dev/null");
   system("rm -R $racine/*");
   
   # Création et initialisation du fichier de log
   system("touch $log");
   system("echo \"\" \> $log");
   
   # Ouverture du fichier de log
   open(LOG, ">> $log") or die "Impossible d'ouvrir le fichier de log $log : $!\n";
   # On prend la date
   $date = localtime(time);
   # On la rend lisible par un être humain
   $date = &UnixDate($date,"%A %e %B \à %H\:%M\:%S");
   # On écrit cela dans le fichier de log
   print LOG "Démarrage du script le $date\n";
   # On copie le script pour l'avoir sous la main
   system("cp $0 $racine/script");
   # On ferme le fichier de log
   close(LOG);
   unless(chdir($racine))
   {
      erreur("Impossible d'utiliser le dossier $racine : $!");
   }
   # On supprime tout dans le dossier, et si il y a des problèmes ce sera affiché dans le fichier de log
}

# En cas de problème bloquant
sub erreur
{
   print "\nUne erreur a empéché le script de se terminer correctement.\nVeuillez lire le fichier $log pour plus de renseignements";
   open(LOG, ">> $log") or die "Impossible d'ouvrir le fichier de log $log : $!\n";
   print LOG $_[0]."\n";   
   close(LOG);
   # On quitte maintenant ;-)
   quit();
}
sub quit
{
   system("rm $racine/*.tar* 2>> $log");
   open(LOG, ">> $log") or die "Impossible d'ouvrir le fichier de log $log : $!\n";
   print LOG "\nSauvegarde terminée.\n";   
   close(LOG);
   print "\n";
   exit();
}

# Script

debut();

# Sauvegarde MySQL
if ($mysql eq "VRAI")
{
   print "\n\tSauvegarde de la base de données MySQL\n";
   # Rien ne vaut un petit dump ...
   $commande_mysql = "mysqldump -A -p$mysql_password > $racine/mysql";
   open(LOG, ">> $log") or die "Impossible d'ouvrir le fichier de log $log : $!\n";
   # Faudrait peut-être que l'utilisateur sache ce que l'on fait ...
   print LOG "\nSauvegarde de toutes les bases de données mysql avec la commande \"$commande_mysql\" sous le nom $racine/mysql\n";
   close(LOG);
   # On exécute
   system($commande_mysql);
}

# Sauvegarde de la liste des logiciels
if ($liste_logiciels eq "VRAI")
{
   print "\n\tSauvegarde de la liste des logiciels\n";
   $commande_liste = "cp /var/cache/edb/world $racine/world";
   open(LOG, ">> $log") or die "Impossible d'ouvrir le fichier de log $log : $!\n";   
   print LOG "\nSauvegarde de la liste des logiciels installés avec la commande \"$commande_liste\"sous le nom $racine/world.\n";
   close(LOG);
   system($commande_liste);
}

print "\n\tSauvegarde des répertoires en cours... ";

# # Pour chaque répertoires
# for ( $i = 0 ; $i < @repertoire ; $i++ )
# {
#         $repertoire = $repertoire[$i];
#         $repertoire_nom = $repertoire_nom[$i];
#         if ($repertoire_nom eq "")
#         {
#                 $repertoire_nom = $repertoire;
#                 $repertoire_nom =~ s/\//\_/g;
#         }
#         $repertoire_nom .= ".tar.bz2";
#    # On créé l'objet correspondant
#    $dir = Dir->new( 'empl' => $repertoire, 'nom' => $repertoire_nom, 'racine' => $racine, 'log' => $log);
#    # On teste son existence
#    $dir->test;
#    # Puis, le script sauvegarde !
#    $dir->sauvegarde;
# }
# print "fait.";
#
# # Création de l'image Iso
# print "\n\tCréation de l'image iso $iso ... ";
# # Voici la commande utilisée. De toute façon, ...
# $commande_iso = "mkisofs -R -o $iso $racine 2>> $log";
# open(LOG, ">> $log") or die "Impossible d'ouvrir le fichier de log $log : $!\n";   
# # ... elle est affichée dans le fichier de log
# print LOG "\nCréation de l'image iso $iso avec la commande $commande_iso\n";
# close(LOG);
# # On n'a pas besoin de l'ancienne :-(
# system("rm $iso 2> /dev/null");
# # Création de l'image
# system($commande_iso);
# print "fait.";
# if ($cd_auto eq "VRAI")
# {
#    print "Création du CD... ";
#    # Le CD sera automatiquement gravé
#    
#    # Effacement du CD-RW
#    $grav1 = "cdrecord -s --dev=$dev --blank=all &>> $log";
#    open(LOG, ">> $log") or die "Impossible d'ouvrir le fichier de log $log : $!\n";   
#    print LOG "\nEffacement du CDRW avec la commande $grav1\n";
#    close(LOG);
#    system($grav1);
#    
#    $grav2 = "cdrecord -s speed=$speed -multi dev=$dev $iso &>> $log";
#    open(LOG, ">> $log") or die "Impossible d'ouvrir le fichier de log $log : $!\n";   
#    print LOG "\nGravage de l'image $iso avec la commande $grav2\n";
#    close(LOG);
#    system($grav2);
#    print "fait.";
# }
# print "\n\n";
if ($commande ne "")
{
   print "Exécution de la commande... ";
   # Sinon on utilise la commande spécifiée.
   system("$commande");
}

# Et on quitte en revenant à la fonction
quit();


Je ne sais pas si ça vous intéresse ...
C'est bien ou pas ?
EDIT : Mis à jour

Cela vous semble utile ?
J'ai fais un autre script en speed pour un firewall sympa. Ca vous intéresse ?


Last edited by charlax on Sat May 08, 2004 1:18 am; edited 1 time in total
Back to top
View user's profile Send private message
charlax
n00b
n00b


Joined: 14 Apr 2003
Posts: 64
Location: Nantes

PostPosted: Fri May 07, 2004 11:06 pm    Post subject: Reply with quote

Je suis en train d'essayer sur un autre ordi.

Il y a deux trois trucs qui marchent pas.

je m'en occupe et je vous redonne la version finale ;-)

EDIT: Mis à jout
Back to top
View user's profile Send private message
yuk159
Veteran
Veteran


Joined: 18 Apr 2003
Posts: 1802
Location: noumea ,nouvelle-caledonie

PostPosted: Sun May 09, 2004 10:28 am    Post subject: Reply with quote

Merci je testerai ça :P
_________________
The box said: "Requires Windows 98/2000/XP/NT, or better."
So, I installed LINUX!
Instagram
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum