man in the hill Veteran
Joined: 15 Dec 2005 Posts: 1552 Location: Madinina
|
Posted: Tue Sep 19, 2006 11:40 pm Post subject: [SCRIPT RUBY] save-expert-0.2_beta : Sauvegarde expert ! |
|
|
Bonjour ,
** Petit clin d'oeil à Loopx .
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
Code: |
/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 !
Code: | 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 :
Code: | chmod +x save-expert | ...
1.b.) Mettez le dans un répertoire du PATH ,
par ex : /usr/bin :
Code: | mv save-expert /usr/bin |
sinon placez vous dans le répertoire ou se trouve le script et lancé le avec cette commande :
ou
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 :
le fichier va être directement traité vers le ftp !
Faire un tarball d'un répertoire vers le ftp:
Code: | 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:
Code: | save-expert -o /chemin/du/répertoire |
1.e.) Le Code
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:
Code: | emerge -av rubygems |
Tapez gem --help pour voir les commandes.
gem s'occupe d'installer vos librairies ruby avec la commande:
Code: | gem install nom_de_la_lib |
_-_ Pour que save-expert fonctionne, il vous faut la lib highline !
Code: | 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
Enjoy ! _________________ Get Up and Go ! |
|