# [SCRIPT RUBY] save-expert-0.2_beta : Sauvegarde expert !

## man in the hill

Bonjour   :Very Happy: ,

** Petit clin d'oeil à Loopx  :Wink:  .

I.) Présentation

A.) Ce programme permet aux administrateurs de faire deux types de sauvegardes: 

A.1) Sauvegarder rapidement  tout vos fichiers et répertoires de configurations vers un serveur ftp ou juste faire un tarball de ces fichiers sur vôtre système . Tous ces fichiers et répertoires doivent être placé dans  le fichier .save-expert.list .

Exemple de fichiers et répertoires à sauvegarder

```

/etc/X11/xorg.conf 

/etc/vsftpd/ 

/etc/make.conf 

/etc/fstab 

/etc/group 

/etc/exports 

/etc/hosts 

/etc/lilo.conf 

/etc/mplayer.conf 

/etc/rc.conf 

/etc/resolv.conf 

/etc/ssh/ 

/etc/dhcp/dhcpd.conf 

/etc/bind/ 

/var/named/ 

/etc/openvpn/ 

/etc/rsyncd.conf 

/usr/src/linux/.config 

/boot/grub/ 

/etc/apache2/ 

/etc/firewall/ 

/etc/conf.d/ 

/usr/bin/startxgl
```

A.2) Faire une sauvegarde classique de l'arborescence d'un répertoire .

Ex: Vous voulez sauvegarder le répertoire /var vers vôtre ftp !

```
save-expert  -t  /var  --ftp
```

le fichier var.tar.bz2 va être créé dans le répertoire courant pour être sauver vers le ftp!

Afficher l'aide avec l'option --help . 

1.) Utilisation et installation

1.a.) Copier/Coller dans vôtre éditeur ensuite rendez le exécutable :

```
chmod +x save-expert
```

 ...

1.b.) Mettez le dans un répertoire du PATH , 

par ex : /usr/bin :

```
mv save-expert  /usr/bin
```

sinon placez vous dans le répertoire ou se trouve le script et lancé le avec cette commande :

```
./save-expert
```

ou

```
ruby  save-expert
```

1.c.) Si vous utilisez save-expert pour sauvegarder des fichiers de configurations particuliers alors au premier lancement save-expert va créé un fichier .save-expert.list dans /root ! Vous indiquerez dans ce fichier les répertoires et fichiers que vous voulez sauvegarder ( ne mettez pas de commentaires dans ce fichier pour l'instant, de ligne vide..) aussi le script  enregistrera le répertoire de sauvegarde du ftp, le nom du ftp, vôtre login ( pas le mot de passe !) dans le fichier /tmp/save-expert.info pour automatiser ces étapes .(vous effacez ce fichier pour réinitialiser le script...).

_-_  Vous pouvez utilisez le script pour faire des compressions classiques en .tar.bz2 en passant directement des options sur la ligne de commandes . Dans ce cas le fichier .save-expert.list ne serra pas créé et vous n'en aurez pas besoin !

1.d.) Consultez l'aide avec l'option --help pour tirer avantage de ce script .

Note Useful de quelques options: Éditez vôtre fichier .save-expert.list :

```
save-expert   -e
```

le fichier va être directement traité vers le ftp !

Faire un tarball d'un répertoire vers le ftp:

```
save-expert -t /chemin/du/répertoire  --ftp
```

Si vous êtes dans le même répertoire que celui que vous compressez, vous indiquez juste son nom .

Juste un tarball:

```
save-expert -o /chemin/du/répertoire
```

1.e.) Le Code

