Ruby Yedekleme Sistemi Detayları
Merhabalar arkadaşlar,
Bir önceki yazımda Ruby ile gerçekleştirdiğim yedekleme sisteminden bahsetmiş ve tanımlarının nasıl yapılması gerektiğini anlatmıştım. Bu yazımda ise kod bloğunu sizlerle paylaşarak bazı ipuçları vermek istiyorum. Böylece eğer isterseniz, uygulamayı kendinize göre değiştirmeniz daha kolay hale gelecektir.
Diğer tüm yazılarımda olduğu gibi hemen konumuza geçelim. Rackup.rb dosyasını parça parça işleyeceğiz.
require 'yaml'
begin
require "zip/zip"
rescue Exception => err
puts "Error: You should execute 'gem install rubyzip --include-dependencies' command, before run this program.."
puts err.message
exit
end
Bu bölümde, eğer 'rubyzip' kütüphanesi yok ise, oluşan hata program tarafından yakalanır ve kullanıcıya sorunu nasıl giderebileceği belirtilir.
config = YAML::load(IO.read(ARGV[0] || "rackup_config.yaml"))
rescue Exception => err
puts "Error: Configuration file can not be found.."
puts err.message
exit
end
Bu bölümde ayar dosyası disk üzerinden okunmaya çalışılır.
ARGV[0]: Gelen ilk parametre anlamındadır.
Eğer gelen bir parametre var ise onu, eğer gelen herhangi bir parametre yok ise "rackup_config.yaml"yi yani standart ayar dosyasını kullanmasını söyler.
source_include_sub_folders = (["true", "yes", "evet", "yeah", "y", "e", "1"].include?(config["include_subfolders"].to_s) ? true : false)
source_file_extension = config["file_extension"] || "*"
target_folder = config["target"]
target_prefix = config["prefix"]
target_postfix = config["postfix"]
bu bölümde ise 'yaml' içersinden yedekleme işlemi ile ilgili bilgiler okunur.
(["true", "yes", "evet", "yeah", "y", "e", "1"].include?(config["include_subfolders"].to_s) ? true : false)
config["include_subfolders"] bilgisine "true", "yes", "evet", "yeah", "y", "e", "1" bilgilerinden herhangi birinin yazılsının 'true' olacağını ifade eder.
if source_file_extension.include?(",")
source_files = File.join("**", "*.{#{source_file_extension}}")
else
source_files = File.join("**", "*.#{source_file_extension}")
end
puts "Source dir is #{source_folder}"
puts "Target dir is #{target_folder}"
puts "File type is #{source_files.to_s}"
if File.directory?(source_folder) == false || File.directory?(target_folder) == false
puts "Error: Source or target folder can not be found..!"
exit
end
Bu bölümde ise birden fazla dosya uzantısı (file_extension) tanımlandı ise farklı bir takım işlemler yapar. Hedef ve kaynak dizin ile dosya uzantılarını ekrana yazar. Hedef ve kaynak dizinlerin varlığını kontrol eder.
zipFileName = target_folder + "\\" + target_prefix + Time.now.strftime("%Y%m%d-%H%M") + target_postfix + ".zip"
puts "#{zipFileName} is creating..."
begin
Zip::ZipOutputStream::open(zipFileName) do |zipfile|
Dir.glob(source_files) do |fileName|
fullFileName = source_folder + "\\" + fileName.gsub('/','\\')
next if FileTest.directory?(fullFileName)
File.open(fullFileName, "rb") do |file|
file.binmode
zipfile.put_next_entry(fileName, Zlib::BEST_SPEED)
zipfile.write(file.read)
end
end
end
rescue Exception => err
puts "Error : #{err.message}"
puts err.backtrace.join('\n')
begin
File.delete(zipFileName)
rescue
end
else
puts "operation completed."
end
Bu bölümde ise gerçek işlemin yapıldığı bölümdür :)
Kolay gelsin :)
