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.

$stdout.sync = true
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.

begin
	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.

IO.read(ARGV[0] || "rackup_config.yaml")

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_folder = config["source"]
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.

# Tüm evet anlamına gelen ifadeler kullanılmıştır..
(["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.

source_files = nil
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.

Dir.chdir(source_folder)
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 :)

Share