```

#!/usr/bin/ruby  -w 

###  Distributed under the terms of the GNU General Public License v2

#

###  Save-expert comes with ABSOLUTELY NO WARRANTY  !

#

###  Utilisation: save-expert -h pour afficher l'aide complète !

#

###  Author : Man in the Hill .

#

###  Mes respect à Mr Professor X .

# == Synopsis ==

#

# Sauvegarde des fichiers importants via ftp !

#

# == Usage ==

#

# Lancer save-expert -h pour afficher l'aide complète !

#

# == End ==

require   'ftools'

require   'highline'

require   'getoptlong'

require   'net/ftp'

require   'pstore'

require   'fileutils'

include    FileUtils

include    FileTest

$version = 'save-expert-0.2_beta'

$save_expert = 'save-expert'

$tmp = '/tmp'   

$work = '/tmp/save-expert'   

$save_expert_bz2 = 'save-expert.tar.bz2'

$expert_list = '.save-expert.list'

$expert_info = '/tmp/save-expert.info'

class  Iga 

   

   def   start()

            

            testfileinmyhome()

         

         if    $test_save_expert_list == true   

            emptyfile()

            compression()

            server("#{$tmp}","#{$save_expert_bz2}")

      

         elsif 

            createfile("#{$home}","#{$expert_list}")

         

         else

            puts "Une erreur est survenue !"

         

         end

   end

   

   

   

   def    compression()

      

         

         check("#{$work}")

         readfile()

         

         $tab_files.each do |$file|

            

            File::copy($file, "#{$work}")

         end   

         

         # Se placer dans le répertoire de travail pour compresser ...

         Dir::chdir("#{$tmp}")

      

         # Compression ...

         puts "\nCréation du tarball #{$save_expert_bz2} ...\n"

         system("tar -cjvf #{$save_expert_bz2}  #{$save_expert}")

         rm_rf("#{$work}")

         puts "\nLe tarball #{$save_expert_bz2} se trouve dans #{$tmp} ... [ OK ]\n\n"

      

   end

   

      

   def  server(path, paquet)

      

         # ...

         puts "\nSauvegarde vers le FTP ... [ OK ]\n\n"

         

         # Tester si un répertoire par défaut existe ...

         restoreallinformations()

         

         

      

      if   $repository != nil  and $ftp_name != nil and $ftp_login != nil 

         

         # Ouvrir la connexion ftp ...

         ftp = Net::FTP.new("#{$ftp_name}")

         

         # Demandez le mot de passe ...

         pass_ftp = HighLine::new()

         puts "\n*      *      *"

         pass = pass_ftp.ask("Entrez vôtre mot de passe, svp. :  \n") { 

         |q|  q.echo = false }

      

         # Rentrez le login et le mot de passe ...

         puts ftp.login("#{$ftp_login}", "#{pass}")

         puts ""

      

         # Se placer dans le répertoire de sauvegarde ...

         ftp.chdir("#{$repository}")

      

         # Transférez le fichier compressé de sauvegarde "save-speed.tar.bz2" ...

         ftp.put("#{path}/#{paquet}", "#{paquet}")

      

         # Vérifiez que le fichier est bien présent ..

         puts ""

         puts ftp.list

      

         # ...

         puts "\n\nLe fichier #{paquet} est sauvegardé dans le répertoire #{$repository} ... [ OK ]\n"

      

         # Quittez le serveur

         puts "\nQuittons le serveur ... [ OK ]\n\n"

         puts "Voulez-vous effacer le tarball #{paquet} se trouvant dans #{path} ? [Y/n]\n"

         cas_efface = $stdin::gets.chomp

         

            case cas_efface.downcase

               when  "y", "yes"

               

               puts "\nEffaçons le tarball #{path}/#{paquet} ... [ OK ]\n"

               rm_rf("#{path}/#{paquet}")

               puts "\n@ Bientôt\n\n"

               ftp.quit()

               exit

               when  "n", "no", "non"

               puts "\n@ Bientôt\n\n"

               ftp.quit()

               exit

            end

      

      else

      

         #  Demandez le répertoire de sauvegarde sur le serveur ftp ...

         puts "\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"

         puts "Entrez le nom du /répertoire de sauvegarde sur le serveur, svp.:"

         puts "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n"

         $rep = $stdin::gets.chomp

         storerepository()

         # Demandez le nom ou l'IP du serveur ...

         puts "\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"

         puts "Entrez le nom de vôtre serveur ftp ou son IP,svp.:"

         puts "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n"

         $nom_ftp = $stdin::gets.chomp

         storeftpname()

         # Demandez le login ...

         puts "\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"

         puts "Entrez vôtre login ftp, svp.:"

         puts "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n"

         $login = $stdin::gets.chomp

         storeftplogin()

         # Demandez le mot de passe ...

         pass_ftp = HighLine::new()

         puts "\n*      *      *"

         $pass = pass_ftp.ask("Entrez vôtre mot de passe, svp. :  \n") { 

         |q|  q.echo = false }

      

   

         # Ouvrir la connexion ftp ...

         ftp = Net::FTP.new("#{$nom_ftp}")

      

         # Rentrez le login et le mot de passe ...

         puts ftp.login("#{$login}", "#{$pass}")

         puts ""

      

         # Se placer dans le répertoire de sauvegarde ...

         ftp.chdir("#{$rep}")

      

         # Transférez le fichier compressé de sauvegarde "save-speed.tar.bz2" ...

         ftp.put("#{path}/#{paquet}", "#{paquet}")

      

         # Vérifiez que le fichier est bien présent ..

         puts ""

         puts ftp.list

      

         # ...

         puts "\n\nLe fichier #{paquet} est sauvegardé dans le répertoire #{$rep} ... [ OK ]\n"

      

         # Quittez le serveur

         puts "\nQuittons le serveur ... [ OK ]\n\n"

         puts "Voulez-vous effacer le tarball #{paquet} se trouvant dans #{path} ? [Y/n]\n"

         cas_efface = $stdin::gets.chomp

         

            case cas_efface.downcase

               when  "y", "yes"

               

               puts "\nEffaçons le tarball #{path}/#{paquet} ... [ OK ]\n"

               rm_rf("#{path}/#{paquet}")

               puts "\n@ Bientôt\n\n"

               ftp.quit()

               exit

               when  "n", "no", "non"

               puts "\n@ Bientôt\n\n"

               ftp.quit()

               exit

            end

      

         end   

   end

   

   

   

   def   restoreallinformations()

   

      

      store = PStore::new("#{$expert_info}")

      $repository = nil

      store.transaction {$repository = store["memorepo"]}

   

      store = PStore::new("#{$expert_info}")

      $ftp_name = nil

      store.transaction {$ftp_name = store["memoftp"]}

   

      store = PStore::new("#{$expert_info}")

      $ftp_login = nil

      store.transaction {$ftp_login = store["memolog"]}

   

   end

   

   

   

   ######### Début du stockage des infos #########                     

   #

   #

   

   def    storeftpname()

      

      $ftp_name = "#{$nom_ftp}"

      store = PStore::new("#{$expert_info}")

      store.transaction {

            store["memoftp"] = $ftp_name}

   end

   

   

   

   

   def   storeftplogin()

      

      $ftp_login = "#{$login}"

      store = PStore::new("#{$expert_info}")

      store.transaction { 

            store["memolog"] = $ftp_login}

   end

   

   

   

   

   def    storerepository()

      

      $repository = "#{$rep}"

      store = PStore::new("#{$expert_info}")

      store.transaction {

            store["memorepo"] = $repository}

   end

   

   #

   #

   ######### Fin du stockage des infos  #########                   

                             

   

   def erreur_fatal(message) 

      

      # Cette fonction détermine si le fichier .save-expert.list est mal configuré ...

      p message 

      puts "\nÉditer vôtre fichier correctement, svp ! Sans commentaire, sans ligne vide et avec des fichiers existant ! Merci .\n\n"

      exit

   end 

   

   def    emptyfile()

      

      #  Fichier vide ? 

      size = File::size("#{$home}/#{$expert_list}")

         if size == 0 

            puts "\nLe fichier #{$home}/#{$expert_list} n'est pas correctement configuré !\n\n"

            exit

         end

   end

   def   readfile()

      

      # Création d'un tableau vide ...

      $tab_files = []

      

      # Ouvrir le fichier et lire chaque ligne ...

      File::readlines("#{$home}/#{$expert_list}").each do |$line|

         

         # Tester si sur chaque ligne est ecri un fichier existant ...

         $file =  File::exists?($line.strip)

   

            if     $file == true

   

               puts "#{$line.strip}  ... EXIST ... [ OK ] "

               $tab_files << ($line.strip)

         

            else

               erreur_fatal "#{$line.strip}  ... N'EXISTE PAS !"

            end

      end

      

   end

   

   def    createfile(home, file)

      

      # Création du fichier caché ".save-expert.list" ...

      FileUtils::touch("#{home}/#{file}")

         puts "\nLe fichier #{home}/#{file} a été créé !\n"

         puts "\nAfficher l'aide --help pour connaître l'usage de ce fichier et du soft !\n\n"

      exit

   end   

   

   def   testfileinmyhome()

      

      # ...

      #$home = %x!env!::grep(/^HOME/).to_s.split('=')[1].chomp

      $home = "/root"

      # Test de l'existence du fichier ".save-expert.list" ...

      $test_save_expert_list = FileTest::exist?("#{$home}/#{$expert_list}")

   

   end

   

   def    check(directory)

      

      # Tester l'existence d'un repertoire ...

      exist = FileTest::exist?("#{directory}")

         

         if    exist == true 

      

            # Effacez  le répertoire existant !

            rm_rf("#{directory}")

         

         else 

            # Créer un répertoire de travail ...

            Dir::mkdir("#{directory}", 0777)

         end

   end

   def   tarball(rep_for_tar)

   

      # Cette fonction compresse un répertoire passé en argument sur la ligne de commande ...

      # Tester l'existence du répertoire ...

      rep_to_tar = FileTest::exist?("#{rep_for_tar}")

                  

         if      rep_to_tar == true

            

            # Connaître la taille du répertoire   ...         

            puts size = %x!du -hs "#{rep_for_tar}"!

            

            # Récupérez la racine du répertoire ...

            $rep_root = File::dirname("#{rep_for_tar}")

            

            # Récuperez le nom du répertoire ...

            $base = File::basename("#{rep_for_tar}")

            

            # Connaître le pth courant ...

            $path_courant = Dir::pwd

            puts "\nCréation du tarball #{$base}.tar.bz2 ...\n"

            

            # Compressez en tar.bz2

            system("tar -C #{$rep_root} -cjvf #{$base}.tar.bz2 #{$base}")

            puts "\nLe tarball #{$base}.tar.bz2 est dans #{$path_courant} ... [ OK ]\n\n"

         end

   end

end                           

                           

                              

                              

                              

                              

                              

                              

                              

                              

                              

                              

                              

                              #### Save-expert ####

      

      

         

         

         

         # Connaître l'uid de l'utilisateur ! 

         whoisit = Process::uid

      

         if    whoisit != 0

         puts "\nVous devez être le root pour utiliser ce script ! Merci !\n\n"

         exit

         end

         

         a = ARGV[0]

         b = ARGV[1]

         c = ARGV[2]

      

      

         if      a == "-t" and  b != 0 and  c == nil

            puts "\nVérifiez vos options ...\n\n"

            exit

         elsif

            a == "-t" and  b != 0 and c == "-o"

            puts "\nVérifiez vos options ...\n\n"

            exit

         elsif

            a == "-t" and b != 0 and c == "-e"

            puts "\nVérifiez vos options ...\n\n"

            exit

         elsif

            a == "-t" and b != 0 and c == "-c"

            puts "\nVérifiez vos options ...\n\n"

            exit

         elsif

            a == "-t" and b != 0 and c =="-l"

            puts "\nVérifiez vos options ...\n\n"

            exit

         elsif

            a == "-t" and b != 0 and c == "-h"

            puts "\nVérifiez vos options ...\n\n"

            exit

         elsif

            a == "-e" and  b != nil

            puts "\nVérifiez vos options ...\n\n"

            exit

         elsif

            a == "-l" and b != nil

            puts "\nVérifiez vos options ...\n\n"

            exit

         elsif

            a == "-c" and b != nil

            puts "\nVérifiez vos options ...\n\n"

            exit

         elsif

            a == "-o" and b != 0 and c != nil

            puts "\nVérifiez vos options ...\n\n"

            exit

         elsif

            a == "-h" and b != nil

            puts "\nVérifiez vos options ...\n\n"

            exit

         end

         

         # Création de l'objet "oboro_dono" de la classe shinobi "Iga" ...

         $oboro_dono = Iga::new()

      

         # What Time is it ?

         t= Time.now.asctime

         puts "\n#{t}\n\n"

         

         # ...

         puts "Author : Man in the Hill .(2006, Madinina).\n"

         puts "http://www.guidelinux.org\n"

         puts "\nAffichez l'aide complète avec l'option --help.\n"

         puts "\nThanks, Enjoy !\n\n"

         

          # Options ...

         opts = GetoptLong.new(

               ['--help', '-h', GetoptLong::NO_ARGUMENT  ],

               ['--expert-list-ftp', '-e', GetoptLong::NO_ARGUMENT],

               ['--list', '-l', GetoptLong::NO_ARGUMENT],

               ['--compress', '-c', GetoptLong::NO_ARGUMENT],

               ['--tarball', '-t', GetoptLong::REQUIRED_ARGUMENT],

               ['--ftp',  GetoptLong::NO_ARGUMENT],

               ['--one-tarball', '-o', GetoptLong::REQUIRED_ARGUMENT])

         

            

            opts.each do |opt, arg|

            

            

            case opt

         

               when '--help'

                  

                  puts "\n== Synopsis ==\n"

                  puts "\nPour l'administrateur qui veut sauvegardez ses fichiers importants via ftp !"

                  puts "Ce soft peut vous sauvegardez certains fichiers"

                  puts "et répertoires bien précis !"

                  puts "Lors de l'installation, un fichier "

                  puts ".save-expert.list serra crée dans /root."

                  puts "Indiquez dans ce fichiers tous les répertoires "

                  puts "et fichiers que vous souhaitez sauvegarder." 

                  puts "Ce script peut aussi vous faire "

                  puts "des sauvegardes classiques en .tar.bz2 de toutes une arborescence !"

                  puts "\n== Usage ==\n"

                  puts "\n1.) Vous désirez sauvegarder des fichiers "

                  puts "et répertoires particuliers (vos fichiers de configurations , par ex !)"

                  puts"Vous devez éditer le fichier .save-expert.list," 

                  puts "avec la liste des fichiers et répertoires à sauvegarder"

                  puts "Si vous sauvegardé vers un ftp, tous les paramètres "

                  puts "que vous allez rentrer lors d'une première sauvegarde,"

                  puts "serront enregistrés (répertoire de sauvegarde sur le ftp, nom du ftp, login)"

                  puts"sauf vôtre mot de passe,"

                  puts "ainsi vous n'aurez plus à les indiquer !"

                  puts "\n2.) Vous désirez sauvegarder n'importe quel répertoire"

                  puts "avec toutes son arborescence,"

                  puts "save-expert vous permet de le faire !"

                  puts "\nEx: Vous voulez compressez un répertoire et le mettre sur un ftp:"

                  puts "save-expert -t /chemin/répertoire  --ftp"

                  puts "\nPour juste un tarball qui serra sauvez dans le répertoire courant:"

                  puts "save-expert -o /chemin/répertoire"

                  puts "\n\nsave-expert [OPTIONS]\n"

                  puts "\n--help, -h:"

                  puts "\nAffichez l'aide .\n"

                  puts "\n--expert-list-ftp, -e:\n"

                  puts "\nPermet la sauvegarde de tout ce qui est indiqué dans le fichier"

                  puts ".save-expert.list vers le ftp."

                  puts "\nEx: save-expert -e"

                  puts "\n--list, -l:"

                  puts "\nPermet de lister le fichier .save-expert.list"

                  puts "et de vérifier si les fichiers ou répertoires exist sur le système !"

                  puts "\nEx: save-expert  -l\n"

                  puts "\n--compress, -c:"

                  puts "\nPermet de faire seulement une compression des fichiers et répertoires"

                  puts "indiqués dans le fichier save-expert.list."

                  puts "Ce fichier compressé se trouvera dans /tmp"

                  puts "sous le nom de save-expert.tar.bz2\n"

                  puts "\n--tarball, -t:\n"

                  puts "\nEn relation avec la section 2.), doit être utilisé avec l'option --ftp ."

                  puts "permet de faire une sauvegarde d'une arborescence vers le ftp."

                  puts "\nEx: save-expert -t /home --ftp" 

                  puts "Vôtre home va être compressé dans le répertoire courant sous le nom de home.tar.bz2 ."

                  puts "\n--ftp:\n"

                  puts "\nUtilisez uniquement avec l'option --tarball pour sauvegarder vers le ftp ."

                  puts "\n--one-tarball:\n"

                  puts "\nPermet de faire simplement un tarball dans le répertoire courant en .tar.bz2 ."

                  puts "\nEffacez le fichier save-expert.info pour réinitialiser le script ."

                  puts "\n== Vérification des dépendances ==\n"

                  puts "\nVous devez avoir ruby d'installé ..."

                  puts "Avec vôtre gestionnaire de paquets, installé rubygems "

                  puts "et tapez gem --help pour voir les commandes."

                  puts "gem s'occupe d'installer et mettre à jour vos librairies ruby"

                  puts "avec la commande gem install nom_de_la_lib."

                  puts "Pour que save-expert fonctionne, il vous faut la lib highline !"

                  puts "\ngem install highline\n\n"

                  puts "%%%%                                                               %%%\n"

                  puts "\nSi vous avez des questions, des propositions ou vous trouvez des bugs ,"

                  puts "contactez-moi via ce site http://www.guidelinux.org\n\n"

                  puts "Forum RUBY géré par Professor X :\n"

                  puts "http://www.forum.moteurprog.com/forum.php?PAGE=1&ID_Forum=21\n\n"

                  puts "Le site de référence RUBY:\n"

                  puts "http://www.ruby-lang.org/en/\n\n"

                  puts "Ce script a été écri avec Gentoo Gnu/Linux\n"

                  puts "Le forum français:\n"

                  puts "http://forums.gentoo.org/viewforum-f-35.html?sid=85dae63007dbfee5dd89d38bc63daef2\n\n"

                  puts "== Fin ==\n\n"

               exit

         

               

               when  '--one-tarball'

         

                  $one_tar = arg

                     

                     $oboro_dono::tarball("#{$one_tar}")

                     exit

                     

               

               when  '--tarball'

                  $tar = arg

               

               

               when '--expert-list-ftp'

                  

                        $oboro_dono::start()

                  

                  

               when  '--ftp'

                  

                  $tar_ftp   = $tar

                     

                     $oboro_dono::tarball("#{$tar_ftp}")

                     $oboro_dono::server("#{$path_courant}", "#{$base}.tar.bz2")

               

               

               when  '--list'

                  

                  

                        $oboro_dono::testfileinmyhome()

                     if    $test_save_expert_list == true

                        

                        $oboro_dono::emptyfile()

                        $oboro_dono::readfile()

                        $tab_files.clear

                        puts ""

                        exit

                     

                     elsif

                        

                        $oboro_dono::createfile("#{$home}", "#{$expert_list}")

                        

                     else 

                        puts "Une erreur est survenue !"

                        exit

                     end

               

               

               when '--compress'

                  

                        $oboro_dono::testfileinmyhome()

                        

                     if    $test_save_expert_list == true

                        

                        $oboro_dono::emptyfile()

                        $oboro_dono::compression()

                        exit

                     elsif

         

                        $oboro_dono::createfile("#{$home}", "#{$expert_list}")

                     

                     else 

                        puts "Une erreur est survenue !"

                        exit

                     end

                  

            end

      

         end

      

      

      $oboro_dono::start()

   

exit   1
```

1.g.) Vérification des dépendances

_-_ Vous devez avoir ruby d'installé ...

Avec vôtre gestionnaire de paquets, installé rubygems:

```
emerge -av rubygems
```

Tapez gem --help pour voir les commandes.

gem s'occupe d'installer vos librairies ruby avec la commande:

```
gem install nom_de_la_lib
```

_-_ Pour que save-expert fonctionne, il vous faut la lib highline !

```
gem install highline
```

_-_ Une introduction à gem

http://rubyfr.pro1.typhon.org/rubyfr.org/hiki.cgi?Introduction++RubyGems

1.h.) TODO

_-_ Permettre une sauvegarde sur un cd 

_-_ Il y a du boulot  :Very Happy: 

Enjoy !

----------

